域的聲明中如果加上了readonly修飾符,表明該域為只讀域。對於只讀域我們只能在域的定義中和它所屬的構造函數中進行修改,在其它情況下,域是“只讀”的。
熟悉c和C++的程序員可能習慣了使用const和#define定義一些容易記住的名字來表示某個數值。static和readonly修飾符可以起到同樣的效果:
public class A { public static readonly double PI=3.14159; public static readonly Color White=new Color(255,255,255); public static readonly int kByte=1024; ......//other members }
這樣,在程序中我們就可以直接使用PI來指代圓周率,white來表示白色,等等。
那麼,使用static readonly與使用const有什麼區別呢?簡單地說,const型表達式的值在編譯時形成,而static readonly表達式的值直到程序運行時才形成。看下面這個例子:
程序清單12-2:
using System; namespace Program1 { public class A { public static readonly int X=1; } } namespace Program2 { class Test { static void Main(){ Console.WriteLine(Program1.A.x); } } }
假定名字空間Program1和Program2表示兩個分別獨立編譯的程序(有關名字空間的概念我們將放在後續章節中介紹)。在這裡,域X的靜態只讀的,它的值由於是在編譯時形成的,所以無論是否改變Program1中X的值,只要不重新編譯Program2,Program2的輸出就不會發生變化。如果Program2已經安裝在用戶的系統上,對Program1的升級不會影響到舊的Program2的使用。這種技術有利於進行版本控制。