"Init only setters" 提供了什么,与 C# 中的只读有什么区别
What "Init only setters" provides and what is the difference to the readonly one in C#
我可以像下面这样定义 class:
public class MyClass
{
public int Id { get; }
public MyClass(int id) => Id = id;
}
而且我必须从构造函数中定义 Id
,它将是只读的。
但是如果我想在 C# 9.0
中使用 Init only setters
,它是什么以及如何使用它?
public class MyClass
{
public int Id { get; init; }
}
简而言之:
var obj = new MyClass
{
Id = 42 // totally fine
};
obj.Id = 43; // not OK, we're not initializing
在这种情况下微不足道,与使用构造函数参数没有太大区别,但在一些更复杂的场景中很有用,在这些场景中,您不需要 200 个构造函数参数,但 想要一旦构建,它在外部是不可变的。
Init only setters 提供一致的语法来初始化对象的成员。 属性 初始化程序清楚地表明哪个值正在设置哪个 属性。缺点是这些属性必须是可设置的。
这样一来,您就不需要在开始时提供值和构造函数,您可以在之后进行:
var myClass = new MyClass
{
Id = 10
}
并且会被封印,不能再更改
myClass.Id = 43; // not allowed
我可以像下面这样定义 class:
public class MyClass
{
public int Id { get; }
public MyClass(int id) => Id = id;
}
而且我必须从构造函数中定义 Id
,它将是只读的。
但是如果我想在 C# 9.0
中使用 Init only setters
,它是什么以及如何使用它?
public class MyClass
{
public int Id { get; init; }
}
简而言之:
var obj = new MyClass
{
Id = 42 // totally fine
};
obj.Id = 43; // not OK, we're not initializing
在这种情况下微不足道,与使用构造函数参数没有太大区别,但在一些更复杂的场景中很有用,在这些场景中,您不需要 200 个构造函数参数,但 想要一旦构建,它在外部是不可变的。
Init only setters 提供一致的语法来初始化对象的成员。 属性 初始化程序清楚地表明哪个值正在设置哪个 属性。缺点是这些属性必须是可设置的。
这样一来,您就不需要在开始时提供值和构造函数,您可以在之后进行:
var myClass = new MyClass
{
Id = 10
}
并且会被封印,不能再更改
myClass.Id = 43; // not allowed