gpt4 book ai didi

c# - 我必须定义每个运算符(operator)吗?

转载 作者:太空狗 更新时间:2023-10-29 17:45:11 25 4
gpt4 key购买 nike

假设我有一个只有一个字段的结构:

public struct Angle
{
public static readonly double RadiansPerDegree = Math.PI / 180;

private readonly double _degrees;

public Angle(double degrees)
{
_degrees = degrees;
}

public double Degrees
{
get { return _degrees; }
}

public double Radians
{
get { return _degrees * RadiansPerDegree; }
}

public static Angle FromDegrees(double value)
{
return new Angle(value);
}

public static Angle FromRadians(double value)
{
return new Angle(value / RadiansPerDegree);
}
}

这很好用,直到我想做这样的事情:

var alpha = Angle.FromDegrees(90);
var beta = Angle.FromDegrees(100);
var inequality = alpha > beta;
var sum = alpha + beta;
var negation = -alpha;
//etc.

所以,我实现了 IEquatable<in T>IComparable<in T> , 但仍然没有启用任何运算符(甚至没有启用 ==<>= 等)。

因此,我开始提供运算符重载。

例如:

public static Angle operator +(Angle a, Angle b)
{
return new Angle(a._degrees + b._degrees);
}

public static Angle operator -(Angle a)
{
return new Angle(-a._degrees);
}

public static bool operator >(Angle a, Angle b)
{
return a._degrees > b._degrees;
}

但是,当我查看所有可能重载的运算符 (+, -, !, ~, ++, --, true, false, +, -, *, /, %, &, |, ^, <<, >>, ==, !=, <, >, <=, >=) 时,我开始觉得必须有更好的方法。毕竟结构体只包含一个字段,而且那个字段是值类型。

有什么方法可以启用 double 的所有运算符吗?一枪?或者我真的必须手动输入我可能想要支持的每个运算符吗?

(即使我有两个或三个字段,我仍然希望能够一次添加运算符...)

最佳答案

重载运算符的要点是定义如何添加以使用这些运算符来操作自定义类型的对象,因此如果您的第二个字段是字符串数组,您希望++ 运算符如何自动实现?没有明智的答案,特别是因为我们不知道对象的上下文或它的用法,所以答案是是的,您必须自己重载运算符

郑重声明,如果你真的只需要一个字段,而且它只是一个 double 型,那么一开始就不要使用结构体,除非你需要重载运算符来执行默认情况下执行的其他操作— 这是一个明显的过度工程案例!

关于c# - 我必须定义每个运算符(operator)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8920678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com