2012-09-24 119 views
1

以下是本書「在c#的關鍵字中編程」一書中的簡短時鐘程序。我根本不熟悉定時器庫,所以我沒有真正理解這個語法。我想了解的,我不是在這個小程序中的方法Console.Write(str)Main怎麼知道要打印到控制檯?這是空的Console.WriteLine()電話,每秒打印一次?當我閱讀這些概念時,理解發生的事情似乎很容易。基於我所問的,關於C#的事情我還不是很瞭解?從方法寫入控制檯.NET 4.0

using System; 
using System.Timers; // Requires System.dll 

class Clock 
{ 
    static int iStringLength; 

    static void Main() 
    { 
     Console.WriteLine("Press Enter to end program"); 
     Console.WriteLine(); 

     Timer tmr = new Timer(); 
     tmr.Elapsed += new ElapsedEventHandler(TimerHandler); 
     tmr.Interval = 1000; 
     tmr.Start(); 

     Console.ReadLine(); 
     tmr.Stop(); 
    } 
    static void TimerHandler(object obj, ElapsedEventArgs eea) 
    { 
     Console.Write(new String('\b', iStringLength)); 

     string str = String.Format("{0} {1} ", 
           eea.SignalTime.ToLongDateString(), 
           eea.SignalTime.ToLongTimeString()); 
     iStringLength = str.Length; 

     Console.Write(str); 
    } 
} 
+0

沒有WriteLine或Flush,此程序可能無法輸出到控制檯,直到您執行ReadLine由於緩衝。 – user7116

+1

定時器事件處理程序由'tmr.Elapsed'行設置,該行指定每秒調用一次的TimerHandler方法。該方法使用'String.Format'方法將時間寫入'str'變量,然後用'Console.Write(str)'將該字符串寫入控制檯。那有意義嗎? – Jasper

+0

這樣做,但我不明白如何在沒有在Main中調用方法的情況下將任何內容寫入控制檯。 – wootscootinboogie

回答

1

str包含調用String.Format()函數後的字符串值。該函數在此處進行了說明:http://msdn.microsoft.com/en-us/library/b1csw23d.aspx

在您的代碼中,{e}由eea.SignalTime.ToLongDateString()的格式化表示法替換,{1}由eea.SignalTime的格式化表示法替換。 ToLongTimeString()。

所以回答

我想明白了,我不就是行Console.Write(STR) 在這個小程序的方法。 Main如何知道如何將 打印到控制檯?

答案是「這寫的什麼的String.Format()函數來確定的值‘海峽’,是在這一行:」

string str = String.Format("{0} {1} ", 
           eea.SignalTime.ToLongDateString(), 
           eea.SignalTime.ToLongTimeString()); 

的的WriteLine()函數只是打印一個空並且與顯示日期/時間的字符串毫無關係。

爲了記錄,Console.Write和Console.Writeline分別記錄爲herehere

3

Main()不打印任何東西到控制檯,除了最初的空白行。

Console.Write()TimerHandler()回調每秒運行並打印時間。

+0

可能出現這樣的情況,我不能很好地理解事件,但更新的時間到底如何?如果沒有在Main中調用方法,我不明白方法內部有什麼東西可以進入控制檯 – wootscootinboogie

0

Console.WriteLine()沒有任何參數完全聽起來像,只是打印出一個空行(換行符)。

將當前行結束符寫入標準輸出流。

Console.WriteLine(xxx)使用任何參數將參數打印在一行上,後跟一個新行。

將指定的數據,後跟當前行結束符,寫入 的標準輸出流。

在您的TimerHandler方法中,您使用的是Console.Write(xxx),它只打印參數的文本表示形式,不帶換行符。

將指定對象的文本表示寫入標準的 輸出流。