2014-10-25 5 views
10

У меня есть класс, который я хочу легко записать в строки (например, для ведения журнала). Могу ли я использовать неявный оператор для неявного применения объекта к строке, а не для переопределения метода 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 будет лучшей практикой ответ, и если да, у меня есть несколько вопросов, то:

  1. Когда я когда-либо использовать неявное приведение к String?
  2. Каков наилучший пример использования неявного приведения в String?

ответ

13

Использовать ToString, считать, что имеет регистратор, который сам может опросить тип, чтобы построить полезное представление строки из объекта (даже преобразование в JSON может работать).

Ожидается, что переопределение ToSTring приведет к созданию экземпляра экземпляра «только на дисплее».

Неявное преобразование должно использоваться, когда объект каким-то образом совместим с типом назначения. То есть у вас может быть тип, который представляет «LastName» и имеет некоторые специальные методы, но для большинства практических целей это строка. Person определенно не похож на string, поэтому неявное преобразование удивит людей, которые смотрят на код позже.

Примечание Рекомендация MSDN на implicit:

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

Смежные вопросы