ros*_*res 6 .net c# immutability data-structures
我见过 C# 9.0 中新记录功能的几个示例。即,能够更新各个属性以创建新的不可变记录。我很想知道with语法是否允许我将新条目插入到字典之类的东西中,创建一个新的不可变字典以及构成记录的所有同级属性。
例如,我可以做这样的事情吗?
public record Person
{
public string Name;
}
public record Car
{
public string Model;
public Dictionary<string, Person> Riders;
}
var car = new Car
{
Model = "Delorean",
Riders = ("driver", new Person { Name = "Doc Brown" })
};
var newCar = car with
{
Riders with ("passenger1", new Person { Name = "Marty McFly" })
};
Run Code Online (Sandbox Code Playgroud)
正如此评论中所述,您肯定不能执行此操作,因为with仅适用于记录类型。但无论如何,也不完全清楚你的意思。该类Dictionary<TKey, TValue>一开始就不是一成不变的,因此with似乎没有必要。您期望上面建议的语法做什么?
如果您的意思是它替换字典内容,您可以使用当前with语法轻松地做到这一点:
var newCar = car with
{
Riders = new Dictionary<string, Person> { { "passenger1", new Person { Name = "Marty McFly" } } }
};
Run Code Online (Sandbox Code Playgroud)
如果您打算添加到现有的字典内容,但使用一个新实例,这不太优雅,但仍然很容易,并且对我来说几乎一样好:
var newCar2 = car with
{
Riders = new Dictionary<string, Person>(car.Riders)
{
{ "passenger1", new Person { Name = "Marty McFly" } }
}
};
Run Code Online (Sandbox Code Playgroud)
你希望有一些东西可以避免这个new Dictionary...部分吗?我认为在当前版本的 C# 中这是不可能的,即使在过去几个版本中为支持集合初始值设定项而进行了所有增强。