1

以下是《c# 中的keyprogramming》一书中的一个简短的时钟程序。我对 Timers 库一点也不熟悉,所以有些语法我真的不明白。我想了解而我不了解的是Console.Write(str)这个小程序中方法中的那一行。如何Main知道要打印到控制台的内容?是Console.WriteLine()让时间每秒打印出来的空调用吗?当我阅读这些概念时,事后似乎很容易理解发生了什么。根据我的问题,我还不太了解 C# 的哪些内容?

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);
    }
}
4

3 回答 3

3

Main()除了初始的空白行之外,不会向控制台打印任何内容。

Console.Write()TimerHandler()回调中每秒运行一次并打印时间。

于 2012-09-24T17:57:33.487 回答
1

str包含调用 String.Format() 函数后字符串的值。该功能记录在这里:http: //msdn.microsoft.com/en-us/library/b1csw23d.aspx

在您的代码中,{0} 替换为 eea.SignalTime.ToLongDateString() 的格式化表示,而 {1} 替换为 eea.SignalTime.ToLongTimeString() 的格式化表示。

所以来回答

我想了解但我不了解的是这个小程序的方法中的 Console.Write(str) 行。Main 如何知道要打印到控制台的内容?

答案是“它写入任何 String.Format() 函数确定“str”的值在这一行中的内容:”

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

WriteLine() 函数只打印一个空行,实际上与您询问的显示日期/时间的字符串无关。

作为记录, Console.Write 和 Console.Writeline 分别记录在此处此处

于 2012-09-24T17:58:27.103 回答
0

没有任何参数的Console.WriteLine()就像它听起来的那样,只是打印出一个空行(换行符)。

将当前行终止符写入标准输出流。

带有任何参数的Console.WriteLine(xxx)将参数打印在一行上,然后是一个新行。

将指定的数据(后跟当前行终止符)写入标准输出流。

在您的 TimerHandler 方法中,您使用的是Console.Write(xxx),它只打印参数的文本表示,没有换行符。

将指定对象的文本表示形式写入标准输出流。

于 2012-09-24T17:57:57.323 回答