Console.Writeline 基础知识
本文关键字:基础知识 Writeline Console | 更新日期: 2023-09-27 17:50:27
我对以下代码有疑问:
class CurrentDate
{
static void Main()
{
Console.WriteLine(DateTime.Now);
}
}
文档 说:
写入指定对象数组的文本表示形式, 后跟当前线路终止符,到标准输出流 使用指定的格式信息。
所以我的问题是:WriteLine
怎么知道DateTime
对象的文本表示?我的意思是,如果我从自己的类创建自己的对象,它如何知道如何将值转换为文本?更重要的是,它如何知道价值是什么?如何定义对象的"值"?
为什么 WriteLine 知道 DateTime 对象的文本表示形式?我的意思是,如果我从自己的类创建自己的对象,它如何知道如何将值转换为文本?
Console.WriteLine
有一组与特定类型(主要是基元(匹配的重载。如果编译器与提供的类型不匹配重载,则它与重载System.Object
匹配(前提是你提供了单个参数(。如果发生这种情况,它会检查类型是否实现IFormattable
,如果是,则调用IFormattable.ToString(null, Formatter)
。如果没有,它将在对象上调用ToString
。 ToString
在 System.Object
中定义,所有对象都继承自 。每个需要自定义表示形式的对象都会覆盖默认行为,就像DateTime
一样。
例如,假设您有一个具有 Bar
字符串属性的 Foo
类,并且您希望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);
}
会产生"酒吧"。
由于Console.WriteLine(DateTime)
没有重载,就像你的情况一样,Console.WriteLine(Object)
重载被调用,这个重载调用TextWriter.WriteLine(object)
重载,实现为:
IFormattable f = value as IFormattable;
if (f != null)
WriteLine(f.ToString(null, FormatProvider));
else
WriteLine(value.ToString());
如您所见,此方法检查此对象类型是否实现IFormattable
接口。由于Datetime
实现了此接口,因此将调用您的f.ToString(null, FormatProvider)
。从此方法的文档来看,第一个参数是:
使用默认格式的空引用(Visual Basic 中无内容( 为 IFormatable 实现的类型定义。
从DateTime.ToString(String, IFormatProvider)
方法的文档中:
如果格式为 null 或空字符串 ("(,则标准格式 使用说明符
"G"
.。
这意味着,表示形式将是属于您的CurrentCulture
的ShortDatePattern
和LongTimePattern
属性的组合
如果需要自定义类的特殊格式,可以重写类型的 .ToString()
方法以更改其行为。
与某些人的想法相反,DateTime.ToString()
不会被称为。在 .NET 中,对象可以通过两种方式"字符串化"自身:重写 string Object.ToString()
方法和实现 IFormattable
接口。 DateTime
两者兼而有之。
现在。。。当你尝试做
Console.WriteLine(DateTime.Now);
空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
.