C#中的参数和调用方式(可选参数、具名参数、可空参数)

具名参数 和 可选参数 是 C# framework 4.0 出来的新特性。html

 

一. 常规方法定义及调用函数

复制代码
public void Demo1(string x, int y)
{ 
      //do something...
}


public void Main()
{
      //调用
       Demo1("similar", 22);
}
复制代码

调用时,参数顺序(类型)必须与声明一致,且不可省略。post

 

 

二. 可选参数的声明及调用ui

可选参数分为两种状况: 1. 部分参数可选;   2. 所有参数都是可选this

复制代码
//部分可选(x为必选,y为可选)
public void Demo2(string x, int y = 5)
{
      //do something...
}


public void Main()
{
       //调用
       Demo2("similar");       // y不传入实参时,y使用默认值5
       Demo2("similar", 10);   // y传入实参,则使用实参10
}
复制代码

注: 当参数为部分可选时, 可选参数  的声明必须定义在 不可选参数(命名参数)的后面(如上: y 的声明在 x 以后),否则会出现以下错误提示:spa

  

复制代码
//所有可选(x,y 均为可选参数)
public void Demo3(string x = "demo", int y = 5)
{
       //do something...
}

public void Main()
{
       //调用
       Demo3();               // x,y不传入实参时,x,y使用默认值 "demo",5
       Demo3("similar");      // y不传入实参时,y使用默认值5
       Demo3("similar", 10);  // x,y都传入实参
}
复制代码

注: a.  当参数所有都为可选时,参数的声明顺序能够随意定义,不分前后。code

        b.  参数声明定义能够无顺序,但调用时必须与声明时的一致。htm

上面的调用只写的3种,其实还有一种,就是 x 使用默认值,y 传入实参,即 :  Demo3(10);blog

但这样调用会报错,由于Demo3的第一个参数是 string 类型,错误消息如图:ci

 

可是如今我只想传入y, 不想传入 x ,该怎么办呢,那么就要用到 C#的 具名参数。

 

 

三. 具名参数

具名参数的使用主要是体如今函数调用的时候。

复制代码
public void Main()
{
       //调用
       Demo3();                // x,y不传入实参时,x,y使用默认值 "demo",5
       Demo3("similar");       // y不传入实参时,y使用默认值5
       Demo3("similar", 10);   // x,y都传入实参


// 具名参数的使用 Demo3(y:10); }
复制代码

 

经过具名参数,咱们能够指定特定参数的值,这里咱们经过 Demo3(y:10)就能够解决咱们上面遇到的问题(x使用默认值,y使用实参)。

注: 当使用 具名参数时,调用方法能够不用管参数的声明顺序,即以下调用方式也是能够的:

 

 

在调用含有可选参数的方法时,vs中会有智能提示,提示哪些是能够选参数及其默认值,中括号表示可选[]:

 

 

出处:http://www.javashuo.com/article/p-urjhrxyf-gu.html

===================================================

可空参数是C#2中就引入的概念了,好比属性能够这样定义: 

public decimal? Price { get; set; }

而方法参考能够这样定义:

public void GetProduct(string name, decimal? price = null)

使用:

调用属性时,能够直接为Price赋值为null

调用方法时,只传name参数,而price则默认为null了。

下面看看个人一个综合应用吧!

 public DateTime? StartDate { get; set; }
 public DateTime? EndDate { get; set; }

public GetProduct(string cName = default(string), ......, ResultEnum? secResult = default(ResultEnum?), DateTime? startDate = default(DateTime?), DateTime? endTime = default(DateTime?))
{
            if (startDate == null)
            {
                throw new InvalidDataException("startDate is a required property for GetProduct and cannot be null");
            }
            else
            {
                this.StartDate = startDate;
            }
            
            // 其余代码逻辑
}

 

这里的属性使用的是可空参数,如:StartDate 和 EndDate

而构造函数这里只列出了部分代码,个人这个参数大概有20个左右,中间的参数省略掉了,自行脑补。而函数内部又有对startDate参数的必须提供,不然抛出异常,其余的验证逻辑我就不贴出来了

调用方式:

new GetProduct(startDate : DateTime.Now.AddMonths(-1), endTime : DateTime.Now)