前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CA1815:重写值类型上的 Equals 和相等运算符

CA1815:重写值类型上的 Equals 和相等运算符

作者头像
呆呆
发布2022-02-19 18:58:16
5460
发布2022-02-19 18:58:16
举报
文章被收录于专栏:centosDaicentosDai

规则 ID

CA1815

类别

“性能”

修复是中断修复还是非中断修复

非中断

原因

值类型未重写 System.Object.Equals 或未实现相等运算符 (==)。 此规则不检查枚举。

默认情况下,此规则仅查看外部可见的类型,但这是可配置的。

规则说明

对于非 blittable 值类型,Equals 的继承实现使用 System.Reflection 库来比较所有字段的内容。 反射需要消耗大量计算资源,可能没有必要比较每一个字段是否相等。 如果希望用户对实例进行比较或排序,或者希望用户将它们用作哈希表键,则值类型应实现 Equals。 如果编程语言支持运算符重载,则还应提供相等和不等运算符的实现。

如何解决冲突

若要解决此规则的冲突,请提供 Equals 的实现。 如果可以,请实现相等运算符。

何时禁止显示警告

如果不会将值类型的实例进行相互比较,可禁止显示此规则的警告。

配置代码以进行分析

使用下面的选项来配置代码库的哪些部分要运行此规则。

包含特定的 API 图面

你可以仅为此规则、为所有规则或为此类别(性能)中的所有规则配置此选项。 有关详细信息,请参阅代码质量规则配置选项。

包含特定的 API 图面

你可以根据代码库的可访问性,配置要针对其运行此规则的部分。 例如,若要指定规则应仅针对非公共 API 图面运行,请将以下键值对添加到项目中的 .editorconfig 文件:

dotnet_code_quality.CAXXXX.api_surface = private, internal

示例

以下代码显示了违反此规则的结构(值类型):

// Violates this rule

public struct Point

{

public Point(int x, int y)

{

X = x;

Y = y;

}

public int X { get; }

public int Y { get; }

}

以下代码通过重写 System.ValueType.Equals 并实现相等运算符(== 和 !=)来解决前面的冲突:

public struct Point : IEquatable<Point>

{

public Point(int x, int y)

{

X = x;

Y = y;

}

public int X { get; }

public int Y { get; }

public override int GetHashCode()

{

return X ^ Y;

}

public override bool Equals(object obj)

{

if (!(obj is Point))

return false;

return Equals((Point)obj);

}

public bool Equals(Point other)

{

if (X != other.X)

return false;

return Y == other.Y;

}

public static bool operator ==(Point point1, Point point2)

{

return point1.Equals(point2);

}

public static bool operator !=(Point point1, Point point2)

{

return !point1.Equals(point2);

}

}

相关规则

CA2231:重写 ValueType.Equals 时应重载相等运算符

CA2226:运算符应有对称重载

另请参阅

System.Object.Equals

本文系外文翻译,前往查看

如有侵权,请联系?cloudcommunity@tencent.com?删除。

本文系外文翻译前往查看

如有侵权,请联系?cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com