Данная статья переведена с помощью средств машинного перевода. Чтобы просмотреть ее на английском языке, установите флажок Английский. Вы также можете просматривать английский текст во всплывающем окне, наводя указатель мыши на переведенный текст.
Перевод
Английский

Метод Object.ToString ()

 

Опубликовано: Октябрь 2016

Возвращает строковое представление текущего объекта.

Пространство имен:   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())

Имя элемента

Интерфейс

Нет

Н/Д

Делегат

Нет

Н/Д

См. примечания для наследующих объектов раздел для получения дополнительных сведений о переопределении ToString.

Помимо переопределения параметров Object.ToString() перегрузку метода, многие типы ToString метод для предоставления версии метода, которые принимают параметры. Чаще всего это делается для обеспечения поддержки форматирования переменных и форматирования с учетом языка и региональных параметров.

В следующем примере метод ToString перегружается таким образом, чтобы возвращать строку, состоящую из различных полей класса Automobile. Он определяет четыре строки формата: G, который возвращает имя модели и год. D, который возвращает имя модели, года и количества дверей; C, который возвращает имя модели, год и число цилиндров; и объект, который возвращает строку со значениями всех четырех полей.

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]

Существует несколько вариантов и получить результат, хотелось бы.

  • Если тип является массивом, объект коллекции или объект, реализующий интерфейс IEnumerable или IEnumerable<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, общеязыковая среда выполнения будет использовать 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.ToString в Object.ToString событий IStringable не реализован в управляемый объект.

System_CAPS_warningПредупреждение

Поскольку общеязыковая среда выполнения автоматически реализует IStringable для всех управляемых типов в Магазин Windows приложений, мы рекомендуем не введены собственные IStringable реализации. Реализация IStringable может привести к непредвиденному поведению при вызове ToString из Среда выполнения Windows, C + +/ CX или JavaScript.

Если вы решили реализовать IStringable в открытом управляемом типе, экспортированном в Среда выполнения Windows компонента, применяются следующие ограничения:

  • Можно определить IStringable интерфейса только в отношении «class implements», таких как

    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 можно скрыть только путем вызова этого метода в строго типизированном экземпляре класса.

Обратите внимание, что в разных случаях вызовы из машинного кода управляемый тип, реализующий IStringable или скрывает его ToString реализация может привести к непредвиденному поведению.

Заметки для разработчиков производных классов:

При реализации собственных типов должны переопределять ToString для возврата значений, которые важны для этих типов. Производные классы, которые требуется больший контроль над форматированием чем ToString предоставляет можно реализовать IFormattable интерфейса. Его IFormattable.ToString(String, IFormatProvider) метод позволяет определять строки формата, управляющие форматированием и использовать IFormatProvider объект, который может предоставить для форматирования с учетом языка и региональных параметров.

Переопределений ToString метод придерживаться следующих правил:

  • Возвращаемая строка должно быть понятным и машиночитаемый формат.

  • Возвращаемая строка должна уникально идентифицировать значение экземпляра объекта.

  • Возвращаемая строка должно быть как можно более короткими, чтобы он подходит для отображения с помощью отладчика.

  • Ваш ToString переопределения не должен возвращать String.Empty или пустая строка.

  • Ваш ToString переопределения не должен создавать исключение.

  • Если строковое представление экземпляра с учетом языка и региональных параметров или могут быть отформатированы различными способами, реализовать IFormattable интерфейса.

  • Если возвращаемая строка содержит важные сведения, следует сначала запрашивать соответствующее разрешение. Если требование завершается успешно, вы можете вернуть конфиденциальной информации; в противном случае — должен вернуть строку, не содержит конфиденциальные сведения.

  • Ваш ToString переопределение должно иметь не наблюдаемые побочных эффектов, чтобы избежать затруднений при отладке. Например, вызов ToString метод не должен изменять значения полей экземпляра.

  • Если тип реализует метод синтаксического анализа (или Parse или TryParse метода, конструктора или некоторые другой статический метод, который создает экземпляр типа из строки), необходимо убедиться, что строка, возвращаемая функцией ToString метод может быть преобразован в экземпляр объекта.

Универсальная платформа Windows
Доступно с 8
.NET Framework
Доступно с 1.1
Переносимая библиотека классов
Поддерживается в: переносимые платформы .NET
Silverlight
Доступно с 2.0
Windows Phone Silverlight
Доступно с 7.0
Windows Phone
Доступно с 8.1
Вернуться в начало
Показ: