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

     

  • 相关阅读:
    第二阶段站立会议第十天
    第二阶段站立会议第九天
    第二阶段站立会议第八天
    第二阶段站立会议第七天
    第二阶段站立会议第六天
    第二阶段站立会议第五天
    第二阶段站立会议第四天
    第二冲刺阶段个人进度10
    第二冲刺阶段个人进度09
    第二冲刺阶段个人进度08
  • 原文地址:https://www.cnblogs.com/minesnil-forfaith/p/4612024.html
Copyright © 2020-2023  润新知