C# 9.0中的Init关键字:Init-only Setters的新篇章

简介: 【1月更文挑战第12天】本文介绍了C# 9.0中引入的Init关键字,该关键字允许创建仅在对象初始化时可设置属性的setter。通过Init-only setters,开发者能够更加灵活地控制对象属性的赋值时机,提高代码的可维护性和安全性。文章详细解释了Init关键字的使用方法、适用场景以及与传统setter的区别,并探讨了其在实际开发中的潜在影响。

在C#的类设计中,属性(Properties)是封装字段(Fields)并提供访问控制的重要手段。通过属性的getter和setter方法,我们可以控制对字段的读取和写入操作。然而,在某些情况下,我们可能希望属性的setter仅在对象创建时被调用,而不允许在对象创建后修改属性值。为了满足这种需求,C# 9.0引入了Init关键字,用于定义Init-only setters。

在C# 9.0之前,要实现仅在对象初始化时设置属性的功能,开发者通常会采用构造函数(Constructors)来完成。然而,这种方式存在一些限制,例如构造函数参数列表可能会变得非常庞大,尤其是当类具有许多需要初始化的属性时。此外,使用构造函数进行属性初始化还可能导致代码的可读性和可维护性下降。

为了解决这个问题,C# 9.0引入了Init关键字,它允许我们在属性setter上使用init访问修饰符。当使用init访问修饰符时,属性的setter将仅在对象初始化期间可用,即在对象构造函数执行期间。一旦对象创建完成,Init-only setters将不再可用,属性的值将保持不变。

下面是一个使用Init关键字的示例:

public class Person
{
   
    public string Name {
    get; init; }
    public int Age {
    get; init; }
}

// 使用对象初始化器设置属性
var person = new Person
{
   
    Name = "John Doe",
    Age = 30
};

// 编译错误:无法在对象初始化之后设置init-only属性
// person.Name = "Jane Smith";
// person.Age = 25;

在上面的示例中,Person类具有两个属性NameAge,它们都被标记为init-only。在创建Person对象时,我们可以使用对象初始化器来设置这些属性的值。然而,一旦对象创建完成,尝试修改这些属性的值将导致编译错误。

Init关键字的引入为C#开发者提供了更多的灵活性。通过限制属性的赋值时机,我们可以更好地控制对象的状态,并避免在对象生命周期中发生意外的属性更改。这在某些情况下特别有用,比如在数据传输对象(DTOs)或不可变对象模式中,我们希望确保对象一旦创建就具有稳定的状态。

Init-only setters还提供了一种更加明确和易于理解的代码组织方式。通过将它们与传统的setter区分开来,我们可以更清楚地表达哪些属性是允许在对象创建后修改的,哪些属性是只允许在初始化时设置的。

需要注意的是,Init关键字并不会改变属性的可见性。换句话说,如果属性本身是public的,那么它的init-only setter也是public的。同样地,如果属性是private或protected的,init-only setter也将具有相应的访问级别。

总而言之,C# 9.0中引入的Init关键字为开发者提供了一种新的属性设置方式,使得我们能够更加灵活地控制对象属性的赋值时机。通过Init-only setters,我们可以实现仅在对象初始化时设置属性,从而提高代码的可维护性、可读性和安全性。这一新特性将在许多场景中发挥作用,为C#开发者带来便利和更好的设计选择。

相关文章
|
6月前
|
C#
30.C# 关键字 this初步学习
30.C# 关键字 this初步学习
38 1
|
6月前
|
C#
28.c#关键字base初步学习
28.c#关键字base初步学习
31 0
|
6月前
|
C#
27.c#关键字sealed修饰类
27.c#关键字sealed修饰类
54 0
|
6月前
|
开发框架 .NET 编译器
C# 9.0中的静态匿名函数:引入static关键字的新用法
【1月更文挑战第15天】C# 9.0为匿名函数带来了一个新的修饰符static,允许开发者明确指定匿名函数不会捕获其包含作用域中的任何变量。这一特性增强了代码的性能和可读性,同时减少了因不小心捕获变量而导致的潜在错误。本文将详细探讨C# 9.0中静态匿名函数的语法、使用场景以及它们如何影响代码的性能和安全性。
|
6月前
|
SQL 开发框架 .NET
EntityFramework数据持久化复习资料3、C#拓展方法与yield关键字使用
EntityFramework数据持久化复习资料3、C#拓展方法与yield关键字使用
54 0
|
4月前
|
开发框架 .NET C#
【Azure Developer】C# / .NET 静态函数中this关键字的作用
在C#中,`this`关键字用于扩展方法,允许向已有类型添加功能而不修改其源代码。扩展方法必须在静态类中定义,且第一个参数使用`this`修饰,如`public static XElement AcquireElement(this XContainer container, string name, bool addFirst = false)`。这种方式增强了代码的可读性和类型的安全性,尤其在处理第三方库时。
|
5月前
|
开发框架 安全 .NET
C#关键字概览
C#关键字概览
|
存储 编译器 C#
C#关键字相关面试题
C#关键字相关面试题
|
6月前
|
存储 Java C++
31.C#:关键字static
31.C#:关键字static
54 1
|
6月前
|
存储 编译器 C#
C#关键字常见面试题
C#关键字常见面试题