C# 7.2中结构体性能问题的解决方案
作者:无明 发布时间:2022-08-12 23:04:26
标签:c#7.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包的方式供下载使用。
总结
来源:http://www.infoq.com/cn/news/2018/08/structs-performance-csharp
0
投稿
猜你喜欢
- 思想利用栈和队列都可以实现树的迭代遍历。递归的写法将这个遍历的过程交给系统的堆栈去实现了,所以思想都是一样的、无非就是插入值的时机不一样。利
- 最近在研究springboot实现FastJson解析json数据的方法,那么今天也算个学习笔记吧!添加jar包:<dependenc
- import java.util.List;/*** * 基本接口 * * @author xyq 
- 一、AtomicReference 基本使用我们这里再聊起老生常谈的账户问题,通过个人银行账户问题,来逐渐引入 AtomicReferenc
- package com.cjonline.foundation.evisa;import java.io.BufferedReader;im
- 23种设计模式第七篇:java代理模式定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个
- 事发地原默认的Feign是使用URLConnector进行通信的,当换为okhttp时,直接引入包及配置以下内容根本不生效,还是走原生的。f
- 刚刚学习Android,用Gallery作了一个小demo,用来记录一下。package com.example.galleryex02;i
- 前言之前我们提到了 CustomPaint er 的 Paint 可以使用渐变(GradientShader)来填充绘制的图形,本篇我们来介
- Mybatis是业界非常流行的持久层框架,轻量级、易用,在金融IT领域完全是领军地位,比Hibernate更受欢迎,优势非常多,也是非常值得
- @Lazy用于指定该Bean是否取消预初始化。主要用于修饰Spring Bean类,用于指定该Bean的预初始化行为,使用该Annotati
- dynamic关键字和动态语言运行时(DLR)是.Net 4.0中新增的功能。什么是"动态"?编程语言有时可以划分为静态
- 介绍主要使用了goole的zxing包,下面给出了示例代码,很方便大家的理解和学习,代码都属于初步框架,功能有了,需要根据实际使用情况完善优
- 介绍装饰者模式(Decorator Pattern):动态地给一个对象增加一些额外的职责,增加对象功能来说,装饰模式比生成子类实现更为灵活。
- 在java程序开发中,ftp用的比较多,经常打交道,比如说向FTP服务器上传文件、下载文件,本文给大家介绍如何利用jakarta commo
- 一、abstract 抽象的抽象类:被abstract 修饰的类语法: abstract class 类名{}抽象方法 : 被a
- 泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个新功能。泛型将类型参数的概念引入 .NET Framework,类型参数
- 依赖SpringBoot版本:2.4.2 <dependencies> &
- C# 的类型系统可分为两种类型,一是值类型,一是引用类型,这个每个C#程序员都了解。还有托管堆,栈,ref,out等等概念也是每个C#程序员
- 前言Java多线程实现方式主要有四种:① 继承Thread类、实现Runnable接口② 实现Callable接口通过FutureTask包