写点什么

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

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

关注

评论

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

面试官为什么会问你,如何设计一个高并发系统?

老大哥

Java 程序员 后端

我的大厂面试经历

老大哥

Java 程序员 后端

第十三周作业

olderwei

极客大学架构师训练营

Spring 5 中文解析核心篇-集成测试之TestContext(上)

青年IT男

单元测试 Spring5 JUnit

Hessian Bug修复

心平气和

php 序列化 hessian

“新基建”与“双循环”的二重奏:2020服贸会靠什么推动经济复苏

脑极体

阿里P8忠告:这些技术,哪怕不用微服务架构,你也应该会

小Q

Docker 架构 微服务 springboot SpringCloud

架构师训练营第十三周作业

张明森

模板方法模式——看看 JDK 和 Spring 是如何优雅复用代码的

简爱W

Java 程序员 java架构

架构师训练营 - 第 8周命题作业

红了哟

商业通识 : 商业从哪里来?

Walker

学习 得到 个人成长 商业

关于二进制的补码,反码,正负数表示以及Java代码测试

Zexho

Java 补码 位运算 反码 计算机知识

架构师训练营第13周作业

服务化反面案例

心平气和

服务化 权限

甲方日常10

句子

工作 随笔杂谈 日常

架构师训练营作业(大数据与机器学习)

qihuajun

用技术的“信条”,开启AI to B的产业位移

脑极体

大厂面试题:集群部署时的分布式 session 如何实现? 面试官心理分析

老大哥

Java 程序员 后端

What's new in Dubbo-go v1.5.1

apache/dubbo-go

dubbo 服务端 Go 语言

架构师训练营第 0 期第 13 周作业

无名氏

Flink通过官网创建自己的工程-20

小知识点

scala 大数据 flink

Java架构师JVM启动流程和内存结构,程序员必看!

老大哥

Java 程序员 后端

Java服务,内存OOM问题如何快速定位?

老大哥

Java 程序员 后端

没想到 Hash 冲突还能这么玩,你的服务中招了吗?

老大哥

Java 程序员 后端

[翻译]Go Concurrency Patterns[Go 并发模式]

卓丁

Rob Pike Go Concurrency Patterns Concurrency Go 语言

市值做市机器人,操盘做市系统搭建

从用户输入手机验证码开始

架构师修行之路

架构师第十三周作业

傻傻的帅

架构师

工作好多年有可能还未真正了解接口和抽象类

架构师修行之路

接口 抽象

【真实面试经历】我和阿里面试官的一次“邂逅”

老大哥

第13周 作业

Jaye

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