Может/должен использовать неявный оператор вместо переопределения 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 по неявным:

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