今天白天出现了碰见了一个问题,隐藏得比较深,这里记录一下。

初衷很简单,就是要更改改一个数据库的链接名,这个链接名是放在数据层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层用到的值还是原始的值,所以就导致出了问题。 

 

const 引起的BUG的更多相关文章

  1. BugTracker 加入发Mail的功能

    BugTracker部署好之后,发现增加bug不能mail提醒.于是补上这个功能记录在此,方法是次要的,主要是找到地方.需要3步.吐槽下Asp的代码风格看的真心蛋疼.... 一.发送mail(主要是找 ...

  2. 推荐一个优秀的c++源代码,TinyXml2

    项目主页:http://grinninglizard.com/tinyxml2docs/index.html tinyxml2.h /* Original code by Lee Thomason ( ...

  3. React require(“history”).createBrowserHistory` instead of `require(“history/createBrowserHistory”)

    看见bug惊讶,代码中并没有require("history/createBrowserHistory") //原有代码为 import createBrowserHistory ...

  4. openssl 1.1.1 reference

    openssl 1.1.1 include/openssl aes.h: # define HEADER_AES_H aes.h: # define AES_ENCRYPT 1 aes.h: # de ...

  5. 「caffe编译bug」 undefined reference to `boost::match_results<__gnu_cxx::__normal_iterator<char const*, std::__cxx11

    CXX/LD -o .build_release/tools/test_net.binCXX/LD -o .build_release/tools/convert_annoset.binCXX/LD ...

  6. C++ | 使用const std::map,map::[]时遇到的一个bug

    原函数简化后如下: void fun(const map<int,vector<int>> &mp, int index) { for (auto tmp : mp[i ...

  7. 应该是Angular2的一个bug?

    为了应对未来的趋势,及时赶上下一趟互联网技术,我最近也在通过具体项目研究angular2,首先必须要吐槽的是,学习angular2的成本本身不高,但是一堆的工具.配置实在让人 很是焦灼,就像asp.n ...

  8. 那些年黑了你的微软BUG

    本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 前言 炎炎夏日,朗朗乾坤,30℃ 的北京,你还在 Coding 吗? 整个 7 月都在忙项目,还加了 ...

  9. iOS开发之Bug(持续更新)

    前言:收集在开发和学习的过程中遇到的bug. 1.循环利用cell的ID设置位置写错了.导致程序奔溃. 2.对于除数算法,可以直接算出结果的就写上结果,不要偷懒写式子让计算机自己算,更何况是除数,会有 ...

随机推荐

  1. JS性能优化

    1.不要在同一行声明多个变量. 2.请使用 ===/!==来比较true/false或者数值 3.使用对象字面量替代new Array这种形式 4.不要使用全局函数. 5.Switch语句必须带有de ...

  2. html中,文件上传时使用的<input type="file">的样式自定义

    Web页面中,在需要上传文件时基本都会用到<input type="file">元素,它的默认样式: chrome下: IE下: 不管是上面哪种,样式都比较简单,和很多 ...

  3. Navisworks API 简单二次开发 (自定义工具条)

    在Navisworks软件运行的时候界面右侧有个工具条.比较方便.但是在二次开发的时候我不知道在Api那里调用.如果有网友知道请告诉我.谢谢. 我用就自己设置一个工具.界面比较丑!没有美工. 代码: ...

  4. 分金币 bzoj 3293

    分金币(1s 128M)  coin [问题描述] 圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的 ...

  5. SQLServer2005+获取表结构信息

    SELECT d.name TableName, a.colorder FieldNo,a.name FieldName, (case when COLUMNPROPERTY( a.id,a.name ...

  6. opts=opts | |{}

    var opts=opts || {}这个语句是一个赋值或者初始化语句 该语句在opts已经被初始化过后opts的值不变,即执行var opts=opts这一部分. 当opts未被初始化,即typeo ...

  7. DOM加载过程中ready和load的区别

    在浏览器地址栏输入URL地址,浏览器开始加载页面时,有以下几个过程 1.浏览器开始解析HTML文档 2. 浏览器遇到HTML文档中的<script>元素以及CSS样式文件,并且没有asyn ...

  8. Java关键字final、static

    一.final根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. final ...

  9. Spark中Lambda表达式的变量作用域

    通常,我们希望能够在lambda表达式的闭合方法或类中访问其他的变量,例如: package java8test; public class T1 { public static void main( ...

  10. json的理解及读取

    一: JSON 语法是 JavaScript 对象表示语法的子集,其语法规则如下: 数据在键值对中 数据由逗号分隔 花括号保存对象:{} 方括号保存数组:[] 如:[{"name" ...