Как переопределяется и форматируется метод toString () внутри класса?

#c# #.net #overriding #tostring

#c# #.net #переопределение #tostring

Вопрос:

Я искал ответ как в Google, так и на этом сайте. Я также прочитал это в своей книге по классам, но я все еще не понимаю, как это применяется.

Вот что я знаю:

  • Он используется для отображения того, что объект знает о себе.

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

  • Он должен быть переопределен в используемом методе.

Комментарии:

1. Я не совсем уверен, о чем вы здесь спрашиваете?

2. @Kyle Я предполагаю, что я хочу узнать, как применяется toString, возможно, другим способом из моей книги. Я чего-то не понимаю, и я надеюсь, что один из ответов поможет.

Ответ №1:

Думая, что у вас есть класс, подобный:

 public class Person
{
   public string FirstName { get; set;}
   public string LastName { get; set;}
   private string age;
}
  

Используя это:

 public override string ToString()
{
   return string.Format("[First Name: {0}; Last Name: {1}; Age: {2}]", FirstName, LastName, age);
}
  

отобразит все внутренние компоненты класса. На самом деле его лучше всего использовать для быстрого извлечения общедоступных полей класса в предварительно отформатированном виде (таким образом, эффективно преобразуя данные, инкапсулированные в классе, в строку).

Также вот очень полезный совет из книги о C # 2010 и платформе .NET 4: «Многие классы (и структуры), которые вы создаете, могут извлечь выгоду из переопределения toString(), чтобы вернуть текстовое представление типа в виде строки текущего состояния. Это может быть весьма полезно для целей отладки (среди прочих причин). То, как вы решите создать эту строку, зависит от личного выбора; однако рекомендуемый подход заключается в том, чтобы разделять каждую пару имя / значение точкой с запятой и заключать всю строку в квадратные скобки. Однако всегда помните, что правильное переопределение toString() должно также учитывать любые данные, определенные в цепочке наследования. Когда вы переопределяете toString() для класса, расширяющего пользовательский базовый класс, первым делом необходимо получить значение toString() от вашего родителя, используя ключевое слово base. Как только вы получили строковые данные вашего родителя, вы можете добавить пользовательскую информацию производного класса.»

Комментарии:

1. Хорошо. Откуда берется строка. Откуда взялась часть формата?

2. В дополнение к тому, что вы показали выше, одна из причин, по которой мне нравится перезаписывать toString(), заключается в целях отладки. Когда вы работаете в режиме отладки и наводите курсор на объект или наблюдаете за объектом и т.д., Он использует toString() для форматирования отображаемого.

3. @Teoman, вы добавили в свой ответ, извините за дублирование.

4. строка. Форматирование — это просто создание строки, которую вы можете использовать для отображения текущих значений данных класса. toString будет использовать эту строку с текущими значениями для отображения строкового представления вашего объекта.

5. строка. Format на самом деле является ярлыком / псевдонимом для System. Строка. Format() статический класс, где {0}, {1} и т.д. внутри строки заменяется заданными переменными. Вы можете прочитать об этом здесь (очень полезный метод): msdn.microsoft.com/en-us/library/system.string.format.aspx

Ответ №2:

Базовый класс для всех .NET classes — это object тип. Класс object предоставляет вам реализацию по умолчанию, ToString() которая по умолчанию просто выводит имя класса, если только класс не переопределил ToString() метод для печати чего-то другого. Имя класса не особенно полезно, поэтому обычно рекомендуется переопределять ToString() в любом классе, который вы пишете, потому что это полезно для обеспечения удобочитаемого представления вашего класса. Отладчик фактически будет использовать вашу ToString() реализацию по умолчанию, когда вы захотите проверить экземпляр вашего класса.

В вашем классе все, что вам нужно сделать, это добавить этот метод:

 public override string ToString()
{
    // return a string that has something to do with your class
}
  

Пример:

 public class Person
{
    public string FirstName {get;set;}
    public string LastName {get;set;}
    public int Age {get;set;}

    public override void ToString()
    {
        // return whatever makes sense here...
        return string.Format("[Person: FirstName={0}, LastName={1}, Age={2}]", FirstName, LastName, Age);
    }
}
  

Обратите внимание, что string.Format метод — это просто способ создания строки. Первый аргумент в строке.Format — это «формат», который может содержать буквенный текст, а также заполнители для значений, которые вы будете указывать в качестве других аргументов. {0} , {1} и {2} приведенные выше заполнители для аргументов FirstName, LastName и Age, которые передаются после format. Я бы почитал о строке.Форматируйте, если хотите узнать больше.

Ответ №3:

Переопределить ToString() метод:

 public class Test
{
   public string FirstName { get; set; }

   public string LastName { get; set; }

   public override string ToString()
   {
      // Do your formatting here
      return LastName   ", "   FirstName;
   }
}
  

Ответ №4:

Вы должны переопределить toString() в своем классе. Допустим, у меня есть класс с m_nDays, m_nHours, m_nMinutes… тогда я мог бы переопределить toString () следующим образом:

 public override string ToString()
{
    return string.Format("{0,5}d - {1:00}:{2:00}", m_nDays, m_nHours, m_nMinutes);
}