带 init 访问器的对象初始值设定项
确保无人更改设计,并且可以使用访问器来限制 init 对象。 它有助于限制属性值的设置。
public class Person
{public string FirstName { get; set; }public string LastName { get; init; }
}// The `LastName` property can be set only during initialization. It CAN'T be modified afterwards.
// The `FirstName` property can be modified after initialization.
var pet = new Person() { FirstName = "Joe", LastName = "Doe"};// You can assign the FirstName property to a different value.
pet.FirstName = "Jane";// Compiler error:
// Error CS8852 Init - only property or indexer 'Person.LastName' can only be assigned in an object initializer,
// or on 'this' or 'base' in an instance constructor or an 'init' accessor.
// pet.LastName = "Kowalski";
必需的仅限 init 的属性支持不可变结构,同时允许该类型用户使用自然语法。
具有类类型属性的对象初始值设定项
初始化对象时,考虑类类型属性的含义至关重要:
public class HowToClassTypedInitializer
{public class EmbeddedClassTypeA{public int I { get; set; }public bool B { get; set; }public string S { get; set; }public EmbeddedClassTypeB ClassB { get; set; }public override string ToString() => $"{I}|{B}|{S}|||{ClassB}";public EmbeddedClassTypeA(){Console.WriteLine($"Entering EmbeddedClassTypeA constructor. Values are: {this}");I = 3;B = true;S = "abc";ClassB = new() { BB = true, BI = 43 };Console.WriteLine($"Exiting EmbeddedClassTypeA constructor. Values are: {this})");}}public class EmbeddedClassTypeB{public int BI { get; set; }public bool BB { get; set; }public string BS { get; set; }public override string ToString() => $"{BI}|{BB}|{BS}";public EmbeddedClassTypeB(){Console.WriteLine($"Entering EmbeddedClassTypeB constructor. Values are: {this}");BI = 23;BB = false;BS = "BBBabc";Console.WriteLine($"Exiting EmbeddedClassTypeB constructor. Values are: {this})");}}public static void Main(){var a = new EmbeddedClassTypeA{I = 103,B = false,ClassB = { BI = 100003 }};Console.WriteLine($"After initializing EmbeddedClassTypeA: {a}");var a2 = new EmbeddedClassTypeA{I = 103,B = false,ClassB = new() { BI = 100003 } //New instance};Console.WriteLine($"After initializing EmbeddedClassTypeA a2: {a2}");}// Output://Entering EmbeddedClassTypeA constructor Values are: 0|False||||//Entering EmbeddedClassTypeB constructor Values are: 0|False|//Exiting EmbeddedClassTypeB constructor Values are: 23|False|BBBabc)//Exiting EmbeddedClassTypeA constructor Values are: 3|True|abc|||43|True|BBBabc)//After initializing EmbeddedClassTypeA: 103|False|abc|||100003|True|BBBabc//Entering EmbeddedClassTypeA constructor Values are: 0|False||||//Entering EmbeddedClassTypeB constructor Values are: 0|False|//Exiting EmbeddedClassTypeB constructor Values are: 23|False|BBBabc)//Exiting EmbeddedClassTypeA constructor Values are: 3|True|abc|||43|True|BBBabc)//Entering EmbeddedClassTypeB constructor Values are: 0|False|//Exiting EmbeddedClassTypeB constructor Values are: 23|False|BBBabc)//After initializing EmbeddedClassTypeA a2: 103|False|abc|||100003|False|BBBabc
}
以下示例演示了对于 ClassB,初始化过程如何涉及到更新特定的值,同时保留原始实例中的其他值。 初始值设定项重用当前实例:ClassB 的值为:100003(此处分配的新值)、true(在 EmbeddedClassTypeA 的初始化中保留的值)、BBBabc(EmbeddedClassTypeB 中未更改的默认值)。