C#语法: init关键字
<p>init关键字是C#9新增的语法,用于属性或索引器中定义访问器。使用init关键字定义的访问器具有init-only的特性,即只能在对象构造期间对属性或索引器元素进行赋值,对象构造完成后,不可以再修改属性或索引器元素的值。</p><h1 id="init关键字解决了什么问题">init关键字解决了什么问题</h1>
<p>实际上,我个人认为init-only属性和read-only属性差别不大,都具有在对象构造完成后不可以再进行赋值的特性,但某些特定场景下还是各有优劣。它们之间最大的差异是,read-only属性只能在属性定义或构造函数中赋值,而init-only属性除了能在属性定义和构造函数中赋值以外,还能在初始化构造器中赋值。</p>
<p>这一点不同使得,当属性需要由调用者初始化时,init-only属性可能会极大程度地简化代码,这取决于这个类有多少属性需要由调用者来进行初始化。</p>
<p>例如,下面的Person类的Name属性如果需要由调用者初始化,如果使用read-only属性,则可以写成</p>
<pre><code>class Person
{
public Person( string name )
{
Name = name;
}
public string Name { get; }
}
Person p = new Person("A");
</code></pre>
<p>如果写成init-only属性,则可以写成</p>
<pre><code>class Person
{
public string Name { get; init }
}
Person p = new Person(){ Name = "A" };
</code></pre>
<p>目前看来,init-only属性少写了一个构造函数,但还不具备特别明显的优势。</p>
<p>但是,当类似Name这样的属性变得很多时,如果使用read-only属性,就会使构造函数的参数数量变得非常多,并且,在实际业务中,大部分属性可能允许在对象初始化时保持默认值,这又使得构造函数中的大量参数变成了可选参数,这实在是非常不优雅。这时候,init-only属性就显得非常实用了。</p>
<h1 id="init关键字还存在什么问题">init关键字还存在什么问题</h1>
<p>前面对比了init-only属性和read-only属性,并举例说明了init-only属性的一种应用场景,那么下面将举例另一种场景,init-only属性可能不如read-only属性。</p>
<p>前面说了read-only属性如果需要由调用者初始化,则必须通过构造函数的参数暴露出来,这可能是一个劣势,但是当我们希望调用者必须初始化这个属性时,这又成为了一个优势——我们可以要求调用者必须传入相应的参数。</p>
<p>在C#11以前,init-only属性无法强制要求调用者在构造对象时初始化该属性,直到C#11新增了required关键字之后,才可以使用required关键字修饰init-only属性,来强制要求调用者必须初始化该属性</p>
<pre><code>public required string Name { get; init }
</code></pre>
<h1 id="其他问题">其他问题</h1>
<ol>
<li>init访问器本质上还是set访问器的一种,因此,属性不能同时定义init访问和set访问器</li>
<li>init访问器的写法基本上和set访问器一样,也可以有关联的后台字段,也可以使用value表示访问器参数</li>
</ol><br><br>
来源:https://www.cnblogs.com/yangtb/p/18884326
頁:
[1]