從MSIL 命令清單的最上面一行你可以看到,StartValue(的值)是動態載入的。
但是,在MSIL命令的最後,結束條件是把值10當成硬代碼(hard-coded)使用的。
另一方面,有些時候你也須要為某些值使用編譯時常量。例如:考慮一 個須要識別不同版本的續列化情形。用來標識一個特殊版本號的常量應該是一個 編譯時常量,它們決不會發生改變。而當前版本號則應該是一個運行時常量,在 不同的版本發布後會有所改變。
private const int VERSION_1_0 = 0x0100;
private const int VERSION_1_1 = 0x0101;
private const int VERSION_1_2 = 0x0102;
//major release;
private const int VERSION_2_0 = 0x0200;
//Chech for the current version:
private static readonly int CURRENT_VERSION = VERSION_2_0;
在每次存盤時,你用運行常量來保存當前版本號。
//Read fom persistent storage, check stored version against complIE-time constant:
protected MyType(SerializationInfo info, StreamingContext cntxt){
int storedVersion = info.GetInt32 ("VERSION");
switch(storedVersion){
case VERSION_2_0:
readVersion2(info,cntxt);
break;
case VERSION_1_1:
readVersion1(info,cntxt);
break;
//etc.
}
}
//Write the current version:
[SecurityPermissionAttribute (SecurityAction.Demand,SerializationFormatter = true)]
void ISerializable.GetObjectData(SerializationInfo inf,StreamingContext cxt){
//use runtime constant for currnet version
inf.AddValue("VERSION",CURRENT_VERSION);
//
//write remaining delements...
}
最後一個有利的原 因而使我們要使用編譯時常量,就是它的性能。比起運行時常量,已知的編譯時 常量可以更直接有效的被訪問。然而,性能上的功效是甚微的,並且應該與可伸 縮性的降低進行一個權衡。Be sure to profile perforMace differences before giveing up the flexibility.
const的值必須在編譯時被確定, (它們可以是):屬性參數,枚舉定義,以及一小部份你認為應該定義一個值且該 值不能在不同的版本發布時發生改變的常量。
無論如何,寧願選擇伸縮 性更強的運行時常量。
============================
小結:第 一次翻譯。昨天花了半天時間,今天又花了幾個小時。終於完成了Item2的翻譯 。感覺很吃力。或者我的翻譯很糟糕,或者已經有更好的翻譯了,但不管怎樣, 這也算是我自己辛苦勞動的結果。希望對讀者有所幫助。本想在翻譯中添加一我 自己的看法,那樣的話對原文的改動可能比較大,所以沒做太多注解。我會繼續 努力翻譯完後面的Items,不管翻譯的怎樣,也不管是不是有其它的翻譯已經完 成了。這對自己也是一個學習過程。我會在後面的翻譯中一些我自己的看法,當 然盡可能的保留原文的樣子,實在不好辦的,我就會以讀書筆記的形式另外寫文 章。
另外,我也不知道這樣的文章能不能發在首頁,如果不行,以後的 就都發到其它區吧。
返回教程目錄