Record keyword
C# 9 介绍了一个新的关键字: record. record keyword 可以将一个引用对象当成一个值对象一样使用,一旦初始化后,将不允许改变。
例如:
namespace Models
{
public record Product
{
public string Name { get; init; }
public int Id { get; init; }
}
}
With-expressions
We might want sometimes create new a object from another one because some property values are identical only one change, unfortunately your object is immutable. with keyword fixes that. It allows you create an object from another by specifying what property changes:
using System;
using CSharp9Demo.Models
namespace CSharp9Demo
{
class Program
{
static void Main(string[] args)
{
var product = new Product
{
Name = "VideoGame",
CategoryId = 1
};
var newProduct = product with { CategoryId = 2 }
// newProduct.Name == "VideoGame"
// newProduct.CategoryId == 2
}
}
}
Objects comparison
On that point Records work like Structs, these last override the virtual Equals method to enable value-based comparison, which means each property will be compared with a value-based approach. You already have probably noticed that ReferenceEquals method won’t work (always false), because it compares two same objects (reference-based comparison).
Example:
using System;
using CSharp9Demo.Models
namespace CSharp9Demo
{
class Program
{
static void Main(string[] args)
{
var product = new Product
{
Name = "VideoGame",
CategoryId = 1
};
var newProduct = product with { CategoryId = 2 }
product.Equals(newProduct); // returns false
product == newProduct; // returns false
var newAnotherProduct = new Product
{
Name = "VideoGame",
CategoryId = 1
};
product.Equals(newAnotherProduct); // returns true
product == newAnotherProduct; // returns true
}
}
}