写点什么

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

2018 年 8 月 03 日

在某些使用了 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 年 8 月 03 日 09:12986
用户头像

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

关注

评论

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

Suricata-流的处理

Phantasm

网络安全 suricata flow

求刚好大于当前数组组合,Code Review最佳实践,JVM框架原理,JVM垃圾回收原理 John 易筋 ARTS 打卡 Week 12

John(易筋)

Code Review ARTS 打卡计划 JVM虚拟机原理 JVM垃圾回收原理 Array算法

应用开发基础之-并发编程

superman

深化区块链技术的应用 体现其价值产业发展良机

CECBC区块链专委会

区块链技术 数字经济

热潮-区块链的价值能够体现在哪些方面?

CECBC区块链专委会

区块链技术 标准化 应用价值

ARTS打卡Week 10

teoking

图文讲解 AQS ,一起看看 AQS 的源码……(图文较长)

程序员小航

AQS jdk源码 源码阅读 java 并发

学了那么多技术,为何依然成不了架构师

菜根老谭

架构设计原则

ARTS-WEEK10

一周思进

ARTS 打卡计划

程序的机器级表示-控制

引花眠

计算机基础

关于 Bash 的 10 个常见误解

柴锋

bash Linux DevOps Shell

十多位全球技术专家,为你献上近十个小时的.Net微服务介绍

newbe36524

微服务 .net core netcore 容器化

【API进阶之路】帮公司省下20万调研费!如何巧用情感分析API实现用户偏好调研

华为云开发者社区

反馈 API 华为云 API Explorer平台 用户调研

微服务、DDD

chenzt

那些不可貌相的代码规范

双儿么么哒

代码质量

吃灰的旧显示器别扔!

Sicolas Flamel

学习 随笔杂谈

Java 常见的几种 OOM

hepingfly

Java OOM

十年一梦,小米的原罪得到救赎了吗?

脑极体

ARTS打卡 第11周

引花眠

ARTS 打卡计划

如何让区块链技术能够更好赋能数字社会建设

CECBC区块链专委会

区块链 数字经济

面试这么撩准拿offer,HashMap深度学习,扰动函数、负载因子、扩容拆分,原理和实践验证,让懂了就是真的懂!

小傅哥

Java 面试 hashmap 负载因子 扰动函数

计算机网络基础(十六)---传输层-可靠传输的基本原理

书旅

计算机网络 网络 协议族 网络层

品质网络的迭变之路,以及运营商的未来之匙

脑极体

ARTS 打卡(20.07.20-20.07.26)

小王同学

视读——沟通的艺术,看入人里,看出人外(第二章)

双儿么么哒

读书笔记 视觉笔记

Requests模块基本操作

骆俊

当实证资产定价遇上机器学习

分析101

人工智能 学习 金融科技 金融 资产定价

设计模式之——JDK动态代理的源码分析

诸葛小猿

动态代理 cglib 代理模式 Proxy

BGP、OSPF、MPLS路由协议RFC分享

Phantasm

一次好的聊天可以超过自己努力啃几周的书籍

良知犹存

程序人生

LeetCode题解:21. 合并两个有序链表,迭代,JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

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