本文為機器翻譯文章。如需檢視英文版,請選取 [原文] 核取方塊。您也可以將滑鼠指標移到文字上,即可在快顯視窗顯示英文原文。
譯文
原文

Object.ToString 方法 ()

 

傳回代表目前物件的字串。

命名空間:   System
組件:  mscorlib (於 mscorlib.dll)

public virtual string ToString()

傳回值

Type: System.String

表示目前物件的字串。

Object.ToString 主要格式在.NET Framework 中的方法。 它將物件轉換為其字串表示,因此很適合用來顯示。 (如需格式在.NET Framework 的支援資訊,請參閱 .NET Framework 中的格式化類型。) 預設實作 Object.ToString 方法傳回的物件型別的完整的名稱。

System_CAPS_important重要

可能已達到此頁面由另一種類型的成員清單從以下的連結。 這是因為該類型不覆寫 Object.ToString 相反地,它會繼承的功能 Object.ToString 方法。

型別經常覆寫 Object.ToString 方法,以提供更適合特定類型的字串表示。 型別也經常多載 Object.ToString 方法,以提供支援的格式字串或區分文化特性的格式。

本節內容:

預設 Object.ToString() 方法
覆寫 Object.ToString() 方法
ToString 方法多載化
擴充 Object.ToString 方法
Windows 執行階段的相關資訊

預設實作 ToString 方法會傳回型別的完整限定的名稱 Object, ,如下列範例所示。

using System;

public class Example
{
   public static void Main()
   {
      Object obj = new Object();
      Console.WriteLine(obj.ToString());
   }
}
// The example displays the following output:
//      System.Object

因為 Object 的基底類別的所有參考型別在.NET Framework 中,這種行為由參考型別,不會覆寫繼承 ToString 方法。 下列範例將說明這點。 它會定義名為的類別 Object1 接受所有的預設實作 Object 成員。ToString 方法會傳回物件的完整型別名稱。

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

型別通常覆寫 Object.ToString 方法來傳回字串,代表物件執行個體。 例如,基底型別,例如 Char, ,Int32, ,和 String 提供 ToString 傳回此物件表示值的字串形式的實作。 下列範例會定義一個類別, Object2, ,會覆寫 ToString 方法傳回的型別名稱,以及它的值。

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

下表列出.NET Framework 中的類型分類,並指出是否在覆寫 Object.ToString 方法。

型別類別

覆寫 Object.ToString()

行為

類別

N/A

N/A

結構

[是] (ValueType.ToString)

與 Object.ToString() 相同

列舉

[是] (Enum.ToString())

成員名稱

介面

N/A

委派

N/A

請參閱覆寫繼承者區段,如需詳細資訊 ToString

除了覆寫的無參數 Object.ToString() 方法中,許多型別多載 ToString 方法,以提供的方法接受參數的版本。 大多數情況下,這是為了提供變數的格式,與區分文化特性設定的支援。

下列範例會多載 ToString 方法來傳回結果字串,其中包含的各種欄位的值 Automobile 類別。 它會定義四個格式字串︰ G,傳回的模型名稱和年份。D,傳回模型名稱、 年的門。C 中,它會傳回模型名稱、 年份和數目的磁柱。和 A,它會傳回所有四個欄位值的字串。

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

下列範例會呼叫多載 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

如需有關格式字串和文化特性格式的詳細資訊,請參閱 .NET Framework 中的格式化類型 支援的數值格式字串,請參閱 標準數值格式字串自訂數值格式字串 支援的日期和時間值的格式字串,請參閱 標準日期和時間格式字串自訂日期和時間格式字串

因為型別繼承預設 Object.ToString 方法,您可能會尋找非預期的行為並想要變更它。 特別是陣列和集合類別。 雖然您可能預期 ToString 方法以顯示其成員的值陣列或集合類別,改為顯示類型的完整型別名稱,如下列範例所示。

using System;
using System.Collections.Generic;

public class Example
{
   public static void Main()
   {
      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]

您有數個選項,以產生您想要的結果字串。

  • 如果類型是陣列、 集合物件或該物件會實作 IEnumerableIEnumerable<T> 介面,您可以使用列舉它的項目 foreach C# 中的陳述式或 For Each...Next 在 Visual Basic 中建構。

