淺析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()將最終的字符串輸出(一個字符一個字符的輸出)。 |
|
System.Console.WriteLine()的功能是輸出一個字符或字符串並換行,其實現考慮到了各個方面,包括功能的細化,精密的組織,鮮明的層次等。
咱們編程,不必定要向別人這樣將一個類,一個方法寫的這樣有條理,但應當學習別人的編程的思想與代碼的結構與組織方法等,並儘可能向別人看齊,
這樣,有助於咱們在編程的時候構建一個清晰的代碼體系和結構,提升編程效率與學習效率。