gpt4 book ai didi

c# - 为只读结构实现相等的最佳实践是什么?

转载 作者:行者123 更新时间:2023-12-04 11:36:23 25 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.

去年关闭。




Improve this question




我去年刚开始用 C# 编程,我还在学习这门语言。我有一个关于 readonly struct 的问题类型和相等比较方法。

在 C# 中创建结构体时,我知道它通常被认为是实现 IEquatable 的最佳实践。因为默认的基于反射的比较非常慢。我还了解到,在 C# 7.2 及更高版本中,我们可以定义 readonly结构体,对于这些类型,我们也可以使用 in parameter避免不必要的复制。

由于结构通常被定义为不可变的只读类型,我认为为只读结构定义 Equals 方法并不罕见。

然而,鉴于上述事实,我想知道是否有一种有效的方法来为它们实现相等比较方法。我的观点是这些等式方法和运算符实际上都不需要修改参数,所以我想利用 in参数以某种方式保存不必要的复制。

以下是我在这样做的尝试:

public readonly struct Point : IEquatable<Point>
{
public int X { get; }
public int Y { get; }

public Point(int x, int y)
{
X = x;
Y = y;
}

// Explicitly implementing IEquatable<Point> and delegating to an Equals method taking in param.
bool IEquatable<Point>.Equals(Point other) => Equals(other);

public bool Equals(in Point other) => X == other.X && Y == other.Y;

public override bool Equals(object? obj) => obj is Point other && Equals(other);

public static bool operator ==(in Point left, in Point right) => left.Equals(right);

public static bool operator !=(in Point left, in Point right) => !left.Equals(right);

public override int GetHashCode() => HashCode.Combine(X, Y);

public override string ToString() => $"Point({X}, {Y})";
}

以上当然有效,但我认为这不是完美的解决方案,因为如果通过 IEquatable 调用,仍然需要复制。界面。请注意,我不能只实现 IEquatable隐含地使用 in传入修饰符的 param as Equal 方法被认为具有不同的签名并被视为重载。

是否有已知的最佳实践来正确实现?
我真正想知道的是,是否有已知的最佳实践和模式来有效地实现此类只读结构的相等性。 特别是我对正确利用 in 的方法感兴趣。用于实现相等比较方法的参数修饰符。

目前在网上还没有找到满意的答案,也查了一些核心库的源码。例如, System.DateTime现在被定义为只读结构,它相当大,但在这里没有使用参数。 (现有类型可能需要保持兼容性,但我知道他们经常需要妥协。)

请注意,上面定义的 Point 结构很小,仅由两个 32 位槽组成,因此复制在这里实际上可能不是一个大问题,但这只是一个简单的说明性示例。

最佳答案

以上是好的,但是:请注意 in 的优点只读值类型仅适用于大小不重要的类型;在两个整数的情况下,你可能想多了。

您无法消除在 IEquatable<T> 上使用按值传递的需要。场景,因为这就是 API 的定义方式。

可能还值得注意的是 in使用可能会使从 C# 以外的语言中使用此 API 变得困难;例如,VB 对此的支持很差。这是否重要取决于您的目标受众。

关于c# - 为只读结构实现相等的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60692098/

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