大家都知道在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 类库中的许多类都使用了这种方法

最新文章

  1. javascript闭包学习例子
  2. windows live Writer test
  3. 八、CCMenu和CCMenuItem
  4. CentOS 下 Codeblocks 的 安装 + 汉化 以及 基本使用介绍
  5. Linux procfs详解
  6. fopen/fclose
  7. openerp import namespace
  8. bulk insert data into database with table type .net
  9. java之简单工厂模式详解
  10. 《Java技术》第三次作业
  11. .net关于坐标之间一些简单操作
  12. bool值的底层应用场景
  13. <ROS> message_filters 对齐多种传感器数据的时间戳
  14. Kubernetes 笔记 03 扫清概念
  15. tomcat开启自启动
  16. 你了解大O符号(big-O notation)么?你能给出不同数据结构的例子么?
  17. 自学Zabbix4.1 zabbix监控web服务器访问性能
  18. C# WINFORM 打包数据库
  19. git ssh免登陆,以及ssh config
  20. AIDL安卓接口定义语言

热门文章

  1. ubuntu下实现openerp 7使用nginx反正代理及绑定域名
  2. Linux ARM kernel Makefile and Kconfig
  3. S2sh整合MAven项目所需坐标大全
  4. Swift语法
  5. [Everyday Mathematic]20150212 求 $(\cos x+2)(\sin x+1)$ 的最大值
  6. wc命令--Linux统计文件行数
  7. YII 配置文件
  8. Aptana 插件 for Eclipse 4.4
  9. Python在centos下的安装
  10. win7 共享的问题,"您可能没有权限使用网络资源"的解决办法