C#9新特性init only setter的使用

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方法对属性进行修改。因此,在设计类和属性时要慎重考虑使用该特性,确保满足业务需求。

后端开发标签