2

私の知る限りConsole.WriteLine()(またはConsole.Write())オブジェクトのToString()メソッドを呼び出して、オブジェクトの文字列表現を取得しますか?つまり、これらの 2 つの呼び出しConsole.WriteLine()は同じですよね?

Foo foo = new Foo();

Console.WriteLine(foo); // This is same as the one bellow 
Console.WriteLine(foo.ToString());

そこで、次のような状況を想定してみましょう。Foo の配列のインスタンス化を宣言します。

Foo[] foos = new Foo[10]; // After this line all 10 Foos are `null`s

次に、Foos 自体をインスタンス化せずに、配列の任意の要素で Console.WriteLine() を呼び出します。したがって、この場合、Foos の配列があり、配列内のすべての Foo はnull、Console.WriteLine() の呼び出しによって aNullReferenceExceptionがスローされるはずです。しかし、物事はあなたがこのように呼ぶ場合です

Console.WriteLine(foos[0])

コンソールウィンドウに書かれている以外は何も起こりませんが、Environment.NewLineこのように呼び出すと

Console.WriteLine(foos[0].ToString())

実際には をスローしNullReferenceExceptionます。これら 2 つの呼び出しの違いは何ですか? 最初のものはToString()明示的に呼び出さないことを意味しますが、とにかく Console.WriteLine() によって暗黙的に呼び出されるべきではありませんか? そしてNullReferenceException、最初のケースで がスローされないのはなぜですか?

4

3 に答える 3

13

したがって、 Console.WriteLine() へのこれら 2 つの呼び出しは同じですよね?

いいえ。 null 参照を呼び出さConsole.WriteLine ないToStringため、代わりに空の文字列を使用するだけです。それ自体を検出します。

ドキュメントには、次のように明示的に記載されています。

値が null の場合、行末記号のみが書き込まれます。それ以外の場合は、value の ToString メソッドが呼び出されてその文字列表現が生成され、結果の文字列が標準出力ストリームに書き込まれます。

への呼び出しがなければToString、 はありませんNullReferenceException

string.Format同じように動作します。例えば:

object value = null;
string text = string.Format("Value: '{0}'", value);

に設定さtextれますValue: ''

于 2013-08-15T14:08:50.117 に答える
5

Console.WriteLine Method (Object)

値がnullの場合、行末記号のみが書き込まれます。それ以外の場合は、ToStringvalue のメソッドが呼び出されて文字列表現が生成され、結果の文字列が標準出力ストリームに書き込まれます。

したがってConsole.WriteLine(obj)、 とConsole.WriteLine(obj.ToString())はまったく同じではありません。

そして少しのコード:

public virtual void WriteLine(object value)
{
    if (value == null)
    {
        this.WriteLine();
        return;
    }
    IFormattable formattable = value as IFormattable;
    if (formattable != null)
    {
        this.WriteLine(formattable.ToString(null, this.FormatProvider));
        return;
    }
    this.WriteLine(value.ToString());
}
于 2013-08-15T14:09:26.880 に答える
0
Console.WriteLine(foos[0])

上記の行ではnullであるため、ドキュメントによると、行ターミネーターが書き込まれ、他には何も書き込まれません。オブジェクトがnullかどうかを最初にチェックしてから、行ターミネータを書き、それ以外の場合はToString()オブジェクトのメソッドを呼び出すと思います。一方

Console.WriteLine(obj.ToString())

例外である null で ToString メソッドを呼び出しています。

于 2013-08-15T14:13:26.420 に答える