ReadOnlyDictionary之應用場景

2022-01-31 18:39:31 字數 1168 閱讀 4319

前兩天發布了《隱藏介面實現 及 readonlydictionary》一文,有不少朋友提出疑問。其中乙個主要問題就是,這樣做真的可以實現「唯讀」嗎?如果還有其他變數引用了readonlydictionary所包裝的普通字典,依然可以通過另外這個變數來修改字典中的內容。有朋友甚至提到了,可以在建立readonlydictionary時,將原有字典中的內容複製出乙份,來做到真正的「唯讀」。

其實,這些主要是因為我對這個類的應用場景沒有介紹清楚的緣故。其實我這裡提到的readonlydictionary也好,.net提供的readonlycollection也罷,其目的並不是讓整個字典(或集合)真的「唯讀」,而是希望某些具有字典(或集合)性質類成員,能夠做到「在當前類中可讀寫,在類的外部唯讀」。

考慮這樣乙個場景,我要實現乙個filestructure類,表示檔案結構,其中包含了多個field。每個filestructure裡的每個field都具有不同的名字,我希望使用者能夠用名字檢索到對應的字段,所以最好的方式是將字段儲存在乙個字典中。

public class filestructure

}public filestructure()

private dictionary_fields;

}

上面的**雖然保證了fields屬性是唯讀的——可以確保使用者無法用自己的字典例項來替換filestructure所有的——但卻不能防止使用者自己向fields屬性中新增其他字段。

如果使用readonlydictionary,就能很好地避免這一問題。

public class filestructure

// change '_fields' to '_rofields'

}public filestructure()

private dictionary_fields;

private readonlydictionary_rofields; // added

}

現在,就不怕使用者「擅自」修改字典中的內容了。

在readonlydictionary的實現中,並沒有複製所包裝的字典中的內容。這樣做的好處是顯而易見的——其一,節省空間。其二,readonlydictionary能夠及時反映內部普通字典上發生的變化;也就是說,如果在類的「內部」向字典中新增了新值,或修改了某些條目,則在類的「外部」可以從之前拿到的唯讀字典中,訪問到這些變化過的條目。

(完)

應用場景之 區別篇

是否存在區別 is dir 存在資料夾,返回true if file 存在檔案,返回true file exists is dir is file 可以判斷目錄存在.和檔案存在 執行效率非常低 類是否存在 class exists 方法是否存在function exists 存在就把時區傳遞過去,先...

Redis應用場景

redis開創了一種新的資料儲存思路,使用redis,我們不用在面對功能單調的資料庫時,把精力放在如何把大象放進冰箱這樣的問題上,而是利用redis靈活多變的資料結構和資料操作,為不同的大象構建不同的冰箱。redis常用資料型別 redis最為常用的資料型別主要有以下五種 在具體描述這幾種資料型別之...

Redis應用場景

redis開創了一種新的資料儲存思路,使用redis,我們不用在面對功能單調的資料庫時,把精力放在如何把大象放進冰箱這樣的問題上,而是利用redis靈活多變的資料結構和資料操作,為不同的大象構建不同的冰箱。redis常用資料型別 redis最為常用的資料型別主要有以下五種 在具體描述這幾種資料型別之...