【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

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

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

关注

评论

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

APISIX+Dubbo+Nacos 最佳实践

阿里巴巴中间件

阿里云 云原生 dubbo nacos APISIX

钉钉 IM 基于 RocketMQ 5.0 的云原生应用实践

阿里巴巴中间件

阿里云 RocketMQ 云原生

DevSecOps 与软件开发安全

SoFlu软件机器人

PHP 中命令行调用 escapeshellarg 函数中文问题

ModStart

LogicFlow自定义业务节点

小鑫同学

前端 vite Vue 3

阿里P9耗时28天,总结历年亿级活动高并发系统设计手册

架构师之道

Java 高并发 架构师

H5直播技术起航

京东科技开发者

音视频 编码 H5 flv 企业号 1 月 PK 榜

ClassIn:如何打造更稳定的Zabbix监控系统

OceanBase 数据库

oceanbase 数据库·

马斯克收购推特后,亲自与员工探讨了……

博文视点Broadview

走进AI图像生成核心技术 - Diffusion

Baihai IDP

人工智能 AI AIGC Diffusion 扩散模型

如何用「标准差」度量研发波动

feijieppm

项目管理 研发效能 技术管理 文化 & 方法 效能度量

Java高手速成 | 新增类Record的工作实例

TiAmo

新特性 Java’

面试题:为什么不建议在MySQL中使用UTF-8?

风铃架构日知录

Java MySQL 程序员 后端 IT

DiT:Transformers 与扩散模型强强联手

Zilliz

AI 算法模型

2023-01-10:智能机器人要坐专用电梯把货物送到指定地点, 整栋楼只有一部电梯,并且由于容量限制智能机器人只能放下一件货物, 给定K个货物,每个货物都有所在楼层(from)和目的楼层(to),

福大大架构师每日一题

算法 rust Solidity 福大大

高并发中的atomic

Steven

Flink 批作业的运行时自适应执行管控

Apache Flink

大数据 flink 实时计算

神经网络基础部件-损失函数详解

嵌入式视觉

激活函数 Relu sigmoid tanh swish激活函数

阿里云计算巢 x GBase GCDW:自动化部署云原生数据仓库

云布道师

阿里云

TiDB 底层存储结构 LSM 树原理介绍

京东科技开发者

技术 算法 LSM树 TiDB 企业号 1 月 PK 榜

先行试点,创新改造:中信期货关键业务系统自主可控的实践之路

OceanBase 数据库

《PyTorch 深度学习实战》学习笔记 --NumPy(上)

IT蜗壳-Tango

KaiwuDB 1.0 - 时序数据库系列产品正式发布

KaiwuDB

数据库

mouseover 和 mouseenter 的区别

ModStart

为什么开发者这么看重SQL?看完这些应用场景你就明白了

雨果

sql 数据库管理工具 SQL开发工具

架构实战营4.1 数据库存储架构随堂练习

西山薄凉

「架构实战营」

SeekBar(拖动条)

攻城狮Wayne

android SeekBar 拖动条

Dubbo-kubernetes 基于 Informer 服务发现优化之路

阿里巴巴中间件

阿里云 Kubernetes 云原生 dubbo

龙湖千丁基于 ACK@Edge 的云原生智慧停车系统架构实践

阿里巴巴中间件

阿里云 云原生

MASA Stack 1.0发布会正式官宣

MASA技术团队

MASA MASA Stack

JDK结构介绍

Steven

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