zoukankan      html  css  js  c++  java
  • 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 类库中的许多类都使用了这种方法

  • 相关阅读:
    【springboot】 springboot整合quartz实现定时任务
    Map集合的四种遍历方式
    WCF自引用和循环引用导致的序列化问题
    c#反射
    小助手配置文件列表页
    WPF数据绑定(ItemTemplate和DataTemplate)
    TankMapData
    手机qq协议做的第三方qq软件
    WPF MVVM模式学习
    小助手(应用盒子之我的实现思路及示例程序)
  • 原文地址:https://www.cnblogs.com/zhaoxinshanwei/p/4009076.html
Copyright © 2011-2022 走看看