C#之可选参数和命名参数


设计方法的参数是,可以将部分参数和全部参数分配默认值,然后调用这些方法的时候可以选择不提供部分实参,使用参数定义的默认值,另外,还可以在调用方法的时候通过指定参数名称来传递实参。

例如:

public static class Program{
     private static int32 s=0;
     private static void Mothed(int32 x=9,string s="A",Datetime dt=default(Datetime),Guid guid=new Guid()){
      Console.WriteLine("x={0},s={1},dt={2},guid={3}",x,s,dt,guid);
      }    
      public static void Main(){
       Mothed();//等同于Mothed(9,"A",default(Datetime),new Guid())
       Mothed(8,"X");//等同于Mothed(8,"X",default(Datetime),new Guid())
       Mothed(5,guid:Guid.NewGuid(),dt:DateTime.Now);//等同于Mothed(5,"A",DateTime.Now,Guid.NewGuid())
       Mothed(s_n++,s_n++.ToString());//等同于Mothed(0,"1",default(Datetime),new Guid());
       Mothed(s:(s_n++).ToString(),x:s_n++);//等同于一下两行代码:string t1="2";int32 t2=3;   Mothed(t2,t1,default(Datetime),new Guid())
     }  
}

向方法传递实参时,编译器从左到右的顺序对实参进行求值。在对Mothed的第四个调用中s_n的当前默认值是0,先递增然后等于1传递给s,然后继续递增到2(s_n++先使用后递增)。

定义实参的规则和原则:

一、可为方法、构造器方法和有参属性(C#索引器)的参数指定默认值。还可以为属于委托定义一部分的参数指定默认值。以后调用该委托类型的变量时可省略实参来使用默认值。

二、有默认值的参数必须放在没有默认值的所有参数之后(重中之重)。但也有例外:参数数组这种参数必须放在所有参数(包括默认值得这些)之后,而且数组本身不能有一个默认值。

三、默认值必须是编译时能确定的常量值。(即C#认定的基元类型--不懂基元类型下次解释)值类型的参数可以将默认值设为值类型的实例,并让他的所有字段都包含零,可以使用default关键字或者new关键字来表达这个意思。

四、不要重命名参数变量,否则任何调用者以以传参数名的方式传递实参,他们的代码必须修改。

五、如果方法在模块外部调用,更改参数的默认值具有潜在的危险性。

六、如果参数使用ref或者out关键字进行标识,就不能设置默认值。因为没有办法为这些参数传递有意义的参数值,类似指针。

注意:如果参数要求ref/out,为了能传参数名的方式传递实参,可以按照下面语法进行:

//方法声明
private static void M(ref Int32 x){...}
//方法调用
Int32 a=5;
M(x:ref a);

同时:

实参可按照任意顺序传递,但命名实参必须且只能出现在实参列表尾部,如上述代码第三种调用方式。

可以按照名称将实参传递给没有默认值的参数。但所有必须的实参都必须传递(无论按照位置还是按照名称),编译器才能编译代码

C#不允许省略逗号之间的实参,比如M(1,,DateTime.New).因为这样会造成可读性的影响,程序员将被迫去读 逗号,对于没有默认值的参数,如果想省略它们的实参,以传参数名的方式传递实参即可。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM