如何添加或减去同一类/类型的两个实例

Byr*_*ahl 17 c# types

我有一个代表一种数字的类型.在这种情况下,我正在使用兆瓦,所以我创建了一个名为Megawatt的类型.我希望能够像使用Int,Double或任何类型的c#数字类型一样使用这些兆瓦.这可能吗?如果是这样,我该怎么办?

例:

public class Megawatt{
    public double Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我希望能够这样做:

var startOfDay = new Megawatts{value=100};
var endOfDay = new Megawatts{value=65};
Megawatt result = startOfDay - endOfDay;
Run Code Online (Sandbox Code Playgroud)

这可以使用DateTime ...您可以从另一个中减去一个DateTime并获得TimeSpan.我希望做类似的事情.

Eri*_*ert 31

除了到目前为止发布的好答案:你应该使你的类型成为一个不可变的结构而不是一个可变的值类型.这正是为不可变值类型设计的那种工作.

struct Megawatt
{
    private double Value { get; private set; }
    public Megawatt(double value) : this()
    {
        this.Value = value;
    }
    public static Megawatt operator +(Megawatt x, Megawatt y)
    {
        return new Megawatt(x.Value + y.Value);
    }
    public static Megawatt operator -(Megawatt x, Megawatt y)
    {
        return new Megawatt(x.Value - y.Value);
    }
    // unary minus
    public static Megawatt operator -(Megawatt x)
    {
        return new Megawatt(-x.Value);
    }
    public static Megawatt operator *(Megawatt x, double y)
    {
        return new Megawatt(x.Value * y);
    }
    public static Megawatt operator *(double x, Megawatt y)
    {
        return new Megawatt(x * y.Value);
    }
}
Run Code Online (Sandbox Code Playgroud)

等等.请注意,您可以将两兆瓦加在一起,但不能乘以两兆瓦; 你只能乘以双倍的兆瓦.

您还可以添加更多单元类型.例如,你可以创建一个MegawattHour类型和一个类型小时,然后说兆瓦时间小时给MegawattHour.你也可以说有另一种类型的Joule,并且有从MegawattHour到Joule的隐式转换.

有许多编程语言支持这些类型的操作,其冗长程度低于C#; 如果你做了很多这类事情,你可能会考虑F#.

  • @Julien:你总是希望*值*是不可变的.考虑一个反应堆; 它有一个属性"输出".显然,输出可能会改变.假设你有两个反应堆,两者的输出都是12兆瓦.要将反应堆1的输出更改为13,您将反应堆1的输出*更改为13.您没有说"嘿12,12的值现在是13",因为这会改变*两者的输出值*反应堆. (8认同)

Roy*_*mir 11

你应该编写自己的运算符重载:

样品:

   public static Megawatt operator +(Megawatt c1, Megawatt c2) 
   {
      return new Megawatt(c1.value+ c2.value);
   }
Run Code Online (Sandbox Code Playgroud)