假設(shè)我們有以下簡(jiǎn)單的類。請(qǐng)注意,唯一的字段是readonly并且用于ImmutableList<int>:class Abc{ readonly ImmutableList<int> elts; public Abc(params int[] ls) => elts = ImmutableList.CreateRange(ls);}給定所示的構(gòu)造函數(shù),很容易從一些ints 創(chuàng)建一個(gè)實(shí)例:var result_a = new Abc(10, 20, 30);現(xiàn)在,我可能還想要一個(gè)可以構(gòu)建Abc給定 an的構(gòu)造函數(shù)IEnumerable<int>:public Abc(IEnumerable<int> ls) => elts = ImmutableList.CreateRange(ls);所以我們的類現(xiàn)在看起來像這樣:class Abc{ readonly ImmutableList<int> elts; public Abc(params int[] ls) => elts = ImmutableList.CreateRange(ls); public Abc(IEnumerable<int> ls) => elts = ImmutableList.CreateRange(ls);}這確實(shí)有效:var ls = new[] { 10, 20, 30 };var result_b = new Abc(ls);但是,這個(gè)構(gòu)造函數(shù)有點(diǎn)尷尬,因?yàn)檎б豢?,是這樣的:new Abc(item)可能看起來像是在Abc用單個(gè)元素 ( item) 創(chuàng)建一個(gè)。但是如果item實(shí)際上是一個(gè)IEnumerable<int>具有多個(gè)項(xiàng)目的,上面的第二個(gè)構(gòu)造函數(shù)將被調(diào)用。如果您查看 Microsoft ImmutableListAPI,它們實(shí)際上調(diào)用ImmutableList.CreateRange了類似于上面的第二個(gè)構(gòu)造函數(shù)的靜態(tài)方法。這很好,因?yàn)槲覀儽苊饬松鲜鲆曈X模糊。好的,讓我們開始為我們的Abc類繪制一個(gè)類似構(gòu)造函數(shù)的簡(jiǎn)單實(shí)現(xiàn):public static Abc CreateRange(IEnumerable<int> ls){ elts = ImmutableList.CreateRange(ls); ...}當(dāng)然,我們?cè)谶@里遇到了一個(gè)問題,因?yàn)樵揺lts字段是readonly并且不能通過此靜態(tài)方法初始化:CreateRange那么,為我們的課程實(shí)現(xiàn)的好方法是Abc什么?
2 回答

慕田峪9158850
TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個(gè)贊
設(shè)置的唯一方法elts
是調(diào)用 Abc 的構(gòu)造函數(shù)。
修飾符保證設(shè)置變量的readonly
唯一方法是在初始化期間readonly int i=0;
或在構(gòu)造函數(shù)中。
該錯(cuò)誤是由靜態(tài)方法無法訪問 的實(shí)例引起的Abc
,盡管您仍然無法修改它,因?yàn)樗?code>readonly.
試試這個(gè):
public static Abc CreateRange(IEnumerable<int> ls){ return new Abc(ls);}

撒科打諢
TA貢獻(xiàn)1934條經(jīng)驗(yàn) 獲得超2個(gè)贊
我相信 SLaks 的建議是創(chuàng)建一個(gè)私有構(gòu)造函數(shù)并從靜態(tài)方法調(diào)用它:
private Abc(IEnumerable<int> ls) => elts = ImmutableList.CreateRange(ls); public static Abc CreateRange(IEnumerable<int> ls) => new Abc(ls);
這樣,創(chuàng)建實(shí)例的唯一方法(沒有反射)Abc
是使用靜態(tài)方法,假設(shè)您沒有任何公共構(gòu)造函數(shù)。
- 2 回答
- 0 關(guān)注
- 93 瀏覽
添加回答
舉報(bào)
0/150
提交
取消