QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

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

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

关注

评论

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

反向编译了子弹短信的 APK,核心功能为整合网易云信 SDK

android 程序员 移动开发

可能是目前最全的《Android面试题大全》(中高级)

android 程序员 移动开发

史上最详细!那些你不知道的WorkManager流程分析和源码解析

android 程序员 移动开发

使用jMeter构造大量并发HTTP请求进行微服务性能测试

汪子熙

Jmeter HTTP java; 11月日更

在这个问题上,能看出 Android 工程师的真实水平

android 程序员 移动开发

太厉害了,终于有人能把Android 事件分发机制讲的明明白白了!

android 程序员 移动开发

历时30天的腾讯Android研发岗面试血泪史!最终拿到offer25K+16薪

android 程序员 移动开发

Chrome开发者工具中Elements(元素)断点的用途

汪子熙

JavaScript chrome Chrome开发者工具 11月日更

如何在10分钟内让Android应用大小减少-60%?

android 程序员 移动开发

如何在跳槽后,Android程序员摸鱼也能学习进阶,为下次换工作进大厂拿高薪!

android 程序员 移动开发

四张图让你玩转Tomcat系统架构!!!

android 程序员 移动开发

图片加载框架-Picasso最详细的使用指南

android 程序员 移动开发

基于-Kotlin-+-Netty-实现一个简单的-TCP-自定义协议

android 程序员 移动开发

大家都说程序员是吃青春饭的、Android研发没前景,那等Android研发年纪大了又该怎么办?

android 程序员 移动开发

无代码Web UI自动化工具Automa初体验

FunTester

chrome 自动化 插件 FunTester Automa

大厂面试官:跳出舒适圈的程序员3年月薪还没到2万,干脆考虑转行?

android 程序员 移动开发

天天给-App-抓包,还不懂-HTTP-代理吗?---实用-HTTP

android 程序员 移动开发

太恐怖了!移动开发APP-可视化埋点技术原理竟然是这样的?!

android 程序员 移动开发

勤勤恳恳做到30岁,3名百度 ,京东,腾讯的高级Android工程师被辞退了

android 程序员 移动开发

原创_Android Jetpack Compose 最全上手指南

android 程序员 移动开发

【死磕NIO】— NIO基础详解

chenssy

11月日更 死磕 Java 死磕 NIO

在小公司混水摸鱼3年,被面试官直接开怼:能力太差了,还不如应届生哇

android 程序员 移动开发

如何在Adapter中优雅的使用Context

android 程序员 移动开发

北漂7年,安全着陆,一位大龄Android程序员的自述

android 程序员 移动开发

十年老Android:构建Android-MVVM应用程序只需这几步?

android 程序员 移动开发

叫板-Android-开发!跨平台应用开发神器-Flutter-又添开源插件!-&nbs

android 程序员 移动开发

Jerry眼中的SAP客户数据模型

汪子熙

CRM SAP abap 11月日更

如何在AndroidStudio中使用手势解锁

android 程序员 移动开发

各种风格的Android面试题,进来了解一下?

android 程序员 移动开发

同事逆袭面进阿里P7-年薪60W+,临别留下一张Android开发重点技术路线图---

android 程序员 移动开发

【高并发】深入解析Callable接口

冰河

Java 并发编程 多线程 高并发 异步编程

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