技术开发 频道

C#4.0新特性;命名可选参数与COM互操作

  【IT168 技术文档】

  1.简介

  之前C#(2.0)和java一样是一门的纯粹的面向对象的语言,他们都使用重载而不是可选参数。但是实际上使用的其他外部程序,COM组件却经常不要求指定所有参数(这在很多VC,VB编写的组件或者操作IronPython的对象的时候很常见,他们一直使用可选参数)。这会导致一个C#程序员不得不用Type.Missing塞满整个参数列表。不过C#4.0终于支持命名参数/可选参数了。程序员可以在方法调用的时候通过命名参数指定可选参数。而这一切都是为了让.Net 4.0的动态语言运行库(DLR)在动态绑定的时候具有更好的兼容性。

  2.命名与可选参数

  这个对C#来说是又一个新特征,但对C++,VB,Python etc. 的程序员来说这只是很自然的一个特征。C# 4.0种的可选参数和其他语言中的用法大致相同,这里不需要VB中额外的关键词修饰,也不能像C++中只用点点点来表示可以无视,倒是和python比较像,下面的声明是合法的:

  可选参数Foo

  static void Foo(int a, String s = "i'm a string", dynamic b =null, MyClass c = null)

 

  简单来讲,C#4.0中使用可选参数必须遵循以下几条原则:

  可选参数必须有个编译时常量作为其默认值。如果是除String之外的引用类型(包括那个特殊的dynamic类型),默认值只能是null。下面的声明是不能通过编译的:

  static void Foo(int a, String s = "i'm a string", dynamic b = 2, MyClass c = new MyClass())

  (1).可选参数必须从右往左出现在参数列表中(必须后出现),可选参数右边的参数(如果有的话)必须是可选参数。下面的声明是不能通过编译的:

  static void Foo(String s = "i'm a string", int a, dynamic b = null, MyClass c = null)

  (2).可选参数的赋值必须通过命名参数的方式指定,即必须使用可选参数的参数名称对其进行赋值。而非可选参数则不一定要用命名参数。如下的调用都是合法的:

  Foo calls
  Foo(
2);
  Foo(a:
2);
  Foo(
2, s: "hello", b: 3.14);
  Foo(
2, s: "hello", b: 3.14, c:new MyClass());
  Foo(
2, c: new MyClass());

  特别的,一旦调用方法时使用的是命名参数,则命名参数的位置可以是任意顺序,如下的调用是合法的:

  Foo(b:3.14, c:new MyClass(), a:2);

  唯一的影响就是上述调用中会对b先求值,然后再是c和a。函数总是按照参数出现的顺序进行求值操作的。

  另外,可选参数不仅适用于普通的方法,还适用于构造器,索引器中,本质上它们没有什么不同。

0
相关文章