C#运算符重载-走向实用

C#运算符重载-走向实用,c#,operator-overloading,C#,Operator Overloading,我浏览过的大多数网站和文章都通过给出 下面是一个标准示例 class Complex { int real; int imaginary; public Complex(int real, int imaginary) { this.real = real; this.imaginary = imaginary; } public stati

我浏览过的大多数网站和文章都通过给出 下面是一个标准示例

class Complex
    {
        int real;
        int imaginary;

        public Complex(int real, int imaginary)
        {
            this.real = real;
            this.imaginary = imaginary;
        }

        public static Complex operator +(Complex com1, Complex com2)
        {
            return new Complex(com1.real + com2.real, 
                    com1.imaginary + com2.imaginary);
        }

        public override string ToString()
        {
            return (String.Format("{0} + {1}i", real, imaginary));
        }
}

}   
作为初学者,我们认为运算符重载对于科学应用非常有用

操作员重载对于电子商务、电子银行或其他应用程序是否非常有用? 正如上面给出的标准示例所示,很难掌握操作符的真正能力
重载。请您根据需要提供示例进行解释。

在您提到的应用程序中,加减法(以及其他需要的数学)是常用的标准化操作,因此不需要重载

对于所有其他操作,我更喜欢使用方法

科学示例对于运算符重载很有用,因为它根据系统未知的数据类型重新定义数学运算。如果您想要创建一个自定义对象,该对象在语义上可以被另一个自定义对象实例添加或减去,那么操作符重载可能是合适的


但建议谨慎行事。重载必须对其他程序员有概念上的意义。举一个极其荒谬的例子,将加法定义为减法是完全可行的(但根本不能接受)。

@Robert同意。如果需要修改运算符,只需编写函数或“方法”。运算符重载,依我拙见,它不仅没有必要,而且会使您的代码几乎无法阅读

请不要滥用运算符重载,如果您能提供任何帮助的话。问题在于代码可读性—当您看到以下内容时,很容易感到困惑:

CustomerCart cart = new CustomerCart();
IList<Purchases> purchases = this.GetPurchases();

这肯定会让我加倍努力。对于您提出的更多“基本”类型,例如
Complex
,您可以避免这种情况,但通常对于高级类型,您希望避免操作重载,因为它会混淆代码。

只是.NET Framework中运算符重载的一个示例

Console.WriteLine(DateTime.Now + TimeSpan.FromDays(1));
正如你所看到的,它不是“科学的”。
让我们这样说吧。如果使用数据结构进行操作,减法、加法或逻辑运算应该做什么是常识,那么请使用运算符重载。如果你发明了自己的结构和规则,你最好使用方法。规则是,使用重载运算符不仅对您,而且对阅读您的代码的其他开发人员来说都应该感到非常自然。

好的,下面是一个示例。我有一个应用程序,其中许多域对象都包含一个属性,该属性指定一个“日历月”,其中一个月的具体日期是I相关的。(1998年12月、2003年3月等)

因此,我创建了一个结构,在内部将这些值表示为一个原始整数(我想是2000年1月以来的月数)。此结构包含许多方法,用于从各种输入类型(日期时间、可转换为日期时间或日期时间的字符串,不包括年份等)实例化此CalendarMonth结构的实例。此结构具有
日历月解析(字符串inputValue)
布尔锥虫(string inputValue out CalendarMonth)
方法,因为这些功能位在整个应用程序中都使用

此结构还封装了一些方法,这些方法返回当月第一天、月末最后一天、月初UTC等的dateTime值

它也有很多操作符重载,所以我可以在一个日历月中“加/减”一个timespan,得到一个CalendarMonth,或者减去两个CalendarMonth结构,得到一个timespan…有点像datetimes。它还有隐式和显式的强制转换操作符覆盖,可以在datetimes和CalendarMonth结构之间来回转换


我想说的是,一般来说,只要域中有一个类型可以称为值类型(因为它没有“标识”),这种技术就非常有用,但它仅由属性值定义,并且在应用程序所在的问题域中具有定量的行为特性。

同意。即使您可以执行
cart,我只想指出,如果您使用运算符重载,您不应该让运算符修改任何操作数。对于复数I将考虑使用结构而不是类,它使语义更加直观。
Console.WriteLine(DateTime.Now + TimeSpan.FromDays(1));