我对以下代码有疑问:
class CurrentDate
{
static void Main()
{
Console.WriteLine(DateTime.Now);
}
}
文档说:
写入指定对象数组的文本表示形式, 然后是当前行终止符,到标准输出流 使用指定的格式信息。
所以我的问题是:WriteLine
如何知道DateTime
对象的文本表示?我的意思是,如果我从我自己的类创建自己的对象,它将如何知道如何将值转换为文本?甚至更多,它如何知道价值是什么?你怎么定义"价值"对象?
答案 0 :(得分:17)
WriteLine如何知道DateTime对象的文本表示?我的意思是,如果我从我自己的类创建自己的对象,它将如何知道如何将值转换为文本?
Console.WriteLine
具有set of overloads个匹配的特定类型(主要是基元)。如果编译器与提供的类型的重载不匹配,则它与重载System.Object
匹配(授予您提供单个参数)。如果发生这种情况,它会检查类型是否实现IFormattable
,如果是,则调用IFormattable.ToString(null, Formatter)
。如果没有,则会在您的对象上调用ToString
。 ToString
在System.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)
overload是implemented 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
LongTimePattern
和CurrentCulture
属性的组合
如果您想为自定义类设置特殊格式,则可以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
可以很容易地看到所有这些。