Лучшие практики: свойство, функция или ToString?
Я пытаюсь определить наилучшую практику при написании кода для получения строкового представления пользовательского класса.
Представьте, что у нас есть следующее:
public class DoubleParameter
{
public double Value { get; set; }
public string Description { get; set; }
public string Units { get; set; }
}
И нам нужна возможность получить строковое представление класса для целей отладки. Что касается читаемости / удобства сопровождения кода и лучших практик, я оцениваю три варианта
- Встроенное свойство
- Пользовательский метод
- Переопределение 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: спасибо за издание, намного понятнее;)