Может/должен использовать неявный оператор вместо переопределения ToString?
У меня есть класс, который я хочу легко записать в строки (например, для ведения журнала). Могу ли я использовать неявный оператор для неявного применения объекта к строке, а не для переопределения метода ToString?
Например, у меня есть класс Person с именем и возрастом:
public class Person
{
public string Name { get; set; }
public int Age { get; set;}
}
Я могу переопределить ToString:
public override string ToString()
{
return String.Format("Name: {0}, Age: {1}", this.Name, this.Age);
}
Или я мог бы использовать неявный оператор:
public static implicit operator string(Person p)
{
return String.Format("Name: {0}, Age: {1}", p.Name, p.Age);
}
Теперь, передавая этот объект методу, который ожидает строку, вместо
Log(Person.ToString());
Я могу просто позвонить
Log(Person);
Я мог бы просто вызвать переопределенную ToString в неявном литье
public static implicit operator string(Person p)
{
return p.ToString();
}
Является ли это плохим использованием неявного приведения оператора в String?
Какова наилучшая практика при использовании этой функции?
Я подозреваю, что перегрузка ToString будет лучшим ответом, и если да, то у меня есть несколько вопросов:
- Когда я когда-либо буду использовать неявный приведение в String?
- Каков наилучший пример использования неявного приведения в String?
Ответы
Ответ 1
Использовать ToString
, подумайте о том, чтобы иметь регистратор, который сам может опросить тип, чтобы построить полезное строковое представление из объекта (даже преобразование в JSON может работать).
Ожидается, что переопределение ToString
приведет к созданию экземпляра экземпляра только с отображением.
Неявное преобразование должно использоваться, когда объект каким-то образом совместим с типом назначения. То есть у вас может быть тип, который представляет "LastName" и имеет некоторые специальные методы, но для большинства практических целей это строка. Person
определенно не похож на string
, поэтому неявное преобразование удивит людей, которые смотрят на код позже.
Обратите внимание на рекомендацию MSDN по неявным:
Используйте его для включения неявных преобразований между пользовательским типом и другим типом, если преобразование гарантировано не приведет к потере данных.