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

初衷很简单,就是要更改改一个数据库的链接名,这个链接名是放在数据层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. golang枚举类型 - iota用法拾遗

    在c#.java等高级语言中,经常会用到枚举类型来表示状态等.在golang中并没有枚举类型,如何实现枚举呢?首先从枚举的概念入手. 1.枚举类型定义 从百度百科查询解释如下:http://baike ...

  2. 你究竟有多了解Spring?

    曾经在一本书上看到这么一句话: 一个程序员的能力不在于增加代码的能力,而在于减少代码的能力. 基于以上我认之为真的命题,我经常问和我一起工作的程序员:你的程序还能不能精简一点?如果能,那能不能再精简一 ...

  3. .Net语言 APP开发平台——Smobiler学习日志:如何快速实现类似于微信的悬浮显示二维码效果

    最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 样式一 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的&qu ...

  4. Matlab 之 find()函数

    当我第一次用matlab语言编写一个工程项目时,发现自己编写的脚本里循环特别多,导致编程效率很低,这让我特别苦恼.有一次导师让我阅读他编写的一个Matlab脚本,并按照新要求对其进行更改.我发现脚本里 ...

  5. java web学习总结(二十三) -------------------编写自己的JDBC框架

    一.元数据介绍 元数据指的是"数据库"."表"."列"的定义信息. 1.1.DataBaseMetaData元数据 Connection.g ...

  6. autofac 组件的实例范围

    实例范围决定如何在请求之间共享服务. 原文地址:http://docs.autofac.org/en/latest/lifetime/instance-scope.html 每个依赖一个实例 使用这个 ...

  7. bootstrap表格分页

    <script src="~/Scripts/jquery.min.js"></script> <script src="~/Scripts ...

  8. js判断窗体或容器滚动条到底部

    NO1---jquery判断窗体滚动条到底部 $(window).scroll(function () {if ($(window).scrollTop() >= $(document).hei ...

  9. mui 手势事件配置

    在开发中监听双击屏幕事件时不起作用,需要在mui.init方法的gestureConfig参数中设置需要监听的手势事件 手势事件配置: 根据使用频率,mui默认会监听部分手势事件,如点击.滑动事件:为 ...

  10. ArcGIS Engine开发之地图导出

    关于地图导出的方法有很多,但是核心技术就那么一点.下面是从项目实战中总结的一部分地图导出的方法:(以全域导出和区域导出为例) 1.由于地图导出用到的函数和方法容易重复,增加了工作量故首先将其进行封装成 ...