【问题标题】:Is it possible to override assignment "=" in C# [duplicate]是否可以在 C# 中覆盖赋值“=”[重复]
【发布时间】:2013-09-17 21:35:20
【问题描述】:

我有一个复杂的对象类型,我将覆盖“base.ToString()”方法,以便它返回一个字符串属性值。

例如:

class foo
{
 public string StringValue{get;set;}
 public int SomeOtherValue{ get;set;}
 public override ToString()
 {
   return StringValue;
 }
}

所以这让我可以轻松地使用检索 StringValue 属性的值。

有没有一种方法可以覆盖或扩展基本功能,以便我可以使用如下简单代码来设置 StringValue 属性?

foo aFoo = new foo();
aFoo = "Some string value";

【问题讨论】:

  • aFoo.StringValue = "Some string value"; 真的那个很难打字吗? ;-)
  • 现在我正确阅读了这个问题,我必须同意亚当的观点。 C# 在这里故意不提供支持,因此阅读代码可以清楚地知道到底发生了什么。我们没有从 C++ 中学到任何东西吗?
  • 顺便说一句,你的理由是什么?懒惰? (不要误会我的意思,我尊重这一点)还是有意混淆您的开发人员? :-D 说真的,我真的很讨厌各种运算符重载。如果不出意外,“转到定义”不起作用,并且您无法通过查看代码来了解发生了什么。
  • 我不认为有办法,但认为我还是会问。我真的很懒惰,因为我有大量遗留代码需要从直接分配更改为现在需要的。

标签: c#


【解决方案1】:

您不能像 here 所述重载 = 运算符

有关可覆盖运算符的完整列表,请参阅 this page

【讨论】:

    【解决方案2】:

    您可以使用隐式转换运算符重载:http://msdn.microsoft.com/library/z5z9kes2.aspx

    【讨论】:

    • 这将导致创建一个全新的foo,而不是简单地设置现有fooStringValue 属性。也就是说,根据使用情况,它可能仍然是一个足够好的解决方案。
    【解决方案3】:

    不,这是不可能的。赋值运算符不可重写,这是有充分理由的。

    即使在 C# 和现代面向对象编程语言的范围内,开发人员也经常“滥用”系统以使其做不应该做的事情。如果您可以赋予与将变量引用值传递给赋值运算符不同的含义,请考虑一下当没有经验的开发人员使用它时会造成的混乱。

    可以做的是提供允许您的对象从字符串中获取其值的方法,如下所示:

    afoo.TakeValuesFrom("Some string value");
    

    MyThingy afoo = MyThingy.FromString("Some string value");
    

    这与您所要求的几乎相同,并且完全合法且可读。

    【讨论】:

    • 虽然其他人的答案都是有效的,但我选择你的答案是为了建议添加 FromString 方法,这就是我将采用的方法。
    【解决方案4】:

    不,你不能。它是 C# 语言规范的受保护部分。能够覆盖这一点就像覆盖你的身体用呼吸水呼吸空气的能力。

    【讨论】:

      【解决方案5】:

      使用隐式转换运算符。它将完全满足您的需求

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-16
        • 1970-01-01
        • 2012-07-06
        • 1970-01-01
        • 2012-03-16
        • 2017-03-11
        • 2010-09-06
        • 2012-07-01
        相关资源
        最近更新 更多