写点什么

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

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

关注

评论

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

助力白帽成长 百度安全2022 BSRC年度盛典圆满收官

Geek_283163

百度 #百度#

Blazor在IoT领域的前端实践 @.NET开发者日

MASA技术团队

.net blazor MASA MAUI

从零开始搭建一个通用的业务技术架构,这套架构 有点牛逼!

程序知音

Java 程序员 编程语言 后端

NineData x 阿里云 正式上线

NineData

数据库 阿里云 数据迁移 数据管理 NineData

使用Assembly打包和部署Spring Boot工程

Java spring Spring Boot assembly 框架

OpenHarmony NDK工具(上)

离北况归

OpenHarmony

ExpandableListView的基本使用

芯动大师

Adapter ExpandableListView 可折叠的列表

OpenHarmony NAPI 类对象导出及其生命周期管理(上)

离北况归

OpenHarmony

一天吃透MySQL锁面试八股文

程序员大彬

MySQL 面试

被问了n遍怎么把FB视频无水印下载到手机相册!现在双手奉上教程!

frank

facebook #Facebook

OpenHarmony NAPI 类对象导出及其生命周期管理(下)

离北况归

OpenHarmony

OpenHarmony编译固件新增支持Ubuntu22.04平台

离北况归

OpenHarmony

Polygon马蹄链质押DApp开发合约部署案例

薇電13242772558

智能合约 dapp

【网络安全必备知识】本地提权漏洞分析

网络安全学海

黑客 网络安全 信息安全 渗透测试 漏洞挖掘

DockQuery | 基于E-R图的数据建模功能使用实践

BinTools图尔兹

数据建模 信创 #数据库

企业如何构建内部开发者平台?

SEAL安全

IdP 平台工程 企业号 3 月 PK 榜 内部开发者平台

如何规避MyBatis使用过程中带来的全表更新风险

京东科技开发者

数据库 mybatis 代码 代码规范 企业号 3 月 PK 榜

@所有人,优秀前端都应该具备的开发好习惯

引迈信息

前端 低代码 开发

开源的未来:启动 Open100

开源雨林

社区 开源软件 商业化

Matlab常用图像处理命令108例(四)

timerring

图像处理

图解Redis,谈谈Redis的持久化,RDB快照与AOF日志

小小怪下士

Java redis 程序员 后端

科技助力金融转型 阿里云联合中国信通院在京举办未来金融思享会

阿里云云效

DevOps 数字化转型 金融 BizDevOps 业技融合

使用C++ template进行多厂商接口的适配

老王同学

c++ 模板

【OpenHarmony设备开发】修改屏幕 DPI(像素密度)

离北况归

OpenHarmony

PyTorch深度学习实战 | 深度学习框架(PyTorch)

TiAmo

深度学习 PyTorch

OpenHarmony内核学习[1]--单独编译OpenHarmony标准系统内核

离北况归

OpenHarmony

极客时间运维进阶训练营第十二周作业

Starry

京东小程序CI工具实践

京东科技开发者

小程序 ci 开发 代码 企业号 3 月 PK 榜

非侵入式入侵 —— Web缓存污染与请求走私

vivo互联网技术

CDN

URule规则引擎

规则引擎 java

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