Console.Writeline 基础知识

本文关键字:基础知识 Writeline Console | 更新日期: 2023-09-27 17:50:27

我对以下代码有疑问:

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

文档 说:

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

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

Console.Writeline 基础知识

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

Console.WriteLine有一组与特定类型(主要是基元(匹配的重载。如果编译器与提供的类型不匹配重载,则它与重载System.Object匹配(前提是你提供了单个参数(。如果发生这种情况,它会检查类型是否实现IFormattable,如果是,则调用IFormattable.ToString(null, Formatter)。如果没有,它将在对象上调用ToStringToStringSystem.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" .。

这意味着,表示形式将是属于您的CurrentCultureShortDatePatternLongTimePattern属性的组合

如果需要自定义类的特殊格式,可以重写类型的 .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 .