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);
    }
}
相关推荐
惊起白鸽4501 小时前
MySQL全量,增量备份与恢复
数据库·mysql
暮雨疏桐2 小时前
MySQL SQL Mode及其说明
数据库·sql·mysql·sql mode
Tangcan-2 小时前
【MySQL】数据库基础
数据库·mysql
蔡蓝3 小时前
Mysql的索引,慢查询和数据库表的设计以及乐观锁和悲观锁
数据库·mysql
jstart千语3 小时前
【Redis】分布式锁的实现
数据库·redis·分布式
一把年纪学编程4 小时前
【牛马技巧】word统计每一段的字数接近“字数统计”
前端·数据库·word
极小狐4 小时前
极狐GitLab 通用软件包存储库功能介绍
java·数据库·c#·gitlab·maven
陆少枫4 小时前
MySQL基础关键_013_常用 DBA 命令
数据库·mysql
赵渝强老师5 小时前
【赵渝强老师】在PostgreSQL中使用file_fdw访问外部文件系统
数据库·postgresql