const修飾詞可以(而且通常應該)套用在任何欄位上,只要它的值在編譯期就已經知道,而且在程式的生命週期內不會改變。
private const int num = 1729;
public const string title = "Grand" + " Master";
readonly修飾詞可以(而且通常應該)套用在任何無法標為const的欄位上,只要它的值在程式的生命週期內不會改變,而且是在內嵌初始設定式中設定,或是在具現化時設定(由建構函式,或由建構函式呼叫的方法來設定)。
private readonly int num;
private readonly System.Random rand = new System.Random();
public MyClass(int num)
{
this.num = num;
}
在安全性敏感的情境下(或者單純在開發者各有不同優先順序與目標的大型程式碼基底裡),你都應該避免讓類別的公開 API 遭到繞過:不要接受並儲存方法傳入的可變參數,也不要透過回傳值或out參數,把類別中的可變成員暴露出去。
雖然readonly修飾詞可以防止欄位中的值或參考被覆寫,它對參考型別的成員卻沒有任何保護作用。
readonly List<int> ints = new List<int>();
void Foo()
{
ints.Add(1); // ok
ints = new List<int>(); // fails to compile
}
若要確保參考型別的所有成員都受到保護,可以把欄位標為readonly,並定義不含set存取子的自動屬性。
基底類別庫(BCL)提供了一些集合的唯讀版本,用於需要阻止集合成員被更新的情況。這些版本以包裝函式的形式提供:
ReadOnlyDictionary<T>將Dictionary<T>以唯讀形式公開。ReadOnlyCollection<T>將List<T>以唯讀形式公開。你在 developer-privileges 中最後看到的身分驗證系統需要一些關注。你的任務是整理這些程式碼。這樣的重構專案不僅能讓未來的維護者輕鬆一些,還能揭露並修正一些安全性漏洞。
這是一項重構任務。對你認為適合的Authenticator或Identity成員加上const修飾詞。
這是一項重構任務。對你認為適合的Authenticator類別或Identity結構的欄位加上readonly修飾詞。
對Authenticator類別或Identity結構上任何適合的屬性,移除set存取子或將其設為private。
目前管理員身分欄位是透過呼叫Admin回傳的。這並不理想,因為呼叫端可以修改這個欄位。請想辦法防止呼叫端修改Authenticator物件上的管理員詳細資料。
目前包含寫死之具特殊權限開發者身分的字典,是透過呼叫GetDevelopers()回傳的。這並不理想,因為呼叫端可以修改這個字典。請想辦法防止呼叫端修改Authenticator物件上的開發者詳細資料。