《CLR Via C# 第3版》笔记之(十) - 可选参数和可变数量参数

简介:

C#中也可以像动态语言那样,定义可选参数和可变数量参数。通过使用可选参数和可变数量参数可以构建更加灵活的函数。

主要内容:

  • 可选参数
  • 可变数量参数

1. 可选参数

可选参数即调用函数时,传递参数的个数和顺序和定义的不一致。

这样不用重载,也可以实现类似重载的多个版本的函数定义。

示例代码如下:

using System;

namespace cnblog_bowen
{
    public class CLRviaCSharp_10
    {
        static void Main(string[] args)
        {
            /* 输出结果
             * i=1, s=Z, dt=00010101 00:00:00, g=00000000-0000-0000-0000-000000000000
             */
            OptionalParams();

            /* 输出结果
             * i=1, s=ABC, dt=00010101 00:00:00, g=00000000-0000-0000-0000-000000000000
             */
            OptionalParams(1,"ABC");

            /* 输出结果 当参数顺序与函数定义的不一致时,需要指定参数,如下 dt:xxx
             * i=1, s=Z, dt=20110704 15:08:46, g=00000000-0000-0000-0000-000000000000
             */
            OptionalParams(1, dt:DateTime.Now);

            /* 输出结果 当参数顺序与函数定义的不一致时,需要指定参数,如下 g:xxx
             * i=1, s=V, dt=00010101 00:00:00, g=eb7d3f73-88e4-4d2d-a5ea-9c0322e3e3bf
             */
            OptionalParams(g:Guid.NewGuid(), s:"V");

            Console.ReadKey(true);
        }

        private static void OptionalParams(Int32 i=1, String s="Z", 
            DateTime dt = default(DateTime), Guid g = new Guid())
        {
            Console.WriteLine("i={0}, s={1}, dt={2}, g={3}", i, s, dt.ToString("yyyyMMdd HH:mm:ss"), g.ToString());
        }
    }
}

在使用可选参数加强了C#的动态性的同时,也需要关注可选参数的一些规则:

  1. 可以为方法,构造器,有参属性以及委托的参数指定默认值
  2. 有默认值的参数必须放在没有默认值的参数的后面
  3. 默认值必须是编译时能确认的常量(如上代码所示,可以使用defaultnew来定义默认值)
  4. refout进行标示的参数不能设置默认值

2. 可变数量参数

可变长参数其实与传递给函数一个数组是类似的。只不过用params标记后,调用函数时更加自然一些。

示例如下:

using System;

namespace cnblog_bowen
{
    public class CLRviaCSharp_10
    {
        static void Main(string[] args)
        {
            VarargsParams("price", 1, 2, 3, 4, 5);

            Console.ReadKey(true);
        }

        private static void VarargsParams(string s, params Int32[] arr)
        {
            Int32 sum = 0;
            foreach (var i in arr)
            {
                sum += i;
            }

            Console.WriteLine("sum type={0}, sum={1}", s, sum.ToString());
        }
    }
}

可变数量参数也有一些需要注意的规则:

  1. params关键字只能用于方法签名的最后一个参数
  2. 调用params关键字标记的方法和调用普通方法相比,有一些额外的性能损失。

对于以上的第2点,原因如下:

以上面的代码为例,调用函数VarargsParams("price", 1, 2, 3, 4, 5)时,虽然参数是Int32型的,

但还是需要创建一个Int32的数组,需要在堆上分配内存。

没有调用这样的函数快:private static void VarargsParams(string s, Int32 i1, Int32 i2, Int32 i3, Int32 i4, Int32 i5)

由于这个原因,System.String类的Concat方法定义以下几种重载:

public static string Concat(string str0, string str1);

public static string Concat(string str0, string str1, string str2);

public static string Concat(string str0, string str1, string str2, string str3);

public static string Concat(params string[] values);



本文转自wang_yb博客园博客,原文链接:http://www.cnblogs.com/wang_yb/archive/2011/07/04/2097483.html,如需转载请自行联系原作者

目录
相关文章
|
3月前
|
C# Python
C# 笔记1 - 操作目录
C# 笔记1 - 操作目录
29 0
|
3月前
|
存储 编解码 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用UserSet功能保存和载入相机的各类参数(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用UserSet功能保存和载入相机的各类参数(C#)
37 0
|
29天前
|
开发框架 小程序 .NET
C#动态生成带参数的小程序二维码
C#动态生成带参数的小程序二维码
|
3月前
|
C# Python
C# 笔记3 - 重载一系列像python那样的print()方法
C# 笔记3 - 重载一系列像python那样的print()方法
27 1
|
3月前
|
存储 C# C++
C# 笔记2 - 数组、集合与与文本文件处理
C# 笔记2 - 数组、集合与与文本文件处理
46 0
|
3月前
|
存储 C#
C# 方法详解:定义、调用、参数、默认值、返回值、命名参数、方法重载全解析
方法是一段代码,只有在调用时才会运行。 您可以将数据(称为参数)传递给方法。 方法用于执行某些操作,也被称为函数。 为什么使用方法?为了重用代码:定义一次代码,然后多次使用。
43 0
|
4月前
|
C# 数据安全/隐私保护
C# 窗体之间参数互相传递的两种方法与使用
C# 窗体之间参数互相传递的两种方法与使用
|
6月前
|
C#
命令调用C#程序, 路径参数解析错误
命令调用C#程序, 路径参数解析错误
|
8月前
|
存储 API C#
Baumer工业相机堡盟工业相机如何通过文件保存和导入的方式保存和载入相机的各类参数(C#)
Baumer工业相机堡盟工业相机如何通过文件保存和导入的方式保存和载入相机的各类参数(C#)
53 0
|
8月前
|
存储 编解码 开发工具
Baumer工业相机堡盟工业相机如何通过BGAPI SDK使用UserSet功能保存和载入相机的各类参数(C#)
Baumer工业相机堡盟工业相机如何通过BGAPI SDK使用UserSet功能保存和载入相机的各类参数(C#)
48 0