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

推荐订阅源

量子位
Stack Overflow Blog
Stack Overflow Blog
人人都是产品经理
人人都是产品经理
The GitHub Blog
The GitHub Blog
Engineering at Meta
Engineering at Meta
Vercel News
Vercel News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Y
Y Combinator Blog
The Cloudflare Blog
Last Week in AI
Last Week in AI
B
Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
V
Visual Studio Blog
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
Google DeepMind News
Google DeepMind News
D
DataBreaches.Net
博客园 - 司徒正美
B
Blog RSS Feed
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
L
LangChain 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对象被修改。