C# 方法(可选参数)

本章内容:

方法的结构

方法体内部的代码执行

局部变量

局部常量

控制流

方法调用

返回值

返回语句和void方法

局部函数

参数

值参数

引用参数

引用类型作为值参数和引用参数

输出参数

参数数组

参数类型总结

方法重载

命名参数

可选参数

栈帧

递归

可选参数

C#还允许使用可选参数〈optional parameter)。所谓可选参数就是可以在调用方法的时候包

含这个参数,也可以省略它。

为了表明某个参数是可选的,你需要在方法声明中为该参数提供默认值。指定默认值的语法

和初始化局部变量的语法一样,如下面代码的方法声明所示。在代码中,

  • 形参b的默认值设置成3;
  • 因此,如果在调用方法的时候只有一个参数,方法会使用3作为第二个参数的初始值。
csharp 复制代码
class MyClass
{
    public int Calc(int a,int b=3)
    {
        return a+b;
    }

    static void Main()
    {
        MyClass mc=new MyClass();

        int r0=mc.Calc(5,6);      //使用显式值

        int r1=mc.Calc(5);        //为b使用默认值

        Console.WriteLine($"{r0},{r1}");
    }
}

对于可选参数的声明,我们需要知道如下几个重要事项。

  • 不是所有的参数类型都可以作为可选参数。图6-14列出了何时可以使用可选参数。
    • 只要值类型的默认值在编译的时候可以确定,就可以使用值类型作为可选参数。
    • 只有在默认值是null的时候,引用类型才可以用作可选参数。
  • 所有必填参数(required paramenter)必须在可选参数声明之前声明。如果有params参数,
    必须在所有可选参数之后声明。图6-15演示了这种语法顺序。

在之前的示例中我们已经看到了,可以在方法调用的时候省略相应的实参,从而为可选参数

使用默认值。但是,不能随意省略可选参数的组合,因为在很多情况下这么做会导致使用哪些可

选参数变得不明确。规则如下。

  • 你必须从可选参数列表的最后开始省略,一直到列表开头。
  • 也就是说,你可以省略最后一个可选参数,或是最后"个可选参数,但是不能随意选择省略任意的可选参数,省略必须从最后开始。
csharp 复制代码
class MyClass
{
    public int Calc(int a=2,int b=3,int c=4)
    {
        return (a+b)*c;
    }

    static void Main()
    {
        MyClass mc=new MyClass();
        int r0=mc.Calc(5,6,7);      //使用所有的显式值
        int r1=mc.Calc(5,6);        //为C使用默认值
        int r2=mc.Calc(5);          //为b和c使用默认值
        int r3=mc.Calc();            //使用所有 的默认值
    }
}

如果需要随意省略可选参数列表中的可选参数,而不是从列表的最后开始,那么必须使用可

选参数的名字来消除赋值的歧义。在这种情况下,你需要结合利用命名参数和可选参数特性。下

面的代码演示了位置参数、可选参数和命名参数的这种用法。

csharp 复制代码
class MyClass
{
    double GetCylinderVolume(double radius=3.0,double height=4.0)
    {
        return 3.1416*radius*radius*height;
    }

    static void Main()
    {
        MyClass mc=new MyClass();
        double volume;

        volume=mc.GetCylinderVolume(3.0,4.0);
        Console.WriteLine("Volume="+volume);

        volume=mc.GetCylinderVolume(radius:2.0);
        Console.WriteLine("Volume="+volume);

        volume=mc.GetCylinderVolume();
        Console.WriteLine("Volume="+volume);
    }
}
相关推荐
成为大佬先秃头7 小时前
数据库连接池:Druid
数据库·mysql·druid
晓华-warm10 小时前
Warm-Flow 1.8.5 正式发布:超时自动审批、暂存功能来了!
数据库
u01368638211 小时前
将Python Web应用部署到服务器(Docker + Nginx)
jvm·数据库·python
light blue bird11 小时前
多页签Razor组支轴业务整顿组件
数据库·.net·ai大数据·多功能图表报表·web mvc + razor
wregjru11 小时前
【mysql】2.数据表操作
数据库·mysql
手握风云-11 小时前
基于 Java 的网页聊天室(三)
服务器·前端·数据库
LcVong11 小时前
MySQL 5.2/5.7 开启Binlog日志详细步骤(附验证+查看+恢复)
数据库·mysql·adb
FL4m3Y4n12 小时前
MySQL缓存策略
数据库·mysql·缓存
wsx_iot12 小时前
TDengine学习
数据库·学习·tdengine
不吃香菜的小趴菜12 小时前
mysql数据库打包与导入
数据库·mysql