Object.ToString メソッド

定義

現在のオブジェクトを表す文字列を返します。

public:
 virtual System::String ^ ToString();
public virtual string ToString ();
public virtual string? ToString ();
abstract member ToString : unit -> string
override this.ToString : unit -> string
Public Overridable Function ToString () As String

戻り値

String

現在のオブジェクトを表す文字列。

注釈

Object.ToStringは、 の主要な書式設定メソッド.NET Framework。 オブジェクトを文字列形式に変換して、表示に適しています。 ( の書式設定のサポートについては、「.NET Framework」を参照してください)。メソッドの既定の Object.ToString 実装では、オブジェクトの型の完全修飾名が返されます。

重要

別の種類のメンバー リストからのリンクに従って、このページにアクセスした可能性があります。 これは、その型が をオーバーライドしないのでです Object.ToString 。 代わりに、 メソッドの機能を継承 Object.ToString します。

型は、特定の型 Object.ToString のより適切な文字列表現を提供するために、 メソッドをオーバーライドする場合が多い。 型は、書式指定文字列またはカルチャに依存する書式設定のサポートを提供するために、 Object.ToString メソッドをオーバーロードする場合も頻繁に行われます。

このセクションの内容は次のとおりです。

既定の Object.ToString() メソッド
Object.ToString() メソッドのオーバーライド
ToString メソッドのオーバーロード
Object.ToString メソッドの拡張
Windows ランタイムに関する注意事項

既定の Object.ToString() メソッド

メソッドの既定の実装では、次の例に示すように、 の型の完全修飾 ToString Object 名が返されます。

using namespace System;

void main()
{
   Object^ obj = gcnew Object();
   Console::WriteLine(obj->ToString());
}
// The example displays the following output:
//      System.Object
Object obj = new Object();
Console.WriteLine(obj.ToString());

// The example displays the following output:
//      System.Object
Module Example
   Public Sub Main()
      Dim obj As New Object()
      Console.WriteLine(obj.ToString())
   End Sub
End Module
' The example displays the following output:
'      System.Object

は .NET Framework 内のすべての参照型の基本クラスなので、この動作はメソッドをオーバーライドしない参照型 Object によって継承 ToString されます。 次の例を使って説明します。 すべてのメンバーの既定の実装 Object1 を受け入れる という名前のクラスを定義 Object します。 その ToString メソッドは、オブジェクトの完全修飾型名を返します。

using namespace System;

namespace Examples
{
   ref class Object1
   {
   };
}

void main()
{
   Object^ obj1 = gcnew Examples::Object1();
   Console::WriteLine(obj1->ToString());
}
// The example displays the following output:
//   Examples.Object1
using System;
using Examples;

namespace Examples
{
   public class Object1
   {
   }
}

public class Example
{
   public static void Main()
   {
      object obj1 = new Object1();
      Console.WriteLine(obj1.ToString());
   }
}
// The example displays the following output:
//   Examples.Object1
Imports Examples

Namespace Examples
   Public Class Object1
   End Class
End Namespace

Module Example
   Public Sub Main()
      Dim obj1 As New Object1()
      Console.WriteLine(obj1.ToString())
   End Sub
End Module
' The example displays the following output:
'   Examples.Object1

Object.ToString() メソッドのオーバーライド

型は通常、 メソッド Object.ToString をオーバーライドして、オブジェクト インスタンスを表す文字列を返します。 たとえば、、、 などの基本型は、オブジェクトが表す値の文字列形式を返す実装 Char Int32 String ToString を提供します。 次の例では、 メソッドをオーバーライドして型名とその値を返す クラス を Object2 ToString 定義します。

using namespace System;

ref class Object2
{
   private:
      Object^ value;

   public:
      Object2(Object^ value)
      {
         this->value = value;
      }

      virtual String^ ToString() override
      {
         return Object::ToString() + ": " + value->ToString();
      }
};

void main()
{
   Object2^ obj2 = gcnew Object2(L'a');
   Console::WriteLine(obj2->ToString());
 
}
// The example displays the following output:
//       Object2: a
using System;

