最近,對項目的庫做了一次升級,程序一切正常。但是,有次打開Oracle,發現數據不對,表中還是沒有升級之前的老數據。於是,對所有庫做了一次徹底檢查,硬是沒找出bug。 心裡想,先放著吧,說不定就來靈感了呢! 幾天後,我偶然把項目全部compiler一次,數據竟然正常了。怪,怪了。難道是常量的問題嗎?因為升級的後的庫,只對幾個地方做了修改,其中一個就是改變了常量的值。 先做個小DEOM看看吧!
定義庫
using System;
using System.Collections.Generic;
using System.Text;
namespace ClassLibrary1
{
public class Class1
{
private const string i = "aaa";
private string m = "bbb";
public string getString()
{
return i;
}
}
}
Class1中定義了一個常量i=”wmj”,還有一個全局對象變量m=”gmj”,僅此而已。
打開ILDASM.EXE
先看看m
.fIEld private string m
可以看到m被定義成私有的,字符串類型的對象字段。
再看看i
.fIEld private static literal string i = "aaa"
可以看到i被定義成私有的,字符串類型的類字段,而且初始值已經保存到IL中,問題就出在這裡了。
如果修改i=”ccc”,我發現如果不compiler引用他的程序,程序仍然維持i=”aaa”。
下面是修改前後的效果;
所以在數據需要跨程序集的時候,盡量避免定義為const類型,而且最好全部compiler一次。