【译】改善结构体相等性性能
通过重写 Equals 方法可以改善结构体相等比较的性能方法。 如果结构体包含引用类型字段(而不是仅仅只有值类型,如 int)。
默认情况下,结构体的相等性是通过对内存中的两个结构体对象进行逐字节比较来实现并自动确定的,但只有在结构体不包含任何引用类型的情况下。
当结构体包含引用类型字段时, 会使用反射来比较两个结构体对象之间的字段,这种基于反射的方法会导致性能降低。
下图显示了一个仅包含值类型的结构体和另一个包含引用类型的结构体的默认相等性比较的相对性能。

【备注】图表基于执行 10000000 次相等性的性能测试,比较时间以毫秒为单位。这里省略了特定的数字, 以便于将注意力集中在相对差异上。
用于比较的结构体:
struct StructWithRefTypesNoOverriddenEquals
{
public int Age { get; set; }
public int Height { get; set; }
public string Name { get; set; }
}
struct StructWithNoRefTypesNoOverriddenEquals
{
public int Age { get; set; }
public int Height { get; set; }
}
重写 Equals() 来改善性能
如果重写 Equals 方法来提供自定义的相等性含义,则会使用重写方法而不是默认(较慢)基于反射的机制:
struct StructWithRefTypesAndOverriddenEquals
{
public int Age { get; set; }
public int Height { get; set; }
public string Name { get; set; }
public override bool Equals(object obj)
{
if (!(obj is StructWithRefTypesAndOverriddenEquals))
return false;
var other = (StructWithRefTypesAndOverriddenEquals)obj;
return Age == other.Age &&
Height == other.Height &&
Name == other.Name;
}
// GetHashCode override and == != operators omitted
}
现在,将 StructWithRefTypesNoOverriddenEquals 的性能与 StructWithRefTypesandOverridEquals 的性能进行比较,生成以下结果:

实现重写的 Equals 意味着不会使用反射,而是执行自定义的 .Equals() 代码来取代原来的方式。
【提示】与性能相关的所有内容都一样,这些性能差异可能与您正在编写的应用程序相关,也可能与您所编写的应用程序无关。
章节:Improving Struct Equality Performance
译书名:《C# 奇淫巧技 -- 编写更优雅的 C#》
原书名:《C# Tips -- Write Better C#》
网址:https://leanpub.com/cstips
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?