10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

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

  • 2018-08-03
  • 本文字数:653 字

    阅读完需:约 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 包的方式供下载使用。

查看英文原文 Performance of Structs in C# 7.2

2018-08-03 09:122201
用户头像

发布了 731 篇内容, 共 475.1 次阅读, 收获喜欢 2008 次。

关注

评论

发布
暂无评论
发现更多内容

【设计模式】原型

Andy阿辉

C# 编程 后端 设计模式 8月日更

Python OpenCV 图像区域轮廓标记,可用于框选各种小纸条

梦想橡皮擦

8月日更

Python代码阅读(第1篇):列表映射后的平均值

Felix

Python 编程 Code Programing 阅读代码

12年高级工程师的“飞升之路”,面试题+笔记+项目实战

Geek_f90455

Java 程序员 后端

2021Java开发现状分析,给大家安排上!

Geek_f90455

Java 程序员 后端

Druid 从控制台(Druid console)中删除过滤器和运行查询

HoneyMoose

docker入门:postgresql安装及可视化界面portainer使用

小鲍侃java

8月日更

十大排序算法--插入排序

Ayue、

排序算法 8月日更

netty系列之:netty初探

程序那些事

Java 响应式编程 Netty nio 程序那些事

多语言ASR?没有什么听不懂,15种语言我全都要

华为云开发者联盟

语言 ASR 多语言ASR 单语模型 Conformer

社会心理学-自尊

箭上有毒

读书笔记 8月日更

Druid 从控制台(Druid console)从 SQL 脚本转换为 JSON 格式的方法

HoneyMoose

Druid 通过 dsql 运行的时候提示错误 urllib2

HoneyMoose

10万字Mysql实战文档,Java面试题汇总

Geek_f90455

Java 程序员 后端

2020-2021阿里巴巴Java面试真题解析,详细的Java学习指南

Geek_f90455

Java 程序员 后端

synchronized 优化手段之锁膨胀机制!

王磊

Java 并发 8月日更

Druid 的几个查询实例

HoneyMoose

基于ECS快速搭建 Docker 环境

若尘

Docker 服务器 8月日更

10天拿到字节跳动Java岗位offer,互联网行业“中年”危机

Geek_f90455

Java 程序员 后端

2020-2021华为Java面试真题,统统都会!

Geek_f90455

Java 程序员 后端

2021Java大厂高频面试题,原理+实战+视频+源码

Geek_f90455

Java 程序员 后端

2020-2021华为Java面试真题,内含福利

Geek_f90455

Java 程序员 后端

【Flutter 专题】132 图解 PaginatedDataTable 分页表格

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 8月日更

【Maven技术专题】如何使用Assembly插件实现自定义打包

码界西柚

maven assembly 8月日更

在线分数加减乘除计算器

入门小站

工具

Druid 从控制台(Druid console)中查询字段

HoneyMoose

Rust从0到1-模式-可反驳性

rust 模式 Patterns Refutability 可反驳性

复杂多变场景下的Groovy脚本引擎实战

vivo互联网技术

敏捷开发 脚本语言

15分钟的字节跳动视频面试,工作感悟

Geek_f90455

Java 程序员 后端

架构实战营 - 模块四作业

思梦乐

索信达控股:银行4.0的AI世界——开启算法力的时代

索信达控股

人工智能 金融科技 银行

解决C# 7.2中的结构体性能问题_.NET_Pierre-Luc Maheu_InfoQ精选文章