亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

具有不可變存儲的只讀字段的類的構造函數

具有不可變存儲的只讀字段的類的構造函數

C#
慕虎7371278 2022-10-23 15:17:08
假設我們有以下簡單的類。請注意,唯一的字段是readonly并且用于ImmutableList<int>:class Abc{    readonly ImmutableList<int> elts;    public Abc(params int[] ls) => elts = ImmutableList.CreateRange(ls);}給定所示的構造函數,很容易從一些ints 創建一個實例:var result_a = new Abc(10, 20, 30);現在,我可能還想要一個可以構建Abc給定 an的構造函數IEnumerable<int>:public Abc(IEnumerable<int> ls) => elts = ImmutableList.CreateRange(ls);所以我們的類現在看起來像這樣:class Abc{    readonly ImmutableList<int> elts;    public Abc(params int[] ls) => elts = ImmutableList.CreateRange(ls);    public Abc(IEnumerable<int> ls) => elts = ImmutableList.CreateRange(ls);}這確實有效:var ls = new[] { 10, 20, 30 };var result_b = new Abc(ls);但是,這個構造函數有點尷尬,因為乍一看,是這樣的:new Abc(item)可能看起來像是在Abc用單個元素 ( item) 創建一個。但是如果item實際上是一個IEnumerable<int>具有多個項目的,上面的第二個構造函數將被調用。如果您查看 Microsoft ImmutableListAPI,它們實際上調用ImmutableList.CreateRange了類似于上面的第二個構造函數的靜態方法。這很好,因為我們避免了上述視覺模糊。好的,讓我們開始為我們的Abc類繪制一個類似構造函數的簡單實現:public static Abc CreateRange(IEnumerable<int> ls){    elts = ImmutableList.CreateRange(ls);    ...}當然,我們在這里遇到了一個問題,因為該elts字段是readonly并且不能通過此靜態方法初始化:CreateRange那么,為我們的課程實現的好方法是Abc什么?
查看完整描述

2 回答

?
慕田峪9158850

TA貢獻1794條經驗 獲得超7個贊

設置的唯一方法elts是調用 Abc 的構造函數。

修飾符保證設置變量的readonly唯一方法是在初始化期間readonly int i=0;或在構造函數中。

該錯誤是由靜態方法無法訪問 的實例引起的Abc,盡管您仍然無法修改它,因為它是readonly.

試試這個:

public static Abc CreateRange(IEnumerable<int> ls){
   return new Abc(ls);}


查看完整回答
反對 回復 2022-10-23
?
撒科打諢

TA貢獻1934條經驗 獲得超2個贊

我相信 SLaks 的建議是創建一個私有構造函數并從靜態方法調用它:

private Abc(IEnumerable<int> ls) => elts = ImmutableList.CreateRange(ls);
public static Abc CreateRange(IEnumerable<int> ls) => new Abc(ls);

這樣,創建實例的唯一方法(沒有反射)Abc是使用靜態方法,假設您沒有任何公共構造函數。


查看完整回答
反對 回復 2022-10-23
  • 2 回答
  • 0 關注
  • 84 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號