代码之家  ›  专栏  ›  技术社区  ›  Corey

将运算符应用于非数学对象?

  •  2
  • Corey  · 技术社区  · 17 年前

    我很好奇一些运算符如何在对象方面(+,-)工作。

    我一直想知道事件处理程序如何通过添加一个方法来工作:

    Foo.Action += new FooActionHandler
    

    如果不是一个事件,返回一个比较怎么样?

    DateTime - DateTime
    

    它返回一个TimeSpan对象,我对如何实现有点困惑。我一直在使用这些方法,但我从未理解它们的内部工作原理。我如何创建自己的类来做类似的事情?

    9 回复  |  直到 17 年前
        1
  •  10
  •   womp    17 年前

    可以重载运算符以执行所需的任何操作。 Here is some good documentation 如何在C中完成。

    它的要点是您为操作符(您的类)提供一个上下文,以及它的参数发生了什么。示例可能如下所示:

       // Overload '+' for my class
       public static MyClass operator +(MyClass c1, MyClass c2) 
       {
          MyClass newMyClass = new MyClass();
          newMyClass.MyIntProperty = c1.MyIntProperty + c2.MyIntProperty;
          return newMyClass;
       }
    
        2
  •  3
  •   Lucas Jones    17 年前

    您可以这样定义运算符:

    public static MyClass operator +(MyClass a, MyClass b) { }
    

    对-、*等使用相同的语法。

    以下是一些建议(我的意见主要是):

    • 不要把实际的逻辑放在运算符中-创建一个静态方法。
        // NOT
        public static MyClass operator +(MyClass a, MyClass b) { /* ... */ }
        // YES
        public static MyClass Add(MyClass a, MyClass b) { return new MyClass(a.Prop + b.Prop); }
        public static MyClass operator +(MyClass a, MyClass b) { return Add(a, b); }
    
    • 不要让操作员去做他们不该做的事情——也就是说,不要使用 + 添加到列表中,或 - 例如,从列表中删除。 这会导致两个问题:
      1. 在社区里不太受欢迎
      2. 如果不小心添加了两个对象,编译器就不会捕获错误。
        3
  •  1
  •   Matthew Vines    17 年前

    这称为运算符重载。谷歌将返回许多文章,解释它是如何工作的,以及何时使用和不使用它。

    http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=88

        5
  •  0
  •   Matthew Manela    17 年前

    它被称为运算符重载。C允许您超载选择运算符。

    有更多关于这个的信息 here .

        6
  •  0
  •   Neil N HLGEM    17 年前

    你可以重载一个操作符来做你想做的任何事情。

    假设我有一个卡车类和机器类,我想能够做到:

    变压器MYTransformer=MYtruck+MYgun;

        7
  •  0
  •   Brandon    17 年前

    事件处理程序的+=和-=是委托的快捷方式。Combine和Delegate.Remove,这是通过运算符重载完成的,请参见 this site 了解更多详细信息。

        8
  •  0
  •   Dan Herbert    17 年前

    这称为运算符重载。它被框架广泛使用,但是您应该避免这样做,因为如果您不知道自己在做什么,它可能会导致一些坏代码。

    大多数程序员不希望看到一个自定义类中的运算符过载,这样当其他程序员必须查看您的代码并弄清楚发生了什么时,它就会变成维护地狱。

    当然,在某些情况下,您可能会发现它很有用,但通常您最好只使用方法而不是创建运算符重载。您可以在此处从Microsoft获得更多信息:

    http://msdn.microsoft.com/en-us/library/aa288467.aspx

        9
  •  0
  •   stevemegson    17 年前

    很多答案都涵盖了你是如何做到这一点的。现在记住,你几乎永远不想自己动手。您需要确保使用类的任何人都会同意您减去两个MyClass对象的含义。如果它代表某种数学结构(向量、矩阵等),那么你可能是安全的。否则,可能还不清楚。注意,Microsoft为日期时间定义了减法,但不允许

    List<string> myList = new List<string>();
    myList += "foo";
    

    任何时候你写

    static Foo operator -( Foo a, Foo b )
    

    然后想想如果你不能覆盖减法,你会怎么叫这个方法。如果最好的名字不是 Subtract ,那么您可能只想用另一个名称创建一个方法。