public class Object2
{
   private object value;

   public Object2(object value)
   {
      this.value = value;
   }

   public override string ToString()
   {
      return base.ToString() + ": " + value.ToString();
   }
}

public class Example
{
   public static void Main()
   {
      Object2 obj2 = new Object2('a');
      Console.WriteLine(obj2.ToString());
   }
}
// The example displays the following output:
//       Object2: a
Public Class Object2
   Private value As Object
   
   Public Sub New(value As Object)
      Me.value = value
   End Sub
   
   Public Overrides Function ToString() As String
      Return MyBase.ToString + ": " + value.ToString()
   End Function
End Class

Module Example
   Public Sub Main()
      Dim obj2 As New Object2("a"c)
      Console.WriteLine(obj2.ToString())
   End Sub
End Module
' The example displays the following output:
'       Object2: a

次の表に、.NET の型カテゴリを示し、メソッドをオーバーライドするかどうかを示 Object.ToString します。

型のカテゴリ Object.ToString() をオーバーライドします 動作
クラス 該当なし 該当なし
構造 はい ( ValueType.ToString ) Object.ToString() と同じ
列挙 はい ( Enum.ToString() ) メンバー名
Interface いいえ 該当なし
Delegate いいえ 該当なし

のオーバーライドの詳細については、「継承元に関する注意事項」セクションを参照してください ToString

ToString メソッドのオーバーロード

パラメーターなしメソッドをオーバーライドするだけでなく、多くの型は、パラメーターを受け取るメソッドのバージョンを提供するために メソッド Object.ToString() ToString をオーバーロードします。 最も一般的な方法は、変数の書式設定とカルチャに依存する書式設定のサポートを提供するために行われます。

次の例では、 メソッドをオーバーロードして、クラスのさまざまなフィールドの値を含む結果 ToString 文字列を返 Automobile します。 4 つの書式指定文字列 G が定義されています。この文字列は、モデル名と年を返します。D: モデル名、年、ドアの数を返します。C: モデル名、年、および数のシリンダーを返します。と A。4 つのフィールド値すべてがある文字列を返します。

using System;

public class Automobile
{
   private int _doors;
   private string _cylinders;
   private int _year;
   private string _model;

   public Automobile(string model, int year , int doors,
                     string cylinders)
   {
      _model = model;
      _year = year;
      _doors = doors;
      _cylinders = cylinders;
   }

   public int Doors
   { get { return _doors; } }

   public string Model
   { get { return _model; } }

   public int Year
   { get { return _year; } }

   public string Cylinders
   { get { return _cylinders; } }

   public override string ToString()
   {
      return ToString("G");
   }

   public string ToString(string fmt)
   {
      if (string.IsNullOrEmpty(fmt))
         fmt = "G";

      switch (fmt.ToUpperInvariant())
      {
         case "G":
            return string.Format("{0} {1}", _year, _model);
         case "D":
            return string.Format("{0} {1}, {2} dr.",
                                 _year, _model, _doors);
         case "C":
            return string.Format("{0} {1}, {2}",
                                 _year, _model, _cylinders);
         case "A":
            return string.Format("{0} {1}, {2} dr. {3}",
                                 _year, _model, _doors, _cylinders);
         default:
            string msg = string.Format("'{0}' is an invalid format string",
                                       fmt);
            throw new ArgumentException(msg);
      }
   }
}

