C#记录-使用with关键字修改属性

Ran*_*ner 9 c# c#-9.0 c#-record-type

我最近在 C# 中遇到了record关键字,我能够创建记录的实例并通过定期分配值和使用关键字来修改它with

这两种方式有什么区别,什么时候应该使用with

public record Car{

    public Car(string name, int age){
        Name = name;
        Age = age;
    }

    public string Name;
    public int Age;
}


public static void Main()
{
    var car = new Car("Reno", 15);
    car.Name = "Honda";
    
    Console.WriteLine(car.Name);
    
    car = car with {Name = "BMW"};
    
    Console.WriteLine(car.Name);
}
Run Code Online (Sandbox Code Playgroud)

Gur*_*ron 22

在 C# 中引入记录的主要原因之一 - 使创建不可变数据模型变得更容易。with创建功能是为了提供一种易于使用的语法来创建具有更改的属性的不可变实例的副本。因此car = car with {Name = "BMW"};实际上不会修改原始实例(请注意,record's 是引用类型,除非它们被声明为record struct's),而是创建一个新实例并将其分配给变量。通过以下代码可以轻松看出差异:

var car = new Car("Reno", 15);
var car2 = car;
car.Name = "Honda";

Console.WriteLine(car.Name);  // "Honda"
Console.WriteLine(car2.Name); // "Honda"

car = car with {Name = "BMW"};

Console.WriteLine(car.Name);  // "BMW" 
Console.WriteLine(car2.Name); // "Honda"
Run Code Online (Sandbox Code Playgroud)

还有一些注意事项:

  • 建议使用自动属性而不是字段,即:
var car = new Car("Reno", 15);
var car2 = car;
car.Name = "Honda";

Console.WriteLine(car.Name);  // "Honda"
Console.WriteLine(car2.Name); // "Honda"

car = car with {Name = "BMW"};

Console.WriteLine(car.Name);  // "BMW" 
Console.WriteLine(car2.Name); // "Honda"
Run Code Online (Sandbox Code Playgroud)
  • 如果您需要不可变数据record,请提供简洁的语法,自动生成构造函数和仅限初始化的属性:
public record Car(string Name, int Age);
Run Code Online (Sandbox Code Playgroud)