天天看點

const 引起的BUG

今天白天出現了碰見了一個問題,隐藏得比較深,這裡記錄一下。

初衷很簡單,就是要更改改一個資料庫的連結名,這個連結名是放在資料層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層用到的值還是原始的值,是以就導緻出了問題。