【问题标题】:Can/should I use implicit operator instead of overriding ToString?我可以/应该使用隐式运算符而不是覆盖 ToString 吗?
【发布时间】:2014-12-20 22:27:16
【问题描述】:

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

例如,我有一个带有 NameAgePerson 类:

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();
}


这是对隐式运算符转换为字符串的不好使用吗? 需要此功能时的最佳做法是什么? 我怀疑仅重载 ToString 将是最佳实践答案,如果是这样,我有几个问题:

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

【问题讨论】:

    标签: c# operator-overloading implicit-conversion


    【解决方案1】:

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

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

    当对象以某种方式与目标类型兼容时,应使用隐式转换。 IE。你可能有代表“姓氏”的类型并有一些特殊的方法,但对于大多数实际目的来说,它是一个字符串。 Person 绝对不像 string 那样的隐式转换会让以后看代码的人感到惊讶。

    注意 MSDN 对 implicit 的建议:

    使用它来启用用户定义类型和另一种类型之间的隐式转换,如果保证不会导致数据丢失

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-05
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      相关资源
      最近更新 更多