查看: 83|回覆: 0

C#语法: init关键字

[複製鏈接]

6

主題

0

回帖

0

積分

热心网友

金币
0
閲讀權限
220
精華
0
威望
0
贡献
0
在線時間
0 小時
註冊時間
2010-3-8
發表於 2025-5-19 16:27:00 | 顯示全部樓層 |閲讀模式

init关键字是C#9新增的语法,用于属性或索引器中定义访问器。使用init关键字定义的访问器具有init-only的特性,即只能在对象构造期间对属性或索引器元素进行赋值,对象构造完成后,不可以再修改属性或索引器元素的值。

init关键字解决了什么问题

实际上,我个人认为init-only属性和read-only属性差别不大,都具有在对象构造完成后不可以再进行赋值的特性,但某些特定场景下还是各有优劣。它们之间最大的差异是,read-only属性只能在属性定义或构造函数中赋值,而init-only属性除了能在属性定义和构造函数中赋值以外,还能在初始化构造器中赋值。

这一点不同使得,当属性需要由调用者初始化时,init-only属性可能会极大程度地简化代码,这取决于这个类有多少属性需要由调用者来进行初始化。

例如,下面的Person类的Name属性如果需要由调用者初始化,如果使用read-only属性,则可以写成

class Person
{
    public Person( string name )
    {
        Name = name;
    }

    public string Name { get; }
}

Person p = new Person("A");

如果写成init-only属性,则可以写成

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

Person p = new Person(){ Name = "A" };

目前看来,init-only属性少写了一个构造函数,但还不具备特别明显的优势。

但是,当类似Name这样的属性变得很多时,如果使用read-only属性,就会使构造函数的参数数量变得非常多,并且,在实际业务中,大部分属性可能允许在对象初始化时保持默认值,这又使得构造函数中的大量参数变成了可选参数,这实在是非常不优雅。这时候,init-only属性就显得非常实用了。

init关键字还存在什么问题

前面对比了init-only属性和read-only属性,并举例说明了init-only属性的一种应用场景,那么下面将举例另一种场景,init-only属性可能不如read-only属性。

前面说了read-only属性如果需要由调用者初始化,则必须通过构造函数的参数暴露出来,这可能是一个劣势,但是当我们希望调用者必须初始化这个属性时,这又成为了一个优势——我们可以要求调用者必须传入相应的参数。

在C#11以前,init-only属性无法强制要求调用者在构造对象时初始化该属性,直到C#11新增了required关键字之后,才可以使用required关键字修饰init-only属性,来强制要求调用者必须初始化该属性

public required string Name { get; init }

其他问题

  1. init访问器本质上还是set访问器的一种,因此,属性不能同时定义init访问和set访问器
  2. init访问器的写法基本上和set访问器一样,也可以有关联的后台字段,也可以使用value表示访问器参数


来源:https://www.cnblogs.com/yangtb/p/18884326
回覆

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即注册

本版積分規則

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部