在C#中重载赋值运算符

我知道=运算符不能被重载,但是一定有办法做到我想在这里:

我只是创build类来表示量化单位,因为我正在做一些物理学。 显然,我不能只从一个原始的inheritance,但我希望我的类与原语完全一样 – 我只是希望它们以不同的方式input。

所以我可以去,

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

等等

我不知道如何做到这一点。 我想我只是写这样的一些类:

 class Power { private Double Value { get; set; } //operator overloads for +, -, /, *, =, etc } 

但显然我不能重载赋值运算符。 有什么办法可以得到这种行为?

这听起来像你应该使用一个结构,而不是一个类…然后创build一个隐式的转换运算符,以及各种运算符添加等。

以下是一些示例代码:

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

(作为一个侧面说明…我不明白这是如何真正代表一个速度,当然,这需要一个方向,以及一个规模。)

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

把它们变成不变的结构也是一个好主意。 这就是“原始”,正是这些原因使它不可能inheritance。 你想要一个结构,因为你需要值types的语义,而不是引用types的语义。 而你希望它们是不变的,因为可变值types通常是一个坏主意。

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

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