Лучшие практики: свойство, функция или ToString?

Я пытаюсь определить наилучшую практику при написании кода для получения строкового представления пользовательского класса.

Представьте, что у нас есть следующее:

public class DoubleParameter
{
    public double Value { get; set; }
    public string Description { get; set; }
    public string Units { get; set; }
}

И нам нужна возможность получить строковое представление класса для целей отладки. Что касается читаемости / удобства сопровождения кода и лучших практик, я оцениваю три варианта

  1. Встроенное свойство
  2. Пользовательский метод
  3. Переопределение ToString()

Большинство из них очень похожи с точки зрения компилятора - но есть ли объективные причины, чтобы предпочесть какой-либо конкретный вариант с точки зрения удобочитаемости / удобства сопровождения? Или это вопрос личных предпочтений?

Примеры использования:

// Option 1 - Inline Property
public string ReadableValue => 
    $"{this.Description} => {this.Value.ToString("F2")} ({this.Units})";
// example usage: Console.WriteLine(myVar.ReadableValue);

// Option 2 - Custom Method
public string ToReadable() =>
    $"{this.Description} => {this.Value.ToString("F2")} ({this.Units})";
// example usage: Console.WriteLine(myVar.ToReadable());

// Option 3 - Overriding ToString()
public override string ToString() =>
    $"{this.Description} => {this.Value.ToString("F2")} ({this.Units})";
// example usage: Console.WriteLine(myVar);

3 ответа

Решение

В целях отладки ToString() выигрывает.

Зачем? Потому что, когда вы шагаете по коду с помощью VisualStudio, VS легко отобразит результаты ToString(), когда вы наведете курсор на переменную или поместите переменную в окно просмотра. В противном случае, вам нужно покопаться, чтобы получить интересующую вас недвижимость. Это может быть особенно раздражающим, если вы работаете со списками / перечислениями и т. Д.

Кроме того, ToString() уже существует и, как предполагается, уже является текстовым представлением экземпляра вашего объекта. В этом весь смысл. Зачем добавлять другое свойство, которое также является строковым представлением вашего объекта?

Я советую вам сделать свойство частным и использовать его внутри как значение для атрибута [DebuggerDisplayAttribute], как это

[DebuggerDisplay("{ReadableValue},nq")] public class DoubleParameter { private string ReadableValue { get; } }

Большое спасибо за все ваши комментарии.

Я в линии большинства из вас: использовать ToString() и приятно знать, что я не одинок. Но, в конце концов, кажется, что мы собираемся "сохранить" его для последующих целей регистрации.

@LarsTech: спасибо за издание, намного понятнее;)

Другие вопросы по тегам