  • 如果類別不是 sealed (在 C# 中) 或 NotInheritable (在 Visual Basic 中),您可以開發其繼承自基底類別的包裝函式類別 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
    
  • 開發 擴充方法 傳回您想要的結果字串。 請注意,您無法覆寫預設 Object.ToString 方法以這種方式 (也就是您的延伸模組類別 (C# 中) 或 (在 Visual Basic) 的模組不能有一個名為的無參數方法 ToString ,而呼叫來取代原始型別 ToString 方法。 您必須提供其他的程式無參數的名稱 ToString 取代。

    下列範例會定義兩個方法來擴充 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 }
    

當您呼叫 ToString 方法中的類別上 Windows 執行階段, ,它提供的預設行為不覆寫的類別 ToString 這是 .NET Framework 針對 Windows 執行階段 提供的部分支援 (參閱 適用於 Windows 市集應用程式和 Windows 執行階段的 .NET Framework 支援)。 中的類別 Windows 執行階段 不繼承 Object, ,且永遠不要只實作 ToString 不過,它們一定出現有 ToString, ,Equals(Object), ,和 GetHashCode 方法,當您在您的 C# 或 Visual Basic 程式碼,使用與.NET Framework 會提供這些方法中的預設行為。

開頭為 .NET Framework 4.5.1, ,common language runtime 會使用 IStringable.ToString 上 Windows 執行階段 物件的預設實作回到之前 Object.ToString

System_CAPS_note注意

Windows 執行階段 以 C# 或 Visual Basic 撰寫的類別可以覆寫 ToString 方法。

從開始 Windows 8.1, 、 Windows 執行階段 包含 IStringable 介面的唯一方法 IStringable.ToString, ,提供相當於所提供的基本格式支援 Object.ToString 若要避免模稜兩可,您不應該實作 IStringable managed 型別上。

當受管理的物件稱為 「 原生程式碼或程式碼撰寫語言,例如 JavaScript 或 C + + /cli CX,它們會顯示實作 IStringable Common language runtime 會自動路由傳送來自呼叫 IStringable.ToStringObject.ToString 事件 IStringable 未受管理物件上實作。

System_CAPS_warning警告

因為 common language runtime 自動實作 IStringable 所有受管理中的型別 Windows 市集 應用程式中,我們建議您,您未提供您自己 IStringable 實作。 實作 IStringable 呼叫時,可能會導致非預期的行為 ToString 從 Windows 執行階段, 、 C + + /CX 中或 JavaScript。

如果您選擇實作 IStringable 中匯出公開 managed 類型中 Windows 執行階段 元件,請套用下列限制︰

  • 您可以定義 IStringable 介面只能在 「 類別實作 」 關聯性,例如

    public class NewClass : IStringable
    

    在 C# 中,或

    Public Class NewClass : Implements IStringable
    

    在 Visual Basic 中。

  • 您不能實作 IStringable 介面上。

  • 您無法宣告型別參數 IStringable

  • IStringable 不能是方法、 屬性或欄位的傳回型別。

  • 您無法隱藏您 IStringable 實作基底類別使用的方法定義,如下所示︰

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

    相反地, IStringable.ToString 實作一律必須覆寫基底類別實作。 您只能藉由針對強型別類別執行個體叫用 ToString 實作來隱藏該實作。

請注意,在各種不同的條件,從原生程式碼實作的 managed 型別 IStringable 或隱藏其 ToString 實作可能會產生非預期的行為。

繼承者注意事項︰

當您實作自己的型別時,您應該覆寫 ToString 方法來傳回屬於這些類型有意義的值。 衍生類別需要更多控制的格式比 ToString 提供可實作 IFormattable 介面。IFormattable.ToString(String, IFormatProvider) 方法可讓您定義控制格式的格式字串,並使用 IFormatProvider 可以提供特定文化特性的物件。

覆寫 ToString 方法應該遵循這些指導方針︰

  • 友善且判,應該是傳回的字串。

  • 傳回的字串應唯一識別物件的執行個體的值。

  • 傳回的字串應該越短越好,使其適合顯示偵錯工具。

  • ToString 覆寫不應傳回 String.Empty 或 null 字串。

  • ToString 覆寫不應該擲回例外狀況。

  • 如果執行個體的字串表示區分文化特性,或可以多種方式進行格式化,實作 IFormattable 介面。

  • 如果傳回的字串包含機密資訊,您應該先要求適當的權限。 如果要求成功,您可以傳回的機密資訊。否則,您應該會傳回排除機密資訊的字串。

  • ToString 覆寫應該有沒有副作用以避免在偵錯的複雜性。 例如,若要呼叫 ToString 方法不應該變更執行個體欄位的值。

  • 如果您的型別實作的剖析方法 (或 ParseTryParse 方法、 建構函式或其他靜態方法,從字串型別的執行個體具現化),您應該確認所傳回的字串 ToString 方法可以轉換成物件執行個體。

通用 Windows 平台
自 8 起供應
.NET Framework
自 1.1 起供應
可攜式類別庫
提供支援︰ 可攜式 .NET 平台
Silverlight
自 2.0 起供應
Windows Phone Silverlight
自 7.0 起供應
Windows Phone
自 8.1 起供應
回到頁首
顯示: