init(C# 参考)
init
关键字在属性或索引器中定义访问器方法。 init-only 资源库仅在对象构造期间为属性或索引器元素赋值。 init
强制实施不可变性,因此,一旦初始化对象,将无法更改。 init
访问器使调用代码能够使用对象初始值设定项来设置初始值。 相比之下,只有 get
setter 的自动实现属性必须通过调用构造函数来初始化。 具有 private set
访问器的属性可在构造后修改,但只能在类中修改。
以下示例为名为 YearOfBirth
的属性同时定义 get
和 init
访问器。 它使用名为 _yearOfBirth
的私有字段备份属性值。
class Person_InitExample
{
private int _yearOfBirth;
public int YearOfBirth
{
get { return _yearOfBirth; }
init { _yearOfBirth = value; }
}
}
通常,init
访问器包含分配一个值的单个语句,如前面的示例所示。 由于 init
,以下内容不起作用:
var john = new Person_InitExample
{
YearOfBirth = 1984
};
john.YearOfBirth = 1926; //Not allowed, as its value can only be set once in the constructor
init
访问器不强制调用方设置属性。 而它允许调用方使用对象初始值设定项,同时禁止以后的修改。 可以添加 required
修饰符以强制调用方设置属性。 以下示例显示了一个以可为空的值类型作为支持字段的仅 init
属性。 如果调用方未初始化 YearOfBirth
属性,该属性将具有默认 null
值:
class Person_InitExampleNullability
{
private int? _yearOfBirth;
public int? YearOfBirth
{
get => _yearOfBirth;
init => _yearOfBirth = value;
}
}
若要强制调用方设置初始非 null 值,可添加 required
修饰符,如以下示例所示:
class Person_InitExampleNonNull
{
private int _yearOfBirth;
public required int YearOfBirth
{
get => _yearOfBirth;
init => _yearOfBirth = value;
}
}
init
访问器可用作表达式主体成员。 示例:
class Person_InitExampleExpressionBodied
{
private int _yearOfBirth;
public int YearOfBirth
{
get => _yearOfBirth;
init => _yearOfBirth = value;
}
}
init
访问器还可在自动实现的属性中使用,如以下示例代码所示:
class Person_InitExampleAutoProperty
{
public int YearOfBirth { get; init; }
}
以下示例显示了 private set
、read only 和 init
属性之间的区别。 private set 版本和 read only 版本都需要调用方使用添加的构造函数来设置 name 属性。 通过 private set
版本,人员可在构造实例后更改其名称。 init
版本不需要构造函数。 调用方可使用对象初始值设定项初始化属性:
class PersonPrivateSet
{
public string FirstName { get; private set; }
public string LastName { get; private set; }
public PersonPrivateSet(string first, string last) => (FirstName, LastName) = (first, last);
public void ChangeName(string first, string last) => (FirstName, LastName) = (first, last);
}
class PersonReadOnly
{
public string FirstName { get; }
public string LastName { get; }
public PersonReadOnly(string first, string last) => (FirstName, LastName) = (first, last);
}
class PersonInit
{
public string FirstName { get; init; }
public string LastName { get; init; }
}
PersonPrivateSet personPrivateSet = new("Bill", "Gates");
PersonReadOnly personReadOnly = new("Bill", "Gates");
PersonInit personInit = new() { FirstName = "Bill", LastName = "Gates" };
C# 语言规范
有关详细信息,请参阅 C# 语言规范。 该语言规范是 C# 语法和用法的权威资料。