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

问题描述 投票:0回答:5

我浏览过的大多数网站和文章都通过给出以下标准示例来解释运算符重载。

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

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

运算符重载对于电子商务、电子银行或其他应用程序非常有用吗? 正如我看到上面给出的标准示例,很难掌握运算符重载的真正威力。 您能否根据需要提供示例来解释一下。

c# operator-overloading
5个回答
2
投票

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

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

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

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


1
投票

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

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

如你所见,这并不“科学”。 让我们这样说吧。如果您使用数据结构,并且减法、加法或逻辑运算应该做什么是常识,那么请使用运算符重载。如果你发明自己的结构和规则,你最好使用方法。规则是,重载运算符的使用不仅对您来说应该感觉非常自然,而且对阅读您代码的其他开发人员来说也应该感觉非常自然。


1
投票

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

因此,我创建了一个结构体,在内部将这些值表示为原始整数(我认为是自 2000 年 1 月以来的月数)。该结构包含许多方法,用于从各种输入类型(DateTimes、可以转换为日期时间或不带年份的日期时间的字符串等)实例化该 CalendarMonth 结构的实例。该结构有一个

CalendarMonth Parse(string inputValue)
bool TryParse(string inputValue out CalendarMonth calMonth)
方法,因为这些功能在整个应用程序中都被使用。

此结构还封装了返回该月第一天、该月最后一天、UTC 月初等日期时间值的方法。

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

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


0
投票

@罗伯特同意了。如果您需要修改运算符,只需编写一个函数或“方法”。在我看来,运算符重载不仅没有必要,而且会使您的代码几乎不可读


0
投票

请不要滥用运算符重载,如果你能以任何方式帮助它。 问题在于代码的可读性——当你看到:

时很容易感到困惑
CustomerCart cart = new CustomerCart();
IList<Purchases> purchases = this.GetPurchases();

然后在代码中:

bool success = cart + purchases;

这肯定会让我再三考虑。 对于您提出的更多“原始”类型,例如

Complex
,您可以摆脱这种情况,但通常对于高级类型,您希望避免操作重载,因为它会混淆代码。

© www.soinside.com 2019 - 2024. All rights reserved.