写点什么

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

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

关注

评论

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

Spring Boot核心技术之Restful映射以及源码的分析,springboot启动原理通俗

Java 程序员 后端

Spring 基于 xml 配置的快速入门(超详细),数据库事务深入分析

Java 程序员 后端

SpringBoot 实现大文件视频转码(转码基于FFMPEG实现)(1)

Java 程序员 后端

SpringBoot-整合HikariCP连接池,java三层架构登录功能实现

Java 程序员 后端

SpringBoot初始化几大招式,看了终于明白了,Java高级程序员面试集合

Java 程序员 后端

seata-golang 一周年回顾,java面试准备内容

Java 程序员 后端

Socket和ServerSocket的简单介绍及例子,mongodb教程导入外部数据

Java 程序员 后端

SonarQube,SonarLint检测代码修复问题汇总归纳,2021京东最新Java面试真题解析

Java 程序员 后端

spring-boot-route 使用aop记录操作日志,springboot入门项目实战

Java 程序员 后端

set集合,挑战华为社招

Java 程序员 后端

Springboot+MybatisPlus高效实现增删改查,mysql使用教程图解目录

Java 程序员 后端

Set集合无法去重相同内容的父类对象和子类对象的问题解决

Java 程序员 后端

Spring Boot 项目如何做性能监控?,javase教程书

Java 程序员 后端

Spring Boot面试题(2020最新版),2021我的Java大厂面试之旅

Java 程序员 后端

Spring+SpringMVC+MyBatis整合,想拿高工资

Java 程序员 后端

Spring+MySQL+数据结构,mybatis懒加载的原理及实现

Java 程序员 后端

springboot 整合 thymeleaf,Java校招面试指南

Java 程序员 后端

Springboot实现防重复提交和防重复点击(附源码),java高级编程实验一

Java 程序员 后端

SpringBoot技术实践-SpringRetry重试框架,贼厉害

Java 程序员 后端

Spring Cloud Gateway实战之二:更多路由配置方式,阿里面试java准备

Java 程序员 后端

springboot-注解汇总,Java自学宝典下载

Java 程序员 后端

SpringBoot2-----异常处理,快手支付中台java面试题

Java 程序员 后端

Sleuth服务跟踪大厂高频面试题:整合-Zipkin,java面向对象程序开发及实战答案

Java 程序员 后端

SonarQube检测出的bug、漏洞以及异味的修复整理,mysql基础知识

Java 程序员 后端

Spring Boot 谷粒学院、谷粒商城项目问题汇总,springboot源码视频

Java 程序员 后端

Spring JdbcTemplate简介,java高级开发面试总结

Java 程序员 后端

SpringBoot 实现大文件视频转码(转码基于FFMPEG实现)

Java 程序员 后端

Serverless Devs 的官网是如何通过 Serverless Devs 部署的

Java 程序员 后端

Servlet的Cookie和Session机制,面试谈谈对springboot的理解

Java 程序员 后端

Spring Security账号密码认证源码解析,java项目开发全程实录第四版视频

Java 程序员 后端

Spring--声明式事务控制,mysql索引教程

Java 程序员 后端

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