在C#中重载赋值运算符

时间:2010-12-27 09:44:07

标签: c# operator-overloading

我知道=运算符不能重载,但必须有办法在我这里做我想要的:

我只是创建表示定量单位的类,因为我正在做一些物理学。显然我不能只从一个原语继承,但我希望我的类的行为与原语完全一样 - 我只是想让它们以不同的方式输入。

所以我可以去,

Velocity ms = 0;
ms = 17.4;
ms += 9.8;

我不知道该怎么做。我想我会写一些像这样的类:

class Power
{
    private Double Value { get; set; }

    //operator overloads for +, -, /, *, =, etc
}

但显然我不能重载赋值运算符。有什么办法可以解决这个问题吗?

3 个答案:

答案 0 :(得分:82)

听起来你应该使用 struct 而不是类...然后创建一个隐式转换运算符,以及各种运算符来添加等。

以下是一些示例代码:

public struct Velocity
{
    private readonly double value;

    public Velocity(double value)
    {
        this.value = value;
    }

    public static implicit operator Velocity(double value)
    {
        return new Velocity(value);
    }

    public static Velocity operator +(Velocity first, Velocity second)
    {
        return new Velocity(first.value + second.value);
    }

    public static Velocity operator -(Velocity first, Velocity second)
    {
        return new Velocity(first.value - second.value);
    }

    // TODO: Overload == and !=, implement IEquatable<T>, override
    // Equals(object), GetHashCode and ToStrin
}

class Test
{
    static void Main()
    {
        Velocity ms = 0;
        ms = 17.4;
        // The statement below will perform a conversion of 9.8 to Velocity,
        // then call +(Velocity, Velocity)
        ms += 9.8;
    }
}

(作为旁注......我不明白这是如何真正代表速度的,因为当然需要方向和幅度。)

答案 1 :(得分:10)

您可以创建隐式转换运算符。有一个page on MSDN有一个很好的例子。

使它们成为不可变的结构也是一个好主意。这正是“基元”的含义,而这就是不可能继承它们的原因。您需要一个结构,因为您需要值类型语义,而不是引用类型语义。并且您希望它们不可变,因为可变值类型通常是bad idea.

答案 2 :(得分:-9)

我认为它不能被重载,因为C#类都是从Object派生的,所以它们基本上是对象,当你使用赋值运算符时,你基本上只是引用另一个对象。另一方面,如果您使用结构,那么您基本上需要所有信息,因此当您使用=运算符时,将复制所有字段。

所以我会说,面对它,并实现一个名为Copy()的函数,你应该没问题: - )