public class Example
{
   public static void Main()
   {
      var auto = new Automobile("Lynx", 2016, 4, "V8");
      Console.WriteLine(auto.ToString());
      Console.WriteLine(auto.ToString("A"));
   }
}
// The example displays the following output:
//       2016 Lynx
//       2016 Lynx, 4 dr. V8
Public Class Automobile
   Private _doors As Integer
   Private _cylinders As String
   Private _year As Integer
   Private _model As String
   
   Public Sub New(model As String, year As Integer, doors As Integer,
                  cylinders As String)
      _model = model
      _year = year
      _doors = doors
      _cylinders = cylinders
   End Sub
   
   Public ReadOnly Property Doors As Integer
      Get
          Return _doors
      End Get
   End Property
   
   Public ReadOnly Property Model As String
      Get
         Return _model
      End Get
   End Property
   
   Public ReadOnly Property Year As Integer
      Get
         Return _year
      End Get
   End Property
   
   Public ReadOnly Property Cylinders As String
      Get
         Return _cylinders
      End Get
   End Property
   
   Public Overrides Function ToString() As String
      Return ToString("G")
   End Function
   
   Public Overloads Function ToString(fmt As String) As String
      If String.IsNullOrEmpty(fmt) Then fmt = "G"
      
      Select Case fmt.ToUpperInvariant()
         Case "G"
            Return String.Format("{0} {1}", _year, _model)
         Case "D"
            Return String.Format("{0} {1}, {2} dr.",
                                 _year, _model, _doors)
         Case "C"
            Return String.Format("{0} {1}, {2}",
                                 _year, _model, _cylinders)
         Case "A"
            Return String.Format("{0} {1}, {2} dr. {3}",
                                 _year, _model, _doors, _cylinders)
         Case Else
            Dim msg As String = String.Format("'{0}' is an invalid format string",
                                              fmt)
            Throw New ArgumentException(msg)
      End Select
   End Function
End Class

Module Example
   Public Sub Main()
      Dim auto As New Automobile("Lynx", 2016, 4, "V8")
      Console.WriteLine(auto.ToString())
      Console.WriteLine(auto.ToString("A"))
   End Sub
End Module
' The example displays the following output:
'       2016 Lynx
'       2016 Lynx, 4 dr. V8

次の例では、オーバーロードされた メソッドを Decimal.ToString(String, IFormatProvider) 呼び出して、カルチャに依存する通貨値の書式設定を表示します。

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      string[] cultureNames = { "en-US", "en-GB", "fr-FR",
                                "hr-HR", "ja-JP" };
      Decimal value = 1603.49m;
      foreach (var cultureName in cultureNames) {
         CultureInfo culture = new CultureInfo(cultureName);
         Console.WriteLine("{0}: {1}", culture.Name,
                           value.ToString("C2", culture));
      }
   }
}
// The example displays the following output:
//       en-US: $1,603.49
//       en-GB: £1,603.49
//       fr-FR: 1 603,49 €
//       hr-HR: 1.603,49 kn
//       ja-JP: ¥1,603.49
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim cultureNames() As String = { "en-US", "en-GB", "fr-FR",
                                       "hr-HR", "ja-JP" }
      Dim value As Decimal = 1603.49d
      For Each cultureName In cultureNames
         Dim culture As New CultureInfo(cultureName)
         Console.WriteLine("{0}: {1}", culture.Name,
                           value.ToString("C2", culture))
      Next
   End Sub
End Module
' The example displays the following output:
'       en-US: $1,603.49
'       en-GB: £1,603.49
'       fr-FR: 1 603,49 €
'       hr-HR: 1.603,49 kn
'       ja-JP: ¥1,603.49

書式指定文字列とカルチャに依存する書式設定の詳細については、「書式設定の種類」 を参照してください。 数値でサポートされる書式指定文字列については、「標準数値書式指定文字列」および「カスタム 数値書式指定 文字列 」を参照してください。 日付と時刻の値でサポートされる書式指定文字列については、「標準の日付と時刻 書式指定文字列」および「カスタム日時書式指定文字列 」を参照してください

Object.ToString メソッドの拡張

型は既定のメソッドを継承するために、その動作が望ましくない場合があり Object.ToString 、変更したい場合があります。 これは、配列とコレクション クラスに特に当てはっています。 配列またはコレクション クラスの メソッドにメンバーの値が表示される場合は、次の例に示すように、型の完全修飾型名が表示されます ToString

int[] values = { 1, 2, 4, 8, 16, 32, 64, 128 };
Console.WriteLine(values.ToString());

