zoukankan      html  css  js  c++  java
  • C#中的参数和调用方式(可选参数、具名参数、可空参数)

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

    一. 常规方法定义及调用

     
    public void Demo1(string x, int y)
    { 
          //do something...
    }
    
    
    public void Main()
    {
          //调用
           Demo1("similar", 22);
    }
     

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

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

    可选参数分为两种情况: 1. 部分参数可选;   2. 全部参数都是可选

     
    //部分可选(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 之后),不然会出现如下错误提示:

      

     
    //全部可选(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.  当参数全部都为可选时,参数的声明顺序可以随意定义,不分先后。

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

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

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

    但是现在我只想传入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中会有智能提示,提示哪些是可以选参数及其默认值,中括号表示可选[]:

    出处:https://www.cnblogs.com/similar/p/5006705.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)

  • 相关阅读:
    关于苹果IPhone/Ipad(IOS)开发者证书申请及安装、真机调试、发布的参考文章
    vs 关闭警告
    真机测试及布署Code Sign error问题总结
    在 Win32 Application 和 Win32 Console Application 中使用 MFC
    获取应用程序路径的区别
    js日期控件
    SQL SERVER 企业管理器 MMC 无法创建管理单元
    进程查看两利器
    用PowerDesigner逆向数据库工程时”Unable to list the table"错误的解决方法
    SQL 附加无日志数据库
  • 原文地址:https://www.cnblogs.com/zaixiachengxuyuan/p/14465571.html
Copyright © 2011-2022 走看看