可以/我应该使用隐式运算符而不是重写ToString吗?

时间:2014-10-25 02:39:07

标签: c# operator-overloading implicit-conversion

我有一个类,我想轻松写出字符串(例如用于记录目的)。我可以使用隐式运算符将对象隐式转换为字符串而不是覆盖ToString方法吗?

例如,我有一个类,其中名称年龄

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的最佳实践示例是什么?

1 个答案:

答案 0 :(得分:15)

使用ToString,考虑让记录器本身可以询问类型以从对象构造有用的字符串表示(甚至可以转换为JSON)。

覆盖ToSTring是生成实例的“仅显示”版本的预期方法。

当对象以某种方式与目标类型兼容时,应使用隐式转换。即您可能具有表示“LastName”的类型并具有一些特殊方法,但对于大多数实际用途,它是一个字符串。 Person肯定不会感觉像string那么隐式转换会让那些稍后查看代码的人感到惊讶。

请注意implicit上的MSDN建议:

  

如果转换保证不会导致数据丢失,则使用它来启用用户定义类型与其他类型之间的隐式转换。