1. C#9新特性init only setter介绍
C#9引入了init only setter这一新特性,它允许在属性的初始化后将其设为只读,从而提供更加类型安全和简洁的代码编写方式。在之前的版本中,通常需要使用私有set方法或者将属性设为只读字段来实现类似的效果,但这样会导致代码冗余和可读性下降。
1.1 传统属性设置方式的问题
在以往的C#版本中,为了实现只能在初始化阶段设置属性值的需求,通常需要使用私有set方法。例如:
private string name;
public string Name
{
get { return name; }
private set { name = value; }
}
这种方式虽然能够实现只在初始化阶段设置属性值的需求,但是在设置属性值的时候需要调用私有set方法,会使代码显得冗余并且可读性较差。
1.2 init only setter的使用
C#9中的init关键字解决了这个问题,它可以用于属性的set方法前,表示该属性只能在初始化阶段进行设置,之后将变为只读。例如:
public string Name { get; init; }
使用init关键字后,属性被设置为只读,无法再通过普通的set方法进行修改。可以保证只能在初始化阶段设置属性值,提高了代码的类型安全性和可读性。
2. init only setter的具体用法
2.1 在对象初始化时设置属性值
使用init only setter最常见的用途就是在对象初始化时设置属性值。例如:
public class Person
{
public string Name { get; init; }
public int Age { get; init; }
}
Person person = new Person { Name = "Tom", Age = 20 };
在上述例子中,Person类中的Name和Age属性被设置为只读,只能在对象初始化时设置。通过使用对象初始化器,可以在创建对象时直接设置属性值,代码更加简洁易读。
2.2 使用with表达式修改init only setter属性
尽管使用init only setter的属性无法通过普通的set方法修改,但仍可以通过with表达式创建一个新的对象,来修改属性的值。
Person person = new Person { Name = "Tom", Age = 20 };
Person newPerson = person with { Age = 21 };
在这个例子中,通过with表达式创建了一个新的Person对象newPerson,并修改了其Age属性的值。原对象person的属性值保持不变。
2.3 init only setter与构造函数的配合使用
init only setter与构造函数的配合使用可以进一步增强代码的可读性和类型安全性。
public class Person
{
public string Name { get; init; }
public int Age { get; init; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
}
Person person = new Person("Tom", 20);
在这个例子中,通过构造函数初始化Person对象时,通过init only setter设置属性值。这样可以在构造函数中直接设置属性值,使代码更加清晰易懂。
3. 总结
通过引入C#9的新特性init only setter,可以有效地实现只能在初始化阶段设置属性值的需求。它的使用方式简单灵活,能够提高代码的类型安全性和可读性。通过与对象初始化器、with表达式和构造函数的结合使用,可以进一步增强代码的可读性和简洁性。
使用init only setter要注意的是,该特性只适用于属性初始化阶段,无法再通过普通的set方法对属性进行修改。因此,在设计类和属性时要慎重考虑使用该特性,确保满足业务需求。