惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
The GitHub Blog
The GitHub Blog
F
Fortinet All Blogs
Last Week in AI
Last Week in AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
L
LangChain Blog
爱范儿
爱范儿
博客园_首页
Stack Overflow Blog
Stack Overflow Blog
MongoDB | Blog
MongoDB | Blog
博客园 - 三生石上(FineUI控件)
大猫的无限游戏
大猫的无限游戏
宝玉的分享
宝玉的分享
GbyAI
GbyAI
H
Help Net Security
A
About on SuperTechFans
Recent Announcements
Recent Announcements
Hugging Face - Blog
Hugging Face - Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
雷峰网
雷峰网
D
Docker
博客园 - Franky
有赞技术团队
有赞技术团队
G
Google Developers Blog

博客园 - Rick Carter

官方APP太难用了,所以我写了个 OpenNas App 死锁是怎么发生的,举个简单的例子 hangfire内部执行器是同步的,会导致死锁 缓存读写代码逻辑的正确姿势 dotnet未捕获异常导致系统崩溃问题 dotnet-dump安装、收集dump和崩溃自动收集dump EFCore中巧妙利用ToQueryString()实现批插(不借助第三方包) 修复达梦EFCore驱动布尔类型兼容问题 dotnet使用redis时需要注意的问题 巧用 using 作用域(IDisposable)的生命周期包装特性 实现前后置处理 非托管内存怎么计算? dotnet集合类型性能优化的两个小儿科的知识点 一个前端树形控件联动勾选框卡顿问题及解决 .net c# Func<Task>及变体做为多播委托异步执行会另开线程的问题 关于EFCore插件API使用中踩过的坑 dotnet CultureInfo遇到欧洲如俄文小数点是逗号想转点的解决办法 hangfire.entityframeworkcore这个库因为System.Threading.Timer未停止也未释放而导致的性能问题 达梦DM.Microsoft.EntityFreameworkCore查询报错invalid cast from DateTime to DateTimeOffset 达梦DOTNET驱动DM.Provider8.3.1.30495存在空字符串插入变DBNull的问题 是否可以考虑做一个dotnet应用的性能诊断工具
利用C#9.0中的record提高性能
Rick Carter · 2025-03-20 · via 博客园 - Rick Carter

C#9.0是2020年发布的,record特性还没用上的可以看过来,一起讨论下。
下面通过一个简单的示例演示record带来的好处。

1. 通过一个示例引出问题

public class Person
{
    public string Name { get; set }
...
}
public class ClassA
{
    public static List<Person> Items=new List<Person>{......};
    public List<Person> GetList()
    {
        foreach(var item in Items)
        {
            item.Name=...
            ...
        }
        return Items;
    }
}

如上代码,就是想把Items中的值修改下再返回,但是这样就会静态变量Items中的值也修改掉,导致下次再用它时数据发生变化了,这不是我们希望的。
至于为什么要修改Items中的值,实际情况可能是单位转换、翻译等等。
还有这里用静态变量,实际的情况可能是内存缓存(IMemoryCache)中取来的,我们并不想它原始值发生改变。

2. 传统解决办法

以前我们要解决这个问题,可能就是重新new新的对象,然后逐个属性和字段的赋值,这样写的问题是代码很啰嗦,不优雅。
还有个解决办法就是深拷贝一份,再来修改,这个问题可能就是性能不好了,内存和cpu都消耗的比较多。
可能还有其他的,欢迎讨论。

3. record特性解决

public record Person
{
    public string Name { get; set }
...
}
public class ClassA
{
    public static List<Person> Items=new List<Person>{......};
    public List<Person> GetList()
    {
        var items = Items.ToList();
        for(var i=0;i<items.Count;i++)
        {
            items[i]=items[i] with {Name=...}
        }
        return items;
    }
}

解决代码如上,使用with表达式实现record的非破环性修改,需要注意的是Items是List泛型集合,是引用类型,需要ToList下以便接下来修改的不是原来的Items。

4. 总结

  1. 利用record非破坏性修改特性实现对象的复制,避免重新new对象大量赋值操作,代码简单优雅性能高;
  2. 利用List的ToList方法创建新的List对象,避免原来的List对象被修改。