第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

具有不可變存儲(chǔ)的只讀字段的類的構(gòu)造函數(shù)

具有不可變存儲(chǔ)的只讀字段的類的構(gòu)造函數(shù)

C#
慕虎7371278 2022-10-23 15:17:08
假設(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);}


查看完整回答
反對(duì) 回復(fù) 2022-10-23
?
撒科打諢

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ù)。


查看完整回答
反對(duì) 回復(fù) 2022-10-23
  • 2 回答
  • 0 關(guān)注
  • 93 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)