C#: 方法的默认参数
大家都知道在C++中,我们可以为方法的参数指定一个默认值,像这样:
void foo(int i = 100);
当我们以这种形式调用方法的时候: foo(); 实际上参数i被赋于了默认值,所以相当于调用了foo(100);
然而在C#中是不支持参数的默认值的,那么如果我们要用到类似的功能应该怎么实现呢?考虑下面这个例子:
class Buffer
{
public Buffer(int bufferSize = 100) //Compile Error
{
buf = new int [bufferSize];
}
private int[] buf;
}
首先当然要为Buffer提供一个无参的构造函数重载:
class Buffer
{
public Buffer(int bufferSize)
{
buf = new int[bufferSize];
}
public Buffer():this(100)
{
}
private int[] buf;
}
但
这个方法有一个问题就是我们把Buffer的默认大小hard-coding到了代码里,这有两个弊端,一是损害了代码的可读性,二是用以上方法,如果
Buffer有多个重载的构造函数都用到bufferSize的默认值,一旦你要修改默认值的大小,不得不同时修改多处程序,一旦漏掉了其中的一个,说不
定就麻烦大了。
所以,正确的方法是为bufferSize提供一个const的默认值:
class Buffer
{
private const int defaultBufferSize = 100;
public Buffer(int bufferSize)
{
buf = new int[bufferSize];
}
public Buffer():this(defaultBufferSize)
{
}
private int[] buf;
}
观察编译器为public Buffer()产生的il代码
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 20 (0x14)
.maxstack 2
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ldarg.0
IL_0007: ldc.i4.s 100 //100即为defaultBufferSize的值
IL_0009: newarr [mscorlib]System.Int32
IL_000e: stfld int32[] Buffer::buf
IL_0013: ret
} // end of method Buffer::.ctor
defaultBufferSize
的值在相应的调用处被替换成了字面常量(这其实也就是const成员的特性),所以使用defaultBufferSize不会影响public
Buffer()的执行效率。而由于const成员隐含了static的特性,所以一个Buffer类只有一个defaultBufferSize的变
量,性能的影响也是很小的。
我们可以看到.net 类库中的许多类都使用了这种方法
C#: 方法的默认参数的更多相关文章
- redux中createStore方法的默认参数
一般使用方法: createStore(reducer, applyMiddleware(thunk)) 传递默认参数: createStore(reducer, defaultState, appl ...
- vue.js实战——方法设置默认参数
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- C# 方法里面的默认参数
最近有很多地方都用到了方法的默认参数,遂总结之. (一)先从原理说起 在C#中,一旦为某个参数分配了一个默认值,编译器就会向内部该参数应用定制一个attribute 即是(OptionalAttrib ...
- 使用可变对象作为python函数默认参数引发的问题
写python的都知道,python函数或者方法可以使用默认参数,比如 1 def foo(arg=None): 2 print(arg) 3 4 foo() 5 6 foo("hello ...
- 定义一个复数(z=x+iy)类Complex,包含: 两个属性:实部x和虚部y 默认构造函数 Complex(),设置x=0,y=0 构造函数:Complex(int i,int j) 显示复数的方法:showComp()将其显示为如: 5+8i或5-8i 的形式。 求两个复数的和的方法:(参数是两个复数类对象,返回值是复数类对象)public Complex addComp(Compl
因标题框有限,题目未显示完整,以下再放一份: 定义一个复数(z=x+iy)类Complex,包含: 两个属性:实部x和虚部y 默认构造函数 Complex(),设置x=0,y=0 构造函数:Compl ...
- Idea_学习_09_Idea 方法自动生成参数默认名
一.方法 1.快捷键 生成方法后,还空着参数,可以使用 ctrl + alt + 空格 ,列出参数,然后选择参数即可. 2.使用插件 二.参考资料 1.Intellij Idea 方法自动生成参数默认 ...
- 工作随笔——Java调用Groovy类的方法、传递参数和获取返回值
接触Groovy也快一年了,一直在尝试怎么将Groovy引用到日常工作中来.最近在做一个功能的时候,花了点时间重新看了下Java怎么调用Groovy的方法.传递参数和获取返回值. 示例Groovy代码 ...
- 我的c++学习(6)默认参数和内联函数
默认参数 一般情况下,函数调用时实参个数应与形参相同,但为了更方便地使用函数,C++也允许定义具有默认参数的函数,这种函数调用时实参个数可以与形参不相同.“默认参数”指在定义或声明函数时为形参指定默认 ...
- C#.Net 调用方法,给参数赋值的一种技巧
C#中可以给参数赋值默认值(其实这种写法有点不太好,有时会使方法的功能太复杂了)。 但是往往有多个默认参数时,有的参数需要使用默认值,有的不使用默认值,这时正常的写法就行不通了,解决方法可参照下边的代 ...
随机推荐
- I.MX6 Linux mipi配置数据合成
/*************************************************************************** * I.MX6 Linux mipi配置数据合 ...
- HDU 5366 The mook jong (简单DP)
题意:ZJiaQ希望把木人桩摆在自家的那个由1*1的地砖铺成的1*n的院子里.由于ZJiaQ是个强迫症,所以他要把一个木人桩正好摆在一个地砖上,由于木人桩手比较长,所以两个木人桩之间地砖必须大于等于两 ...
- 【英语】Bingo口语笔记(28) - 表示“秘密”
- 【英语】Bingo口语笔记(58) - blow系列
- mysql now() sysdate() curdate()区别
//mysql中now,curdate,curtime,sysdate区别 1.now 返回的时间,格式如下:2013-01-17 10:57:13 mysql> select now(),sl ...
- Java中sychronized方法与sychronized块区别
一.举几个栗子
- 【转】WCF和ASP.NET Web API在应用上的选择
文章出处:http://www.cnblogs.com/shanyou/archive/2012/09/26/2704814.html 在最近发布的Visual Studio 2012及.NET 4. ...
- arcgis for android 无法加载本地jpg影像解决办法
因为jpg影像没有生成金子塔文件*.rrd 一个完整的JPG影像必须包括如下文件: K-50-96-(16).aux 辅助文件K-50-96-(16).jgw 坐标信息K-50-96-(16).j ...
- core文件分析
http://baidutech.blog.51cto.com/4114344/904419/ http://www.newsmth.net/pc/pccon.php?id=10001977& ...
- C/C++中static关键字详解-zz
静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值. 静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见.用法1:函数内部声明 ...