zoukankan      html  css  js  c++  java
  • 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层用到的值还是原始的值,所以就导致出了问题。 

     

  • 相关阅读:
    CodeForces 510C Fox And Names (拓扑排序)
    Codeforces 1153D Serval and Rooted Tree (简单树形DP)
    HDU 6437 Problem L.Videos (最大费用)【费用流】
    Luogu P3381 (模板题) 最小费用最大流
    Codeforces 741B Arpa's weak amphitheater and Mehrdad's valuable Hoses (并查集+分组背包)
    Codeforces 1144F Graph Without Long Directed Paths (DFS染色+构造)
    HDU 2204 Eddy's 爱好 (容斥原理)
    Codeforces 939E Maximize! (三分 || 尺取)
    Codeforces 938D. Buy a Ticket (最短路+建图)
    CodeForces 959E Mahmoud and Ehab and the xor-MST (MST+找规律)
  • 原文地址:https://www.cnblogs.com/minesnil-forfaith/p/4612024.html
Copyright © 2011-2022 走看看