List<int> list = new List<int>(values);
Console.WriteLine(list.ToString());

// The example displays the following output:
//       System.Int32[]
//       System.Collections.Generic.List`1[System.Int32]
Imports System.Collections.Generic

Module Example
   Public Sub Main()
      Dim values() As Integer = { 1, 2, 4, 8, 16, 32, 64, 128 }
      Console.WriteLine(values.ToString())
      
      Dim list As New List(Of Integer)(values)
      Console.WriteLine(list.ToString())
   End Sub
End Module
' The example displays the following output:
'    System.Int32[]
'    System.Collections.Generic.List`1[System.Int32]

必要な結果文字列を生成するためのオプションがいくつかあります。

  • 型が 配列、コレクション オブジェクト、または インターフェイスまたは インターフェイスを実装するオブジェクトの場合は、C# の ステートメントまたは Visual Basic の コンストラクトを使用して、その要素 IEnumerable IEnumerable<T> foreach For Each...Next を列挙できます。

  • クラスが (C#の場合) または (Visual Basic 内) ではない場合は、カスタマイズするメソッドを持つ基本クラスから継承するラッパー クラス sealed NotInheritable Object.ToString を開発できます。 少なくとも、次の操作を行う必要があります。

    1. 必要なコンストラクターを実装します。 派生クラスは、基本クラスのコンストラクターを継承しません。

    2. メソッドを Object.ToString オーバーライドして、必要な結果文字列を返します。

    次の例では、 クラスのラッパー クラスを定義 List<T> します。 メソッドをオーバーライドして、完全修飾型名ではなく、コレクションの各メソッドの値 Object.ToString を表示します。

    using System;
    using System.Collections.Generic;
    
    public class CList<T> : List<T>
    {
       public CList(IEnumerable<T> collection) : base(collection)
       { }
    
       public CList() : base()
       {}
    
       public override string ToString()
       {
          string retVal = string.Empty;
          foreach (T item in this) {
             if (string.IsNullOrEmpty(retVal))
                retVal += item.ToString();
             else
                retVal += string.Format(", {0}", item);
          }
          return retVal;
       }
    }
    
    public class Example
    {
       public static void Main()
       {
          var list2 = new CList<int>();
          list2.Add(1000);
          list2.Add(2000);
          Console.WriteLine(list2.ToString());
       }
    }
    // The example displays the following output:
    //    1000, 2000
    
    Imports System.Collections.Generic
    
    Public Class CList(Of T) : Inherits List(Of T)
       Public Sub New(capacity As Integer)
          MyBase.New(capacity)
       End Sub
    
       Public Sub New(collection As IEnumerable(Of T))
          MyBase.New(collection)
       End Sub
    
       Public Sub New()
          MyBase.New()
       End Sub
    
       Public Overrides Function ToString() As String
          Dim retVal As String = String.Empty
          For Each item As T In Me
             If String.IsNullOrEmpty(retval) Then
                retVal += item.ToString()
             Else
                retval += String.Format(", {0}", item)
             End If
          Next
          Return retVal
       End Function
    End Class
    
    Module Example
       Public Sub Main()
          Dim list2 As New CList(Of Integer)
          list2.Add(1000)
          list2.Add(2000)
          Console.WriteLine(list2.ToString())
       End Sub
    End Module
    ' The example displays the following output:
    '       1000, 2000
    
  • 必要な 結果文字列 を返す拡張メソッドを開発します。 この方法では、既定のメソッドをオーバーライドすることはできません (つまり、拡張クラス Object.ToString (C#) またはモジュール (Visual Basic の場合) には、元の型のメソッドの代用として呼び出される という名前のパラメーターなしメソッドを指定することはできません。 ToString ToString パラメーターなし置換の他の名前を指定する必要 ToString があります。

    次の例では、 クラスを拡張する 2 つのメソッドを定義します。パラメーターなしメソッドと、書式指定文字列を表すパラメーターを持つ List<T> ToString2 ToString String メソッドです。

    using System;
    using System.Collections.Generic;
    
    public static class StringExtensions
    {
       public static string ToString2<T>(this List<T> l)
       {
          string retVal = string.Empty;
          foreach (T item in l)
             retVal += string.Format("{0}{1}", string.IsNullOrEmpty(retVal) ?
                                                         "" : ", ",
                                      item);
          return string.IsNullOrEmpty(retVal) ? "{}" : "{ " + retVal + " }";
       }
    
       public static string ToString<T>(this List<T> l, string fmt)
       {
          string retVal = string.Empty;
          foreach (T item in l) {
             IFormattable ifmt = item as IFormattable;
             if (ifmt != null)
                retVal += string.Format("{0}{1}",
                                        string.IsNullOrEmpty(retVal) ?
                                           "" : ", ", ifmt.ToString(fmt, null));
             else
                retVal += ToString2(l);
          }
          return string.IsNullOrEmpty(retVal) ? "{}" : "{ " + retVal + " }";
       }
    }
    
    public class Example
    {
       public static void Main()
       {
          List<int> list = new List<int>();
          list.Add(1000);
          list.Add(2000);
          Console.WriteLine(list.ToString2());
          Console.WriteLine(list.ToString("N0"));
       }
    }
    // The example displays the following output:
    //       { 1000, 2000 }
    //       { 1,000, 2,000 }
    
    Imports System.Collections.Generic
    Imports System.Runtime.CompilerServices
    
    Public Module StringExtensions
       <Extension()>
       Public Function ToString2(Of T)(l As List(Of T)) As String
          Dim retVal As String = ""
          For Each item As T In l
             retVal += String.Format("{0}{1}", If(String.IsNullOrEmpty(retVal),
                                                         "", ", "),
                                      item)
          Next
          Return If(String.IsNullOrEmpty(retVal), "{}", "{ " + retVal + " }")
       End Function
    
       <Extension()>
       Public Function ToString(Of T)(l As List(Of T), fmt As String) As String
          Dim retVal As String = String.Empty
          For Each item In l
             Dim ifmt As IFormattable = TryCast(item, IFormattable)
             If ifmt IsNot Nothing Then
                retVal += String.Format("{0}{1}",
                                        If(String.IsNullOrEmpty(retval),
                                           "", ", "), ifmt.ToString(fmt, Nothing))
             Else
                retVal += ToString2(l)
             End If
          Next
          Return If(String.IsNullOrEmpty(retVal), "{}", "{ " + retVal + " }")
       End Function
    End Module
    
    Module Example
       Public Sub Main()
          Dim list As New List(Of Integer)
          list.Add(1000)
          list.Add(2000)
          Console.WriteLine(list.ToString2())
          Console.WriteLine(list.ToString("N0"))
       End Sub
    End Module
    ' The example displays the following output:
    '       { 1000, 2000 }
    '       { 1,000, 2,000 }
    

Windows ランタイムに関する注意事項

Windows Runtime のクラスで メソッドを呼び出す場合、 をオーバーライドしないクラスの既定の動作 ToString が提供されます ToString 。 これは、Windows ランタイムに対して .NET Framework が提供するサポートの一部です (「.NET Framework Windows Store Apps と Windows Runtime のサポート」を参照してください)。 ランタイムのクラスWindows継承する必要はありません。また、 が常に Object 実装されるとは限らない ToString 。 ただし ToString Equals(Object) 、C# または Visual Basic コードで使用する場合は、常に 、、および メソッドが含み、.NET Framework ではこれらのメソッドの既定の動作が GetHashCode 提供されます。

.NET Framework 4.5.1 より、共通言語ランタイムは Windows Runtime オブジェクトでIStringable.ToStringを使用してから、 の既定の実装に戻します Object.ToString

注意

WindowsC# または C# で記述されたランタイム クラスは、Visual Basicオーバーライド ToString できます。

Windows ランタイムと IStringable インターフェイス

Windows 8.1 Windows ランタイムには、IStringable.ToStringという 1 つのメソッドを持つIStringableインターフェイスが含まれています。このインターフェイスは、 によって提供されるのと同等の基本的な書式設定サポートを提供します Object.ToString 。 あいまいさ回避するには、マネージド型に IStringable を 実装する必要があります。

マネージド オブジェクトがネイティブ コードまたは JavaScript や C++/CX などの言語で記述されたコードによって呼び出される場合 、IStringable が実装されているように見えます。 IStringable がマネージド オブジェクトに実装されていない場合、共通言語ランタイムはIStringable.ToStringからの呼び出しを に自動的 Object.ToString にルーティングします。

警告

共通言語ランタイムでは、Windows Store アプリ内のすべてのマネージド型に対してIStringableが自動実装されます。このため、独自の実装を提供しない方が推奨 IStringable されます。 を実装 IStringable すると、Windows Runtime、C++/CX、または JavaScript から を呼び出す際に、意図しない ToString 動作が発生する可能性があります。

Windows Runtime コンポーネントでエクスポートされるパブリック マネージド型にIStringableを実装する場合は、次の制限が適用されます。

  • IStringableインターフェイスは、次のように "class implements" リレーションシップでのみ定義できます。

    public class NewClass : IStringable
    
    Public Class NewClass : Implements IStringable
    
  • インターフェイスに IStringable を 実装することはできません。

  • パラメーターを IStringable型に宣言することはできません。

  • IStringable は 、メソッド、プロパティ、またはフィールドの戻り値の型にすることはできません。

  • 次のようなメソッド定義 を使用して、基本クラスから IStringable 実装を非表示にすることはできません。

    
    public class NewClass : IStringable  
    {  
       public new string ToString()  
       {  
          return "New ToString in NewClass";  
       }  
    }  
    
    

    代わりに 、IStringable.ToString 実装は、常に基本クラスの実装をオーバーライドする必要があります。 ToString の実装を隠すことができるのは、厳密に型指定されたクラス インスタンスで呼び出す場合だけです。

さまざまな条件下で、ネイティブ コードから 、IStringable を実装するマネージド型への呼び出し、または ToString 実装を非表示にした場合、予期しない動作が発生する可能性があります。

注意 (継承者)

独自の型を実装する場合は、 メソッドをオーバーライドして、それらの型にとって意味のある ToString() 値を返す必要があります。 を提供するよりも書式設定を制御する必要がある派生クラス ToString() は、 インターフェイスを実装 IFormattable できます。 そのメソッドを使用すると、書式設定を制御する書式指定文字列を定義し、カルチャ固有の書式設定に使用できる ToString(String, IFormatProvider) IFormatProvider オブジェクトを使用できます。

メソッドのオーバーライドは ToString() 、次のガイドラインに従う必要があります。

  • 返される文字列は、人間が読み取り可能で、表示可能である必要があります。

  • 返される文字列は、オブジェクト インスタンスの値を一意に識別する必要があります。

  • 返される文字列は、デバッガーによる表示に適した短い文字列である必要があります。

  • オーバーライド ToString() で または null 文字列 Empty を返すべきではありません。

  • オーバーライド ToString() で例外がスローされない。

  • インスタンスの文字列表現がカルチャに依存する場合、または複数の方法で書式設定できる場合は、 インターフェイスを実装 IFormattable します。

  • 返される文字列に機密情報が含まれる場合は、まず適切なアクセス許可を要求する必要があります。 要求が成功した場合は、機密情報を返します。それ以外の場合は、機密情報を除外する文字列を返す必要があります。

  • デバッグ ToString() の複雑化を回避するために、オーバーライドに監視可能な副作用がない必要があります。 たとえば、 メソッドの呼び出 ToString() しでは、インスタンス フィールドの値を変更する必要があります。

  • 型が解析メソッド (または メソッド、コンストラクター、または文字列から型のインスタンスをインスタンス化するその他の静的メソッド) を実装する場合は、メソッドによって返される文字列をオブジェクト インスタンスに変換できる必要があります。 Parse TryParse ToString()

適用対象

こちらもご覧ください