C#的方法采用默认的参数时应注意版本问题
来源:互联网 发布:sql server 2008安装 编辑:程序博客网 时间:2024/05/22 00:23
在一个项目里引用到另一个dll中的带有默认参数的方法时
static void Main(string[] args)
{
Test t = new Test();
t.Work();
}
在dll的最初实现为:
public class Test
{
public void Work(int a = 5, string name = "fudan")
{
Console.WriteLine("a:" + a + "\nname:" + name);
}
}
此时将会输出:
a:5
name:fudan
但是如果dll发生变化,并进行重新编译,而此时没有对Main方法进行重新编译,将会出错。如,dll改为:
public class Test
{
public void Work(int a = 10, string name = "tsing")
{
Console.WriteLine("a:" + a + "\nname:" + name);
}
}
如果main方法没有进行重新编译,则仍会输出:
a:5
name:fudan
这说明默认的行为出错了。真正的默认行为是:
a:5
name:fudan
原因:
C#编译器在编译时,如果发现没有给方法Work提供实参,则会对参数a与name采用默认参数,此时将在main方法上生成两个临时变量用将保存默认的值5与“fudan”,当方法运行时,将把这两个临时变量作为参数传送到方法Work上。因此,当重新生成新的dll时,并没有对main方法进行重新编译,所以,main方法传送的参数值并没有发生变化。为了使得默认的行为正确,只得重新编译。但是这样做并不合理,因此,最好的采用默认参数的方法是:对引用类型采用null,对值类型采用0.
如:
public class Test
{
public void Work(int a = 0, string name = null)
{
if(a==0)a=10;
if(name==null) name="tsing";
Console.WriteLine("a:" + a + "\nname:" + name);
}
}
这样,进行修改时,可以不用重新编译Main方法,就可以实现默认行为的变化。对于小的项目而言,问题不大。但是对于类库的提供者而言,好像这个问题挺大的。
- C#的方法采用默认的参数时应注意版本问题
- c# 读取excel应注意的问题
- 应注意的问题
- 使用fopen时应注意的问题
- 使用Sql时应注意的问题
- 部署程序时应注意的问题
- 重写BaseAdapter时应注意的问题
- 行过滤时应注意的问题
- mybatis 重写时应注意的问题
- 使用默认参数带来的版本问题
- delete 应用时应注意的问题
- C#对Excel编程应注意的问题
- 聚类分析应注意的问题
- jpa 应注意的问题
- 变量应注意的问题
- 指针应注意的问题
- 子类重写父类的方法应注意的问题
- 子类重写父类的方法应注意的问题
- 如何在word中使代码高亮
- Android控件拖动的实现
- 合并两个单链表练习,多项式合并
- 设计模式
- Linux中自定义系统调用
- C#的方法采用默认的参数时应注意版本问题
- POJ 1144 - Network 用tarjan求无向图的割点
- struts2 中chain、redirect、redirectaction的区别
- 贝叶斯公式和全概率公式--笔试中的那些有趣的数学问题
- OpenCV2.44 在win7 64 VS2010下的配置
- 网络基础的基础
- 左旋转字符串的实现(将字符串前面的k个字符移动到字符串的尾部)
- 好累啊
- hdoj 湫湫系列故事——减肥记I