Console.Writeline基础知识

时间:2015-05-23 14:11:23

标签: c# console.writeline

我对以下代码有疑问:

class CurrentDate
    {
        static void Main()
        {
            Console.WriteLine(DateTime.Now);
        }
    }

文档说:

  

写入指定对象数组的文本表示形式,   然后是当前行终止符,到标准输出流   使用指定的格式信息。

所以我的问题是:WriteLine如何知道DateTime对象的文本表示?我的意思是,如果我从我自己的类创建自己的对象,它将如何知道如何将值转换为文本?甚至更多,它如何知道价值是什么?你怎么定义"价值"对象?

3 个答案:

答案 0 :(得分:17)

  

WriteLine如何知道DateTime对象的文本表示?我的意思是,如果我从我自己的类创建自己的对象,它将如何知道如何将值转换为文本?

Console.WriteLine具有set of overloads个匹配的特定类型(主要是基元)。如果编译器与提供的类型的重载不匹配,则它与重载System.Object匹配(授予您提供单个参数)。如果发生这种情况,它会检查类型是否实现IFormattable,如果是,则调用IFormattable.ToString(null, Formatter)。如果没有,则会在您的对象上调用ToStringToStringSystem.Object中定义,所有对象都继承自DateTime。每个想要自定义表示的对象都会覆盖默认行为,例如Foo

例如,假设您的Bar类具有Console.WriteLine字符串属性,并且您希望Foo在将public class Foo { public string Bar { get; set; } public override string ToString() { return Bar; } } 传递给它时打印有意义的内容:

Console.WriteLine

现在我们要传递它public static void Main(string[] args) { var foo = new Foo { Bar = "bar" }; Console.WriteLine(foo); }

for(i in 1:length(sites.df$siteKey)) {
    print(sites.df$siteCode[i])
}

会产生“bar”。

答案 1 :(得分:9)

由于Console.WriteLine(DateTime)没有重载,因为在您的情况下,Console.WriteLine(Object)重载被调用而this overload calls TextWriter.WriteLine(object) overloadimplemented as:< / p>

IFormattable f = value as IFormattable;
if (f != null)
    WriteLine(f.ToString(null, FormatProvider));
else
    WriteLine(value.ToString());

如您所见,此方法检查此对象类型是否实现IFormattable interface。自Datetime implements this interface起,您的f.ToString(null, FormatProvider)将被调用。从这个方法documentation开始,第一个参数是:

  

使用默认格式的空引用(在Visual Basic中为Nothing)   为IFormattable实现的类型定义

来自DateTime.ToString(String, IFormatProvider)方法的文档:

  

如果format为null或空字符串(&#34;&#34;),则为标准格式   使用了说明符"G"

这意味着,该表示将是属于您ShortDatePattern

LongTimePatternCurrentCulture属性的组合

如果您想为自定义类设置特殊格式,则可以override the .ToString() method改变其行为。

答案 2 :(得分:7)

与某些人的想法相反,DateTime.ToString() 不会被调用。在.NET中,对象可以有两种方法来“串行化”自身:覆盖string Object.ToString()方法并实现IFormattable接口。 DateTime同时做到了。

现在......当你尝试做

Console.WriteLine(DateTime.Now);

选择了void public static void WriteLine(Object value)重载(如果在Visual Studio中按Ctrl +单击WriteLine,则可以看到它)。此方法只调用TextWriter.WriteLine(value)方法,即:

IFormattable f = value as IFormattable;
if (f != null)
    WriteLine(f.ToString(null, FormatProvider));
else
    WriteLine(value.ToString());

使用ILSpy并查找Console.WriteLine可以很容易地看到所有这些。