本文由机器翻译。若要查看英语原文,请勾选“英语”复选框。 也可将鼠标指针移到文本上,在弹出窗口中显示英语原文。
翻译
英语

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()

行为

结构

是 (ValueType.ToString)

Object.ToString() 相同

枚举

是 (Enum.ToString())

成员名称

接口

No

delegate

No

有关重写,请参阅对继承者部分以了解更多信息说明 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 运行时 提供的支持的一部分 (请参见.NET Framework 对 Windows 应用商店应用程序和 Windows 运行时的支持情况)。 中的类 Windows 运行时 不会继承 Object, ,并不总是实现 ToString 但是,它们总是看上去拥有 ToString, ,Equals(Object), ,和 GetHashCode 方法在你使用它们在 C# 或 Visual Basic 代码中,而且.NET 框架将为这些方法提供默认行为时。

从开始 .NET Framework 4.5.1, ,公共语言运行时将使用 IStringable.ToString 上 Windows 运行时 对象在回退到的默认实现之前 Object.ToString

System_CAPS_note说明

Windows 运行时 用 C# 或 Visual Basic 编写的类可以重写 ToString 方法。

从开始 Windows 8.1, 、 Windows 运行时 包括 IStringable 接口的单一方法 IStringable.ToString, ,提供类似于提供的基本格式设置支持 Object.ToString 若要防止二义性,不应实现 IStringable 上托管类型。

通过本机代码或用 JavaScript 或 C + 等语言编写的代码的托管的对象调用时 + /CX 中,它们看起来实现 IStringable 公共语言运行时自动将路由来自调用 IStringable.ToStringObject.ToString 在事件 IStringable 未在托管对象上实现。

System_CAPS_warning警告

因为公共语言运行时自动实现 IStringable 所有的托管类型中的 Windows 应用商店 应用程序中,我们建议您不要提供您自己 IStringable 实现。 实现 IStringable 调用时,可能会导致意外行为 ToString 从 Windows 运行时, 、 C + + /CX 中或 JavaScript。

如果你选择实现 IStringable 中导出的公共托管类型中 Windows 运行时 组件,则以下限制适用︰

  • 您可以定义 IStringable 接口仅在"类实现"关系中,如

    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 接口。IFormattable.ToString(String, IFormatProvider) 方法使您能够定义格式字符串,用于控制格式设置,并使用 IFormatProvider 可为特定于区域性的格式设置的对象。

重写 ToString 方法应遵循以下准则︰

  • 返回的字符串应友好且可读的形式。

  • 返回的字符串应唯一地标识对象实例的值。

  • 返回的字符串应尽可能短,以便它适合于显示由调试器。

  • ToString 重写不应返回 String.Empty 或空字符串。

  • 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 起可用
返回页首
显示: