gpt4 book ai didi

c# - 在 C# 记录中缓存昂贵的重新计算属性或字段

转载 作者:行者123 更新时间:2023-12-03 23:40:49 24 4
gpt4 key购买 nike

我有一个如下所示的 C# 记录,其属性计算成本很高:

sealed record MyAwesomeRecord(Dictionary<int, int> SomeDictionary)
{
public int ExpensiveToComputeProperty => SomeDictionary.Sum(e => e.Value);

//...
}

var original = new MyAwesomeRecord( new() { [0] = 0 });
var modified = original with { SomeDictionary = new() { [1] = 1 } };
而不是重新计算 ExpensiveToComputeProperty每次访问的值(value),我只想在“构造”之后计算一次。但显然对于 C# 记录,使用 with 修改后不会再次调用构造函数。 .我尝试了以下方法来解决这个问题:
  • 使用普通 class相反,但那样我就不能再使用 with语法,我想继续使用。
  • 存储 ExpensiveToComputeProperty在常规属性(property)或领域。这不起作用,因为它被初始化一次,但不是在更改后 SomeDictionarywith .
  • AFAIK,有计划引入很好的语法,让我在 C# 10 中更新这个属性。不幸的是,C# 10 还没有出现。

  • 有没有办法使用记录来避免重新进行昂贵的计算?

    最佳答案

    您可以使用自定义 setter ,而不是使用属性的默认 setter 。在这个 setter 中,您可以进行昂贵的计算。
    这是一个完整的示例(经过测试和工作):

    using System;
    using System.Collections.Generic;
    using System.Linq;

    namespace ConsoleApp1
    {
    sealed record MyAwesomeRecord
    {
    public MyAwesomeRecord(Dictionary<int, int> SomeDictionary)
    {
    this.SomeDictionary = SomeDictionary;
    }

    public int ExpensiveToComputeProperty { get; private set; }

    private Dictionary<int, int>? _SomeDictionary;
    public Dictionary<int, int> SomeDictionary
    {
    get => _SomeDictionary!;
    set
    {
    _SomeDictionary = value;
    ExpensiveToComputeProperty = SomeDictionary.Sum(e => e.Value);
    }
    }

    //...
    }

    class Program
    {
    static void Main()
    {
    var original = new MyAwesomeRecord(new() { [0] = 0 });

    Console.WriteLine($"ExpensiveToComputeProperty = {original.ExpensiveToComputeProperty}");

    var modified = original with { SomeDictionary = new() { [1] = 1 } };

    Console.WriteLine($"ExpensiveToComputeProperty = {modified.ExpensiveToComputeProperty}");
    }
    }
    }

    关于c# - 在 C# 记录中缓存昂贵的重新计算属性或字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65971263/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com