今天白天出現了碰見了一個問題,隐藏得比較深,這裡記錄一下。
初衷很簡單,就是要更改改一個資料庫的連結名,這個連結名是放在資料層public const string connDB="connDBValue",也就是DataAccess項目下面,然後我Servcie層項目也用到這個連結名使,string db=DataBaseFactory.GetDatabase(DbHelper.connDB);現在我把這個變量名的值給更改了,因為隻更改了資料層 然後編譯資料層dll,自測總是提示沒有找對對應的連結名,然後直接編譯解決方案,ok,沒問題。然後因為我隻動了資料層就隻把資料層這個dll傳到線上,然後運作,黃頁,百思不得其解。然後突然想到const修飾的是靜态常量也就是說在編譯之後就确定下來了,也就是說線上的service dll用到的db變量還是我修改之前的那個值,那麼我把本地編譯之後的service dll也傳到線上就行了,果然就OK了。
現在來分析下這裡出現的問題。
問題就是出現在const修飾符上,const修飾的connDB為靜态常量,代碼中用到了這個變量的地方編譯之後都會替換成表示的值 connDBValue
直接看代碼,為了看差別添加了readonly 和不加修飾符做對比:
DataAccess層聲明變量DBBlog
namespace Simple.DataAccess
{
public class DbHepler
{
public const string constDB = "connDBValue";
public static readonly string readonlyDB = "connDBValue";
}
}
service層調用DbHepler.DBBlog變量
namespace Simple.Service
{
public class Example
{
public void GetInfo()
{
int constL = DbHepler.constDB.Length;
int readonlyL = DbHepler.readonlyDB.Length;
}
}
}
反編譯看源代碼
namespace Simple.Service
{
public class Example
{
public void GetInfo()
{
int length = "connDBValue".Length;
int length2 = DbHepler.readonlyDB.Length;
}
}
}
這裡可以看到const修飾的constDB變量編譯之後已經被替換成了原來定義的值,而readonlyDB沒有變化,readonlyDB會在代碼執行到這裡來的時候才會把值替換。
回到最上面的出現的問題,我修改了DataAccess層的變量值,但是并沒有重新編譯Service層 ,那麼Servce層用到的值還是原始的值,是以就導緻出了問題。