const 引起的BUG

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

初衷很简单,就是要更改改一个数据库的链接名,这个链接名是放在数据层public const string 17uwangDB="17uwangdian",也就是DataAccess项目下面,然后我Servcie层项目也用到这个链接名使,string db=DataBaseFactory.GetDatabase(DbHelper.17uwangDB);现在我把这个变量名的值给更改了,因为只更改了数据层 然后编译数据层dll,自测总是提示没有找对对应的链接名,然后直接编译解决方案,ok,没问题。然后因为我只动了数据层就只把数据层这个dll传到线上,然后运行,黄页,百思不得其解。然后突然想到const修饰的是静态常量也就是说在编译之后就确定下来了,也就是说线上的service dll用到的db变量还是我修改之前的那个值,那么我把本地编译之后的service dll也传到线上就行了,果然就OK了。

现在来分析下这里出现的问题。

问题就是出现在const修饰符上,const修饰的17uwangDB为静态常量,代码中用到了这个变量的地方编译之后都会替换成表示的值 17uwangdian

直接看代码,为了看区别添加了readonly 和不加修饰符做对比:

DataAccess层声明变量DBBlog

namespace Simple.DataAccess
{
   public class DbHepler
   {
       public const string constDB = "17uwangdian";
       public static readonly string readonlyDB = "17uwangdian";
   }
}

  

 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 = "17uwangdian".Length;
			int length2 = DbHepler.readonlyDB.Length;
		}
	}
}

 这里可以看到const修饰的constDB变量编译之后已经被替换成了原来定义的值,而readonlyDB没有变化,readonlyDB会在代码执行到这里来的时候才会把值替换。

回到最上面的出现的问题,我修改了DataAccess层的变量值,但是并没有重新编译Service层 ,那么Servce层用到的值还是原始的值,所以就导致出了问题。 

 

时间: 2024-10-10 20:15:58

const 引起的BUG的相关文章

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

项目主页:http://grinninglizard.com/tinyxml2docs/index.html tinyxml2.h /* Original code by Lee Thomason (www.grinninglizard.com) This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for an

《程序员面试宝典》精华 编程语言部分

<程序员面试宝典>精华 编程语言部分 正所谓取其精华,去其糟粕.本文谨记录下<程序员面试宝典>一些关键的知识点.易错点,对于一些虽然重要但书中没有解释清楚的地方不做记录.当然这里的糟粕只是指不那么重要,或者比较简单,并不是说书写的不好.希望以后回顾时无需再看此书,只看保留在文中的精华即可. 文中有少许bug,亦摘录在此. 本文专注编程语言部分,包括第五章到第九章的内容 第五章 语言细节 5.1 y = z = 5,等号先计算右边,返回值是赋值后的左边的变量值 5.1 printf函

poj 2492 a bug&#39;s life 简单种类并查集

题意大致为找同性恋的虫子.... 这个比食物链要简单些.思路完全一致,利用取余操作实现关系之间的递推. 个人感觉利用向量,模和投影可能可以实现具有更加复杂关系的并查集. 1 #include<cstdio> 2 using namespace std; 3 const int MAXN=50010; 4 int fa[MAXN]; 5 int rel[MAXN]; // 0代表同类,1代表吃fa[i],2代表被吃 6 void _set(int n) 7 { 8 for(int i=1;i&l

关键字const和static

static 关键字的作用: 1.变量的内存只被分配一次 2.他的作用域跟其他变量无差别 关键字const 不是常数,可以是变量,只是你不能修改它 1) 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的.如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息.(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的.) 2) 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码. 3

Linux版Matlab R2015b的bug——脚本运行的陷阱(未解决)

0 系统+软件版本 系统:CentOS 6.7 x64, 内核 2.6.32-573.el6.x86_64软件:Matlab R2015b(包括威锋网和东北大学ipv6下载的资源,都测试过) 1 bug描述 1.1 未知的“陷阱” 首先,这个程序在Matlab R2013a中可以完美运行,这个“陷阱“在是新安装的R2015b上才出现的. 说它是“陷阱“,是因为脚本文件涉及到大量的数据处理,比如一个几百次的循环,它可能在执行某一句的时候就失去响应了,可能是一个循环,也可能是单句,仿佛掉进了一个未知

HDU1829 - A Bug&#39;s Life 分组并查集

HDU1829 - A Bug's Life : http://acm.hdu.edu.cn/showproblem.php?pid=1829 题意:首先输入T,接下来是T组测试数据.每组测试数据第一行输入N,M代表共有N个人,接下来有M行输入.每行有两个数a和b,代表编号为a和b的两个人是异性.输入结束后判断是否存在错误的信息.如N = 3,M = 3,接下来是3组输入.1  2,2  3,1  3.此组数据是错的,因为1 和 3都和2是异性,说明1 和 3是同性,但第三组数据又说1和3是异性

658 - It&#39;s not a Bug, it&#39;s a Feature! (Dijkstra算法)

今天第一次系统的学习了一下最短路算法,开始刷第十一章,第一次写Dijkstra算法,出现了很多喜闻乐见的错误..而且uva上样例很水,瓢虫也很水 ,坑了我好久. 首先是对于结点的处理,我们必须要维护一个二元组,一个表示结点一个表示当前结点最短路.   因为Dijkstra算法利用了优先队列来加速算法,所以需要定义小于运算符,一开始我直接将状态装进了优先队列,显然是不对的,因为优先队列的作用就是取出当前距离最短的结点. 其次,说说最短路算法蕴含的巧妙思想: 每次从当前所有还未标记的结点中选择一个距

hdu1829 A Bug&#39;s Life(并查集)

开两个并查集,然后合并的时候要合并两次,这样在合并之前判断是否冲突,如果不冲突就进行合并,否则不需要继续合并. #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; const int MAX=2000; int pre[2*MAX+5]; bool mark; void init(int n){ int i; for(i=1

const 详解

? 简单分类: 常变量        const 类型 变量名  或者   类型 const  变量名 常引用        const 类型& 引用名  或者  类型 const & 引用名 常对象        const 类名     对象名  或者  类名 const     对象名 常数组        const 类型     数组名   或者  类型  const     数组名 常成员函数    类名::fun(形参) const 常指针        const 类型*指