天天看點

C# readonly字段

常量的概念就是一個包含不能修改的值的變量,常量是c#與大多數程式設計語言共有的。但是,常量不必滿足所有的要求。有時可能需要一些變量,其值不應改變,但在運作之前其值是未知的。c#為這種情形提供了另一個類型的變量:隻讀字段。

readonly關鍵字比const靈活很多,允許把一個字段設定為常量,但可以執行一些運算,以确定它的初始值。其規則是可以在構造函數中給制度字段指派,但不能在其他地方指派,隻讀字段還可以是一個執行個體字段,而不是靜态字段,類的每個執行個體可以有不同的值。與const字段不同,如果要把隻讀字段設定為靜态,就必須顯式聲明。

如果有一個編輯文檔的mdi程式,因為要注冊,需要限制可以同時打開的文檔數。現在假定要銷售該軟體的不同版本,而且顧客可以更新他們的版本,以便同時打開更多的文檔。顯然,不能在源代碼中對最大文檔數進行寫死。而是需要一個字段表示這個最大的文檔數。這個字段必須是隻讀的----每次安裝程式時,從系統資料庫鍵或其他檔案存儲中讀取。代碼如下所示:

    public class documenteditor

    {

        public static readonly uint maxdocuments;

        static documenteditor()

        {

            maxdocuments = dosomethingtofindoutmaxnumber();

        }

    }

在本例中,字段是靜态的,因為每次運作程式的執行個體時,隻需存儲最大文檔數一次。這就是在靜态構造函數中初始化它的原因。例如,假定編輯的每個文檔都有一個建立日期,但不允許使用者修改它(因為這會覆寫過去的日期)。注意,該字段也是公共的,我們不需要把隻讀字段設定為私有,因為按照定義,它們不能在外部修改(這個規則也适用于常量)。

如前所述,日期用基類system.datetime表示。下面的代碼使用帶有3個參數(年份、月份和月份中的日)的system.datetime構造函數,可以從msdn文檔中找到這個構造函數和其他datetime構造函數的更多資訊。

    public class document

        public readonly datetime creationdate;

        public document()

            creationdate = new datetime(2002,1,1);

在上面的代碼中,creationdate和maxdocuments的處理方式與其他字段相同,但因為它們是隻讀的,是以不能在構造函數外部指派:

    void somemethod()

        maxdocuments = 10;

還要注意,在構造函數中不必給隻讀字段指派,如果沒有指派,它的值就是其資料類型的預設值,或者在聲明時給它初始化的值。這适用于靜态和執行個體隻讀字段。

繼續閱讀