写点什么

解决 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:122056
用户头像

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

关注

评论

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

测试用例编写和管理

刘冉

软件测试 测试用例

纯CSS实现轮播图

Augus

CSS 11月日更

北鲲云超算平台对于基因组学研究能够提供哪些帮助?

北鲲云

自定义View:如何实现图片放大后拖动和滑动效果

Changing Lin

11月日更

Scrum模式之估算点模式读后感

Bruce Talk

敏捷 随笔 Agile User Story Scrum Patterns

学习心得 - 架构训练营 - 第八课

Fm

一分钟搞懂DDD

俞凡

架构 DDD

性能测试之并发模型对比(JMeter,Locust和Gatling篇)

刘冉

软件测试 性能测试 自动化测试

架构实战营模块三作业

spark99

架构实战营

Java8中Stream初试

Geek_4bdbe1

AI 预测:基于流计算 Oceanus(Flink) 实现病症的实时预测

腾讯云大数据

flink 流计算 Oceanus

Flink 实践教程-入门(7):消费 Kafka 数据写入 PG

腾讯云大数据

flink 流计算 Oceanus

2021年了,数据分析还吃香么?

Geek_utwige

Python 最佳实践 数据分析 爬虫 职业发展

探索式测试落地实践

刘冉

探索测试

Flink 实践教程-入门(6):读取 PG 数据写入 ClickHouse

腾讯云大数据

flink 流计算 Oceanus

模块四作业

bob

「架构实战营」

契约测试理论篇

刘冉

软件测试 契约测试

数据产品经理实战-数据分析能力养成

第519区

数据分析 数据产品

【架构实战营】模块三作业

liu🍊

EDAS 4.0 助力企业一站式实现微服务架构转型与 K8s 容器化升级

阿里巴巴云原生

阿里云 云原生 PaaS EDAS

springboot中poi操作合集

小鲍侃java

11月日更

瀑布vs敏捷质量控制

刘冉

敏捷开发 敏捷测试

软件测试中的服务虚拟化

刘冉

Mock测试框架 服务虚拟化

学生管理系统设计文档

Geek_cb2b43

Python 官方研讨会:彻底移除 GIL 真的可行么?

Python猫

Python

如何使用Camtasia给视频打码

淋雨

Camtasia

点进来,与白洞一起体验一场沉浸式智慧轨道之旅

白洞计划

如何使用 JavaScript 扁平化/非扁平化嵌套 JSON 对象?

devpoint

JavaScript json Object 11月日更

模块八作业

potti

架构实战训练营模块三

人生就是梦

「架构实战营」

服务端系统性能测试

刘冉

性能测试

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