C# 方法中带默认值的参数
设计一个方法的参数时,可为部分或全部参数分配默认值。然后,调用这些方法的代码可以选择不指定部分实参,接受其默认值。除此之外,调用方法时,还可通过指定参数名称的方式为其传递实参。以下代码演示了可选参数和命名参数的用法:
using System;
using System.Collections.Generic;
using System.Text; namespace ParameterInMethod
{
class Program
{
private static int s_n = ;
private static void M(int x = , string s = "A", DateTime dt = default(DateTime), Guid guid = new Guid())
{
Console.WriteLine("x={0},s={1},dt={2},guid={3}",x,s,dt,guid);
} static void Main(string[] args)
{
// 1. 等同于M(9, "A", default(DateTime), new Guid());
M(); // 2. 等同于M(8, "X", default(DateTime), new Guid());
M(, "X"); // 3. 等同于M(5, "A", DateTime.Now, new Guid());
M(, guid: Guid.NewGuid(), dt: DateTime.Now); // 4. 等同于M(0, "1", default(DateTime), new Guid());
M(s_n++, s_n++.ToString()); // 5. 等同于以下两行代码:
// string t1 = "2"; int t2 = 3;
// M(t2, t1, default(DateTime), new Guid());
M(s: (s_n++).ToString(), x: s_n++); Console.ReadLine(); //程序输出结果如下:
/*
* x=9,s=A,dt=0001/1/1 0:00:00,guid=00000000-0000-0000-0000-000000000000
* x=8,s=X,dt=0001/1/1 0:00:00,guid=00000000-0000-0000-0000-000000000000
* x=5,s=A,dt=2012/5/31 10:34:28,guid=cdc348c3-6435-40ed-8e37-23d90f4f05ce
* x=0,s=1,dt=0001/1/1 0:00:00,guid=00000000-0000-0000-0000-000000000000
* x=3,s=2,dt=0001/1/1 0:00:00,guid=00000000-0000-0000-0000-000000000000
*/ }
}
}
如果调用时省略了一个实参,C#编译器会自动嵌入参数的默认值。
在对 M 的第4个调用中 s_n 中的当前值(0)传给x,然后 s_n 递增。随后, s_n 的当前值(1)作为一个字符串传给 s, 然后继续递增到 2. 使用已命名的参数传递实参时,编译器仍然按从左到右的顺序对实参进行求值。
在对 M 的第5个调用中, s_n 中的当前值(2)被转换成一个字符串,并保存到编译器创建的一个临时变量(t1)中。接着, s_n 递增到3,这个值保存到编译器创建另一个临时变量(t2)中。然后, s_n 继续递增到4. 最后调用M时,向它传递的实参一次是 t2,t1 一个默认DateTime 和 新建的guid。
规则和原则:
可以为方法、构构造器方法和有参属性(C#索引器)的参数指定默认值。还可为属于委托定义一部分的参数指定默认值。然后,在调用该委托类型的一个变量时,可以省略实参,以接受默认值。
有默认值的参数必须在没有默认值的所有参数之后。换言之,一旦定义了一个有默认值的参数,它右边的所有参数也必须有默认值。例如在面前的 M 方法定义中,如果删除 s 的默认值(“A”),就会出现编译错误。但这个规则有一个例外:“参数数组”这种参数必须放在所有参数(包括有默认值的这些)之后,而且数组本身不能有一个默认值。
默认值必须是编译时能确定的常量值。那么,能为哪些参数设置默认值呢?这些参数的类型可以是C#认定的基元类型。还可以包括枚举类型,以及能设为 null 的任何引用类型。对于任何值类型的一个参数,可将默认值设为值类型的一个实例,并让它的所有字段都包含零值。可以用 default 关键字或者 new 关键字来表达这个意思;两种语法将生成完全一致的IL代码。在 M 方法中设置 dt 参数和 guid 参数的默认值时,分别使用的就是这两种语法。
注意不要重命名参数变量。否则,任何调用者如果以传参数名的方式传递参数,都必须修改它们的代码。例如,在前面的 M 方法声明中,如果将dt变量重命名为 dateTime,对 M 的第三个调用就会造成编译错误:error CS1739:"M" 的最佳重载没有名为“dt”的参数。
如果参数用 ref 或 out 关键字进行了标识,就不能设置默认值。因为没有办法为这些参数传递一个有意义的默认值。
C#不允许省略逗号之间实参,比如M(1, , DateTime.Now).因为会造成可读性的影响,程序员将被迫去数这些逗号。
C# 方法中带默认值的参数的更多相关文章
- [ES6系列-03]ES6中关于参数相关特性详解(参数默认值与参数解构赋值与剩余参数)
[原创] 码路工人 大家好,这里是码路工人有力量,我是码路工人,你们是力量. 今天总结一下 ES6 中跟参数相关的内容. 欢迎补充斧正.留言交流. 让我们互相学习一起进步. 1. ES6 参数默认值( ...
- 13 继续C#中的方法,带返回值的方法介绍
在这一个练习中,我们要使用带返回值的方法.如果一个方法带返回值,那么它的形式是这样的. 定义一个带返回值的C#方法 static 返回类型 方法名字 (参数类型 参数1的名字,参数类型 参数2的名字) ...
- Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数
Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数 7.4.4 为外部参数设置默认值 开发者也可以对外部参数设置默认值.这时,调用的时候,也可以省略参数传递本文选自Swift1 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (14) -----第三章 查询之查询中设置默认值和存储过程返回多结果集
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-6在查询中设置默认值 问题 你有这样一个用例,当查询返回null值时,给相应属性 ...
- struts中的常量,action配置中的默认值
1.struts中Action的开发方式 继承ActionSupport类,这种方法实现的Action可以进行数据校验: 实现Action接口: 不继承任何类,不实现任何接口: 是否继承类或实现接口, ...
- asp.net EF model中的默认值设置
在做数据库规划时,通常会规划一些系统字段,也就是由数据库本身自行指定默认值到这个字段上,创建新的“创建时间(CreateDate)”字段就会常常这样设计. 如果希望能有默认值,且让.net 程序在新增 ...
- EF Core中,通过实体类向SQL Server数据库表中插入数据后,实体对象是如何得到数据库表中的默认值的
我们使用EF Core的实体类向SQL Server数据库表中插入数据后,如果数据库表中有自增列或默认值列,那么EF Core的实体对象也会返回插入到数据库表中的默认值. 下面我们通过例子来展示,EF ...
- yii2中textarea中的默认值设置
1. view中显示文本域的位置 <?= $form->field($goods_model, 'goods_introduce')->textArea(['class'=>' ...
- c++中带返回值函数没写return能通过编译但运行时会出现奇怪问题
c++中带返回值函数没写return能通过编译但运行时会出现奇怪问题 例如: string myFunc(){ theLogics(); } 发现调用: myFunc(); 崩溃. 但调用: cout ...
随机推荐
- 6.2 socket 流协议与粘包
TCP IP协议是流协议,对上层协议来讲是没有边界的,主机A发送两个消息M1和M2,如下图所示: 主机A发送了M1和M2,主机B在接收时有4种情况: 1.先收了M1,又收了M2 2.M1.M2一起收到 ...
- C++ 写的地图控件,支持google 百度 在线离线地图
C++处理google 百度地图在网上查阅了很多都是通过浏览器方式显示地图信息, 跟我目前项目很不符合, 所以仔细研究了一下C++方式显示地图.通过地图投影以及墨卡托投影,在通过平面地图计算经纬度. ...
- 虚拟机lamp环境下,Apache配置虚拟主机
1.在Apache配置文件中开启虚拟主机功能:即:Include etc//extra/httpd-vhosts.conf把前面的#去掉: 2.在extra目录下找到文件httpd-vhosts.co ...
- WinForm 实现点击一个按钮,执行另一个按钮事件
C# 代码如下: private void button1_Click(object sender, EventArgs e) { this.button1.Click += new System.E ...
- 堆优化的dij【模板】
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using ...
- Linux下软件包安装
编译dbus下载地址 :http://dbus.freedesktop.org/releases/dbus/tar zxvf dbus-1.10.0echo ac_cv_have_abstract_s ...
- Linux驱动中常用的宏
.module_i2c_driver(adxl34x_driver)展开为 static int __int adxl34x_driver_init(void) { return i2c_regist ...
- ZH奶酪:最简单的Django安装方法(Windows 7)
前提是你已经在机器上安装了python~并且你的机器能够上网~ 1.进入:https://bootstrap.pypa.io/get-pip.py,ctrl+s保存网页(其实是.py文件)到某一目录: ...
- ballerina 学习 三十二 编写安全的程序
ballerina编译器已经集成了部分安全检测,在编译时可以帮助我们生成错误提示,同时ballerina 标准库 已经对于常见漏洞高发的地方做了很好的处理,当我们编写了有安全隐患的代码,编译器就已 ...
- 用户态监控网络接口up、down事件
网上搜索(https://blog.csdn.net/qq123386926/article/details/50695725)可以直接使用netlink现成的接口实现: #include <s ...