淺析System.Console.WriteLine()

淺析System.Console.WriteLine()編程

    Writeline()函數的功能向 StreamWriter寫入指定字符串和一行字符,共有19個重載,其與Write()函數的主要區別在於它輸出字符串後換行,而Write()不換行。如今,經過WriteLine()的通用版本(即WriteLine(string format,object arg0,object arg1,object arg2,object arg3,__arglist))來深刻理解其實現細節。異步

    首先,咱們來看一下源代碼:ide

[CLSCompliant(false), HostProtection(SecurityAction.LinkDemand, UI=true)函數

public static void WriteLine(string format, object arg0, object arg1, object arg2, object arg3, __arglist)學習

{this

    ArgIterator iterator = new ArgIterator(__arglist);spa

    int num = iterator.GetRemainingCount() + 4;  //參數個數orm

    object[] arg = new object[num];    //參數集合對象

    arg[0] = arg0;繼承

    arg[1] = arg1;

    arg[2] = arg2;

    arg[3] = arg3;

    for (int i = 4; i < num; i++)

    {

        arg[i] = TypedReference.ToObject(iterator.GetNextArg());

    }

    Out.WriteLine(format, arg);  

}

看函數簽名可知,WriteLine()是一個靜態的無返回值的有可變參數的函數。並經過TextWrite的一個靜態對象(Out)的方法(Out.WriteLine())輸出字符串。

(注:TextWrite是一個抽象類,沒法實例化,因此Out其實是StreamWrite類的一個實例的引用)

 

[__DynamicallyInvokable]

public virtual void WriteLine(string format, params object[] arg)

{

    this.WriteLine(string.Format(this.FormatProvider, format, arg));

}

 代碼很簡短,就是調用同一個對象的WriteLine() 的另外一個重載,並使用String類的一個方法用參數替換字符串中相應的佔位符,獲得要輸出的完整的字符串。

 

[__DynamicallyInvokable]

public virtual void WriteLine(string value)

{

    if (value == null)

    {

        this.WriteLine();

    }

    else

    {

        int length = value.Length;

        int num2 = this.CoreNewLine.Length;  //CoreNewLine默認值爲"\r\n"

        char[] destination = new char[length + num2];  //包含換行符的字符串(目的字符串)

        value.CopyTo(0, destination, 0, length);

        switch (num2)  //肯定CoreNewLine的值是 "\n"(num2==1) 仍是 "\r\n"(num2==2)

        {

            case 2:

                destination[length] = this.CoreNewLine[0];

                destination[length + 1] = this.CoreNewLine[1];

                break;

 

            case 1:

                destination[length] = this.CoreNewLine[0];

                break;

 

            default:

                Buffer.InternalBlockCopy(this.CoreNewLine, 0, destination, length * 2, num2 * 2);

                break;

        }

        this.Write(destination, 0, length + num2);

    }

}

處理換行符並添加到字符串中,用Write()的一個重載輸出。

 

 

[__DynamicallyInvokable]

public virtual void Write(char[] buffer, int index, int count)

{

    if (buffer == null)

    {

        throw new ArgumentNullException("buffer", Environment.GetResourceString("ArgumentNull_Buffer"));

    }

    if (index < 0)

    {

        throw new ArgumentOutOfRangeException("index", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));

    }

    if (count < 0)

    {

        throw new ArgumentOutOfRangeException("count", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));

    }

    if ((buffer.Length - index) < count)

    {

        throw new ArgumentException(Environment.GetResourceString("Argument_InvalidOffLen"));

    }

    for (int i = 0; i < count; i++)

    {

        this.Write(buffer[index + i]);

    }

}

 

從第一個字符開始檢查字符串是否有異常,只有徹底沒異常後才調用Write()將最終的字符串輸出(一個字符一個字符的輸出)。

 

[__DynamicallyInvokable]
public override void Write(char value)
{
    this.CheckAsyncTaskInProgress();  //異步操做
    if (this.charPos == this.charLen)
    {
        this.Flush(false, false);
    }
    this.charBuffer[this.charPos] = value;
    this.charPos++;
    if (this.autoFlush)
    {
        this.Flush(true, false);
    }
}
注:TextWriter 類並無實現此方法,Out對象調用的是StreamWriter 的一個實例,而 StreamWriter 繼承自 TextWriter 並實現了此方法。

 

System.Console.WriteLine()的功能是輸出一個字符或字符串並換行,其實現考慮到了各個方面,包括功能的細化,精密的組織,鮮明的層次等。

咱們編程,不必定要向別人這樣將一個類,一個方法寫的這樣有條理,但應當學習別人的編程的思想與代碼的結構與組織方法等,並儘可能向別人看齊,

這樣,有助於咱們在編程的時候構建一個清晰的代碼體系和結構,提升編程效率與學習效率。

相關文章
相關標籤/搜索