c#可选参数和命名参数

1.可选参数

      方法、构造函数、索引器或委托的定义可以指定其形参为必需还是可选。 任何调用都必须为所有必需的形参提供实参,但可以为可选的形参省略实参。

也就是应用可选参数的方法在被调用的时可以选择性的添加需要的参数,而不需要的参数由参数默认值取代。

1.1示例(转自https://www.cnblogs.com/weiming/archive/2011/12/28/2304937.html):

namespace OptionalNamespace
{
    class OptionalExample
    {
        static void Main(string[] args)
        {
            //1.直接调用ShowComputer出错,其中brand参数必须赋值
            //Console.WriteLine(ShowComputer());
            //2.调用ShowComputer,给brand参数指定值,其他参数使用默认值
            Console.WriteLine(ShowComputer("联想"));
            /*3.调用ShowComputer,给cpu和内存ram赋值,实际结果变为给brand和cpu赋值
             * 方法是按顺序进行赋值
            */
            Console.WriteLine(ShowComputer("P5300", "1G"));
            Console.Read();
        }

        private static string ShowComputer(string brand,string cpu = "i3 370M", string ram = "4G", string disk = "320G")
        {
            return "My computer ... 
Brand:" + brand + "
Cpu:" + cpu + "
Ram:" + ram + "
Disk:" + disk + "
";
        }


    }
}

1.2运行结果

 1.3可选参数使用总结

(1)可选形参的默认值类型必须是以下表达式之一:

  • 常量表达式   
  • new ValType() 形式的表达式,其中 ValType 是值类型,例如 enum 或 struct;
  • default(ValType) 形式的表达式,其中 ValType 是值类型。

(2)可选参数定义于参数列表的末尾和必需参数之后。

(3)如果调用方为一系列可选形参中的任意一个形参提供了实参,则它必须为前面的所有可选形参提供实参。

比如要给参数ram提供实参值5G,则cpu也必须重新提供实参,如:

  /*4.调用ShowComputer,给ram赋值5g,则之前的参数cpu也必须给定实参值
  */
   Console.WriteLine(ShowComputer("联想","I7", "1G"));

2.命名参数

有了命名实参,你将不再需要记住或查找形参在所调用方法的形参列表中的顺序。 每个实参的形参都可按形参名称进行指定。 比如:

  /*5.调用ShowComputer,使用命名参数,按形参名称进行指定
   */
  Console.WriteLine(ShowComputer(brand:"联想", ram: "1G"));

如果不记得形参的顺序,但却知道其名称,则可以按任意顺序发送实参。

 /*6.调用ShowComputer,如果不记得形参的顺序,但却知道其名称,则可以按任意顺序发送实参。
 */
  Console.WriteLine(ShowComputer(cpu:"i9",brand: "联想",disk: "1TB ",ram: "1G"));

3.可选参数和命名参数结合使用

   /*7.调用ShowComputer,可选参数和命名参数结合使用*/
 Console.WriteLine(ShowComputer("联想",disk:"2TB" ));

程序只赋值了第四个参数disk和第一个必须指定的brand,其他参数均为默认值,当有多个可选参数时,命名参数的作用凸显,可以传递任何可选参数而不关心到底有几个可选参数和他们的顺序。

参考文章:

https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/named-and-optional-arguments#optional-arguments

https://www.cnblogs.com/weiming/archive/2011/12/28/2304937.html

https://blog.csdn.net/lizhenxiqnmlgb/article/details/82789134

  

转载文章链接已标明,如有侵权请告知。文章仅作为知识记忆所用,如有错误,敬请指正。
原文地址:https://www.cnblogs.com/YorkZhangYang/p/12988284.html