今天白天出现了碰见了一个问题,隐藏得比较深,这里记录一下。
初衷很简单,就是要更改改一个数据库的链接名,这个链接名是放在数据层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层用到的值还是原始的值,所以就导致出了问题。