欢迎来到入门教程网!

C#教程

当前位置:主页 > 软件编程 > C#教程 >

C# 7.2中结构体性能问题的解决方案

来源:本站原创|时间:2020-01-10|栏目:C#教程|点击:

前言

在某些使用了readonly关键字的情况下,C#编译器会创建出结构体的防御副本。虽然这个问题已经众所周知并被记录下来了,但仍然值得重新审视,因为它与C# 7.2的几个特性有关。in和ref readonly关键字的使用让这个问题出现得更频繁,而readonly结构体提供了一种解决方法。

C#中的结构体通常用于提升性能,减少用于分配和销毁内存的开销。然而,潜在的陷阱限制了它们的使用。C# 7.2增加了一个改进的readonly结构体来解决这个问题。

在如下几种情况下,C#编译器将为结构体创建副本:

  •  结构体不是只读的。
  •  机构提变量使用了readonly修饰符。
  •  调用方法(包括属性)。
public struct SomeStruct 
{
 private int _x;

 
 public int X { get { return _x; } }
}

 
private readonly SomeStruct s = new SomeStruct(42);

 
s.X; // 编译器创建了一个防御副本。

当x是in参数、ref readonly局部变量或通过readonly reference返回值的方法调用的结果时,适用相同的规则。

public void BadFunction(in SomeStruct s)

{
 s.X; // 编译器创建了一个防御副本。
}

C# 7.2增加了声明readonly结构体的可能性,并提供了避免创建防御副本的解决方案。声明为readonly的结构体不能具有属性设置器,并且不能对结构体成员赋值。

我们可以通过静态分析来检测防御性副本问题。ErrorProne.NET的灵感来自于ErrorProne,一个Java静态分析工具。移植到.NET的版本由一组Roslyn分析器组成,侧重于准确性和性能。其中有一部分分析器适用于结构体,以Nuget包的方式供下载使用。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

上一篇:C#利用VS中插件打包并发布winfrom程序

栏    目:C#教程

下一篇:C#如何添加PPT背景

本文标题:C# 7.2中结构体性能问题的解决方案

本文地址:https://www.xiuzhanwang.com/a1/C_jiaocheng/5102.html

网页制作CMS教程网络编程软件编程脚本语言数据库服务器

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:835971066 | 邮箱:835971066#qq.com(#换成@)

Copyright © 2002-2020 脚本教程网 版权所有