C# 8: 可变结构体中的只读实例成员 (2)

在没有使用 in 参数的方法中,意味着每次调用传入的是变量的一个新副本; 而在使用 in 修饰符的方法中,每次不是传递变量的新副本,而是传递同一副本的只读引用。

DoNormalLoop 方法,参数不加修饰符,传入一般结构体,调用可变结构体的非只读方法,这是以前比较常见的做法。

DoNormalLoopByIn 方法,参数加 in 修饰符,传入一般结构体,调用可变结构体的非只读方法。

DoReadOnlyLoopByIn 方法,参数加 in 修饰符,传入一般结构体,调用可变结构体的只读方法。

使用 BenchmarkDotNet 工具测试三个方法的运行时间,结果如下:

Method Mean Error StdDev Ratio RatioSD
DoNormalLoop   2.034 s   0.0392 s   0.0348 s   1.00   0.00  
DoNormalLoopByIn   3.490 s   0.0667 s   0.0557 s   1.71   0.03  
DoReadOnlyLoopByIn   1.041 s   0.0189 s   0.0202 s   0.51   0.01  

从结果可以看出,当结构体可变时,使用 in 参数调用结构体的只读方法,性能高于其他两种; 使用 in 参数调用可变结构体的非只读方法,运行时间最长,严重影响了性能,应该避免这样调用。

总结

当结构体为可变类型时,应将不会引起变化(即不会改变结构体状态)的成员声明为 readonly。

当仅调用结构体中的只读实例成员时,使用 in 参数,可以有效提升性能。

readonly 修饰符在只读属性上是必需的。编译器不会假定 getter 访问者不修改状态。因此,必须在属性上显式声明。

自动属性可以省略 readonly 修饰符,因为不管 readonly 修饰符是否存在,编译器都将所有自动实现的 getter 视为只读。

不要使用 in 参数调用结构体中的非只读实例成员,因为会对性能造成负面影响。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpssdg.html