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

时间:2009-11-19 19:18:58

标签: c# operator-overloading

我所经历的大多数网站,文章通过给出了解释运营商的重载 遵循标准示例。

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

}   

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

运营商超载是否对电子商务,电子银行或其他应用程序非常有用? 正如我们看到上面给出的标准示例,很难掌握运算符的实际功能 重载。请你通过提供必要的例子来解释它。

5 个答案:

答案 0 :(得分:2)

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

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

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

但建议谨慎。过载必须对其他程序员有概念意义。为了提供一个简单荒谬的例子,将加法定义为减法是完全可行的(但根本不可接受)。

答案 1 :(得分:1)

只是运算符从.NET Framework重载的示例

Console.WriteLine(DateTime.Now + TimeSpan.FromDays(1));

正如你所看到的,它不是“科学的”。 我们这样说吧。如果您使用数据结构进行操作,那么通常需要了解减法,加法或逻辑运算应该做什么,那么请使用运算符重载。如果您发明自己的结构和规则,最好使用方法。规则是,重载运算符的使用应该让您感觉非常自然,而不仅仅是其他开发人员阅读您的代码。

答案 2 :(得分:1)

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

所以,我创建了一个结构,在内部将这些值表示为一个原始整数,(我认为自2000年1月以来的月数)。此结构包括许多方法,用于从各种输入类型(DateTimes,可以转换为日期时间的字符串或一年中的日期时间等)来实例化此CalendarMonth结构的实例。该结构具有CalendarMonth Parse(string inputValue)和{{{ 1}}方法,因为在这个应用程序中使用了这些功能。

此结构还封装了返回第一个月,该月的最后一天,当月UTC的开始等的dateTime值的方法等。

它还有许多运算符重载,因此我可以“添加/减去”一个日历月的时间段并获取CalendarMonth,或者减去两个CalendarMonth结构以获得TimeSpan ...有点像日期时间。它还具有隐式和显式转换运算符重叠,以在日期时间和CalendarMonth结构之间来回转换...

我会说,一般来说,只要你的域中有一个类型可以被称为值类型(因为它没有“身份”,但它只是通过它的属性值定义,这种技术很有用,并且在您的应用程序所在的问题域中具有 定量 行为质量。

答案 3 :(得分:0)

@罗伯特同意了。如果你需要修改一个操作符,只需编写一个函数或'方法'。操作员超载,在我的拙见中,不仅没有必要,它使你的代码几乎不可读

答案 4 :(得分:0)

如果您能以任何方式提供帮助,请不要滥用运算符重载。问题在于代码可读性 - 当你看到它时很容易混淆:

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

以及稍后的代码:

bool success = cart + purchases;

这肯定会让我做一个双重考虑。使用更多“原始”类型(例如Complex),您可以避免这种情况,但通常使用高级类型,以避免操作重载,因为它会混淆代码。