50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

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

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

关注

评论

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

零代码抓取网页!产品经理3分钟学会MCP神器(附保姆教程)

阿星AI工作室

产品 AI 产品经理 大模型 MCP

今年行情回暖了

王中阳Go

Go 就业

华为云MaaS解锁DeepSeek-R1-0528超能推理开箱即用AI力!

YG科技

达芬奇20新功能介绍 附DaVinci Resolve Studio中文安装教程

Rose

Lightroom Classic 2025(LRC2025)中文安装包

Rose

需求神器提示词

执于业务

跨平台的 AI 基准测试 Geekbench AI for mac

Rose

基于 Amazon Q Developer CLI 和 Amazon Bedrock Knowledge Bases 实现智能问答系统

亚马逊云科技 (Amazon Web Services)

业务流程建模指南

俞凡

架构

基于YOLOv8的农业虫害检测102 类农业害虫识别项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!

申公豹

yolov8

基于 StarRocks + Iceberg,TRM Labs 构建 PB 级数据分析平台实践

StarRocks

postgres iceberg StarRocks TRM Labs 构建 BigQuery

专业歌曲创作编辑和混音 Logic Pro X for mac中文直装版

Rose

免费好用的隐藏和显示菜单栏项:Ice for mac

Rose

艺术品NFT系统的开发流程

北京木奇移动技术有限公司

软件外包公司 区块链NFT 艺术品NFT

脚本是有“保质期”的,不可能用一辈子

程序员郭顺发

从源码角度分析Spring Boot中日志系统的配置

喝水不抬头

Spring Boot logback 自动配置 Configurator

详解鸿蒙仓颉开发语言中的计时器

幽蓝计划

【HarmonyOS 5】鸿蒙应用实现发票扫描、文档扫描输出PDF图片或者表格的功能

GeorgeGcs

鸿蒙 文档扫描 表格扫描

专业的视频后期制作:Final Cut Pro(fcpx)中文版安装包

Rose

JetBrains IntelliJ IDEA 2025永久激活秘钥-mac/win

Rose

《Nginx核心技术》第1章:安装Nginx

冰河

nginx 程序员 高可用 系统架构 架构师

征程 6EM 常见 QConfig 配置解读与示例

地平线开发者

自动驾驶 算法工具链 地平线征程6

无损音乐播放器Audirvana for Mac中文版

Rose

Next的Seo实践

溪抱鱼

next

Macs Fan Control Pro :控制风扇速度来保持 Mac 平稳运行

Rose

思维导图与头脑风暴 XMind Pro 永久许可证

Rose

20种数组去重的方法

溪抱鱼

JavaScript 前端

百度AI搜索全面接入DeepSeek R1 最新版 进一步强化智能搜索体验

科技热闻

鸿蒙ArkTS | Badge 信息标记组件自学指南

李游Leo

鸿蒙 HarmonyOS

别再堆MCP工具了!好用的AI Agent,始于一个“懂你”的System Prompt

RockBot

Linux下版本控制器(SVN) -命令行客户端

刘大猫

人工智能 svn 算法 大模型 tortoiseSVN

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