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);
    }
}
相关推荐
蒲公英源码3 分钟前
超市进销存源码
sqlserver·c#·.net
csdn_aspnet30 分钟前
CentOS 7 上安装 MySQL 8.0
linux·mysql·centos
java1234_小锋41 分钟前
REDIS集群会有写操作丢失吗?为什么
数据库·redis·缓存
兰若姐姐43 分钟前
如何进行MSSQL提权?sp_oacreate、sp_oamethod和沙盒提权以及xp_regwrighte提权
数据库·sqlserver
一抓掉一大把43 分钟前
秒杀-订单创建消费者CreateOrderConsumer
网络·数据库
一只小bit3 小时前
MySQL事务:如何保证ACID?MVCC到底如何工作?
数据库·mysql·oracle
小猪咪piggy3 小时前
【项目】小型支付商城 MVC/DDD
java·jvm·数据库
向阳而生,一路生花3 小时前
redis离线安装
java·数据库·redis
·云扬·3 小时前
使用pt-archiver实现MySQL数据归档与清理的完整实践
数据库·mysql
黄焖鸡能干四碗3 小时前
信息安全管理制度(Word)
大数据·数据库·人工智能·智慧城市·规格说明书