ToStringメソッド

自作クラスのインスタンス「a」を画面に表示させるとき、

Console.WriteLine(a);

として「a」のフィールドの内容を表示させることができれば便利である。 C#では、「ToStringメソッド」を「オーバーライド」をすることでこれが実現できる。

ToStringメソッドとは

正確に理解するには「継承」という概念が必要になるので、ここでは深入りしないが、 おおざっぱにいって、ToStringメソッドは

  • どんなクラスからでも利用できる。
  • 再定義(オーバーライド)可能。(自作クラスに対して、初期の定義はあまり意味を持たない.)
  • インスタンスを文字列化する。

というメソッドである。また注意が必要なのが、「自動的に」呼び出されることが多いという点である。

例.

class Program
{
    static void Main(string[] args)
    {
        Person p = new Person();
        p.Age = 20;
        p.Name = "Green";
        Console.WriteLine(p);
    }
}
class Person
{
    public int Age;
    public string Name;
    public override string ToString()
    {
        return $"年齢は{Age}.名前は{Name}です.";
    }
}

実行結果.

年齢は20.名前はGreenです.

解説.

一見して、どこでToStringが呼び出されているかがわからないが、実はMain関数の5行目

Console.WriteLine(p);

で「自動的」にToString()が呼び出されている。実際この行を

Console.WriteLine(p.ToString());

と「明示的」に「ToString」メソッドを呼ぶコードに書きかえても同じことになる。

Personクラスの4-7行目でToStringメソッドの再定義が行われている。

ToStringメソッドはすでに「ある場所」で定義されているのであるが、初期の定義は適切な定義になっていないので、 再定義するのが望ましい。ただし、再定義するには特別なキーワードが必要で、それが 「override」というキーワードになる。「override」は「メソッド定義を再定義します」という宣言と認識する。

例2.

class Program
{
    static void Main(string[] args)
    {
        Person p = new Person();
        p.Age = 20;
        p.Name = "Green";
        var s = "はじめまして!" + p;
        Console.WriteLine(s);
    }
}
class Person
{
    public int Age;
    public string Name;
    public override string ToString()
    {
        return $"年齢は{Age}.名前は{Name}です.";
    }
}

実行結果.

はじめまして!年齢は20.名前はGreenです.

解説.

例2において、再定義したToStringがどこで呼び出されているかというと、Main関数の5行目

var s = "はじめまして!" + p;

の部分となる。基本的に「文字列+X」は「X」が文字列化されて結合されるのであるが、「X」を文字列化するときに 「Xが属するクラスで定義されたToStringメソッド」が自動的に呼ばれることになる。実際

var s = "はじめまして!" + p.ToString();

と書きかえても同じ実行結果となる。

まとめ

ToStringメソッドはインスタンスを文字列化する際に「自動的」よばれることが多いメソッド。 自作クラスについては、基本的に初期の定義は不適切なので、再定義しておくことが望ましい。 再定義する際に用いるのが「override」キーワード。