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

 更新时间:2018年08月06日 09:31:44   作者:无明  
这篇文章主要给大家介绍了关于C# 7.2中结构体性能问题的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

在某些使用了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#中使用JIEBA.NET实现中文分词

    如何在C#中使用JIEBA.NET实现中文分词

    JIEBA 是一款优秀的中文分词工具,为了方便 .NET 开发者使用,JIEBA.NET 作为一个封装了 JIEBA 的 C# 库,提供了类似的分词功能,下面我们来看看它的具体操作吧
    2025-03-03
  • C#中使用WinRAR实现加密压缩及解压缩文件

    C#中使用WinRAR实现加密压缩及解压缩文件

    这篇文章主要介绍了C#中使用WinRAR实现加密压缩及解压缩文件,本文直接给出实例代码,代码中包含详细注释,需要的朋友可以参考下
    2015-07-07
  • 简单的excel导入导出示例分享

    简单的excel导入导出示例分享

    这篇文章主要介绍了简单的excel导入导出示例分享,需要的朋友可以参考下
    2014-03-03
  • C#将DataGridView中的数据保存到CSV和Excel中

    C#将DataGridView中的数据保存到CSV和Excel中

    这篇文章介绍了C#将DataGridView中的数据保存到CSV和Excel中的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • 将数组中指定数量的元素移动数组后面的实现代码

    将数组中指定数量的元素移动数组后面的实现代码

    本篇文章是对将数组中指定数量的元素移动数组后面的实现代码进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • C#获取CPU处理器核心数量的方法

    C#获取CPU处理器核心数量的方法

    本文主要介绍了C#获取CPU处理器核心数量的方法,代码简单易懂,具有很好的参考价值,需要的朋友可以看下
    2016-12-12
  • C#实现两个日期比较大小

    C#实现两个日期比较大小

    这篇文章主要为大家详细介绍了C#中实现两个日期比较大小的常见方法,文中的示例代码简洁易懂,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-12-12
  • C#发送邮箱实现代码

    C#发送邮箱实现代码

    这篇文章主要为大家详细介绍了C#发送邮箱实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • C#中dynamic关键字的正确用法(推荐)

    C#中dynamic关键字的正确用法(推荐)

    dynamic的出现让C#具有了弱语言类型的特性。dynamic是FrameWork4.0的新特性。这篇文章主要介绍了C#中dynamic关键字的正确用法(推荐)的相关资料,需要的朋友可以参考下
    2016-11-11
  • WPF自定义实现IP地址输入控件

    WPF自定义实现IP地址输入控件

    这篇文章主要给大家介绍了关于WPF自定义实现IP地址输入控件的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用WPF具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06

最新评论