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

Can/should I use implicit operator instead of overriding ToString?

我有一个类,我希望它能很容易地写出字符串(例如,用于日志记录)。是否可以使用隐式运算符将对象隐式转换为字符串,而不是重写ToString方法?

例如,我有一个人名和年龄的Person类:

1
2
3
4
5
public class Person
{
    public string Name { get; set; }
    public int Age { get; set;}
}

我可以覆盖到字符串:

1
2
3
4
public override string ToString()
{
    return String.Format("Name: {0}, Age: {1}", this.Name, this.Age);
}

或者我可以使用隐式运算符:

1
2
3
4
public static implicit operator string(Person p)
{
    return String.Format("Name: {0}, Age: {1}", p.Name, p.Age);
}

现在,当将此对象传递给需要字符串的方法时,

1
Log(Person.ToString());

我可以打电话

1
Log(Person);

我甚至可以在隐式演员表中调用重写的ToString

1
2
3
4
public static implicit operator string(Person p)
{
    return p.ToString();
}

< BR>这是隐式运算符强制转换为字符串的错误用法吗?当需要此功能时,什么是最佳实践?我怀疑仅仅是过载到字符串将是最佳实践答案,如果是这样,我有几个问题,那么:

  • 我什么时候会使用隐式强制转换字符串?
  • 使用隐式强制转换为字符串的最佳实践示例是什么?

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

    重写ToString是生成实例的"仅显示"版本的预期方法。

    当对象以某种方式与目标类型兼容时,应使用隐式转换。也就是说,您可能有表示"lastname"的类型,并且有一些特殊的方法,但对于大多数实际用途来说,它是一个字符串。Person肯定不觉得自己是string,所以隐式转换会让以后看代码的人感到惊讶。

    注意:关于隐含的msdn建议:

    Use it to enable implicit conversions between a user-defined type and another type, if the conversion is guaranteed not to cause a loss of data.