关于C# 4.0新特性“缺省参数”的实现详解

2020-06-17 08:59:30王旭

前言

C#4.0关于缺省参数的新特性,相信大家都不会陌生。所谓缺省参数,顾名思义,就是在声明方法的某个参数的时候为之指定一个默认值,在调用该方法的时候如果采用该默认值,你就无须指定该参数。和很多语言层面特性(语法糖)的实现一样,缺省参数也是编译器为我们玩的一个小花招。缺省参数最终体现为两个特殊的自定义特性OptionalAttribute和DefaultParameterValueAttribute 。

目录

一、缺省参数的用法 二、实现缺省参数的两个特性:OptionalAttribute和DefaultParameterValueAttribute 三、直接通过OptionalAttribute和DefaultParameterValueAttribute 定义缺省参数

一、缺省参数的用法

比如下面一个TestMethod方法,后面两个参数bar和baz就是缺省参数,默认值分别为“Bar”和“Baz”。

  1: static void TestMethod(string foo, string bar = "Bar", string baz = "Baz")
  2: {
  3:   Console.WriteLine("{0, -5} - {1, -5} - {2, -5}", foo, bar, baz);
  4: } 

在调用TestMethod的时候,我们自由地选择采用缺省的参数值,或者覆盖该缺省值。

  1: static void Main(string[] args)
  2: {
  3:   TestMethod("Foo");
  4:   TestMethod("Foo", "Bar1");
  5:   TestMethod("Foo", "Bar1", "Baz1");
  6: }

下面是输出结果:

   1: Foo   - Bar   - Baz
   2: Foo   - Bar1  - Baz
   3: Foo   - Bar1  - Baz1

缺省参数的使用有两个简单的限制,其一是:缺省参数的声明只能放在普通参数之后。如下代码中定义的TestMethod方法中,缺省参数bar后面跟一个非缺省参数baz,这样的代码是不能通过编译的(编译错误信息为:Optional parameters must appear after all required parameters)。

  1: static void TestMethod(string foo, string bar = "Bar", string baz)
  2: {
  3:   Console.WriteLine("{0, -5} - {1, -5} - {2, -5}", foo, bar, baz);
  4: }  

但是,缺省参数后面可以跟数组参数(params参数),实际上无论在什么情况下,params参数都只能是最后一个声明的参数。关于缺省参数的声明的位置限制,主要重载方法的识别机制决定的,这一点大家都很容易理解。

缺省参数的另一个限制是:指定的缺省值必须是一个常量,这就实际上为作为缺省参数的数据类型作了限制——只能是系统定义的基元类型。下面定义的TestMethod方法中,我们定义了一个DateTime类型的缺省参数,并将参数缺省值作为DateTime.Now。由于DateTime.Now不是常量,所以这样的代码也不能通过编译(编译错误消息:Default parameter value for 'date' must be a compile-time constant)。

  1: static void TestMethod(DateTime date = DateTime.Now)
  2: {
  3:  //Others...
  4: }