C#中的参数和调用方式(可选参数、具名参数、可空参数、不定长参数)
具名参数 和 可选参数 是 C# framework 4.0 出来的新特性。
一. 常规方法定义及调用
public void Demo1(string x, int y) { //do something... } public void Main() { //调用 Demo1("similar", 22); }
调用时,参数顺序(类型)必须与声明一致,且不可省略。
二. 可选参数的声明及调用
可选参数分为两种情况: 1. 部分参数可选; 2. 全部参数都是可选
//部分可选(x为必选,y为可选) public void Demo2(string x, int y = 5) { //do something... }
public void Main() { //调用 Demo2("similar"); // y不传入实参时,y使用默认值5 Demo2("similar", 10); // y传入实参,则使用实参10 }
注: 当参数为部分可选时, 可选参数 的声明必须定义在 不可选参数(命名参数)的后面(如上: y 的声明在 x 之后),不然会出现如下错误提示:
//全部可选(x,y 均为可选参数) public void Demo3(string x = "demo", int y = 5) { //do something... } public void Main() { //调用 Demo3(); // x,y不传入实参时,x,y使用默认值 "demo",5 Demo3("similar"); // y不传入实参时,y使用默认值5 Demo3("similar", 10); // x,y都传入实参 }
注: a. 当参数全部都为可选时,参数的声明顺序可以随意定义,不分先后。
b. 参数声明定义可以无顺序,但调用时必须与声明时的一致。
上面的调用只写的3种,其实还有一种,就是 x 使用默认值,y 传入实参,即 : Demo3(10);
但这样调用会报错,因为Demo3的第一个参数是 string 类型,错误消息如图:
但是现在我只想传入y, 不想传入 x ,该怎么办呢,那么就要用到 C#的 具名参数。
三. 具名参数
具名参数的使用主要是体现在函数调用的时候。
public void Main() { //调用 Demo3(); // x,y不传入实参时,x,y使用默认值 "demo",5 Demo3("similar"); // y不传入实参时,y使用默认值5 Demo3("similar", 10); // x,y都传入实参
// 具名参数的使用 Demo3(y:10); }
通过具名参数,我们可以指定特定参数的值,这里我们通过 Demo3(y:10)就可以解决我们上面遇到的问题(x使用默认值,y使用实参)。
注: 当使用 具名参数时,调用方法可以不用管参数的声明顺序,即如下调用方式也是可以的:
在调用含有可选参数的方法时,vs中会有智能提示,提示哪些是可以选参数及其默认值,中括号表示可选[]:
出处:https://www.cnblogs.com/similar/p/5006705.html
=======================================================================================
可空参数
可空参数是C#2中就引入的概念了,比如属性可以这样定义:
public decimal? Price { get; set; }
而方法参考可以这样定义:
public void GetProduct(string name, decimal? price = null)
使用:
调用属性时,可以直接为Price赋值为null
调用方法时,只传name参数,而price则默认为null了。
下面看看我的一个综合应用吧!
public DateTime? StartDate { get; set; } public DateTime? EndDate { get; set; } public GetProduct(string cName = default(string), ......, ResultEnum? secResult = default(ResultEnum?), DateTime? startDate = default(DateTime?), DateTime? endTime = default(DateTime?)) { if (startDate == null) { throw new InvalidDataException("startDate is a required property for GetProduct and cannot be null"); } else { this.StartDate = startDate; } // 其他代码逻辑 }
这里的属性使用的是可空参数,如:StartDate 和 EndDate
而构造函数这里只列出了部分代码,我的这个参数大概有20个左右,中间的参数省略掉了,自行脑补。而函数内部又有对startDate参数的必须提供,否则抛出异常,其他的验证逻辑我就不贴出来了
调用方式:new GetProduct(startDate : DateTime.Now.AddMonths(-1), endTime : DateTime.Now)
=======================================================================================
c#中不定长参数
Params:使用 params 关键字可以指定在参数数目可变处采用参数的方法参数。
注意点:
1、一个方法中只能使用一个params来声明不定长参数数组;
2、params参数数组只能放在已定义参数后面
3、在方法声明中的 params 关键字之后不允许任何其他参数
示例代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ParamsUse { class Program { static void Main(string[] args) { Console.WriteLine(Sum(2, 4, 6, 8, 10)); ListParams("江西省", "宜春市", "高安市"); Console.ReadKey(); } public static int Sum(params int[] intparams) { int sum = 0; for (int i = 0; i < intparams.Length; i++) { sum += intparams[i]; } return sum; } static void ListParams(params string[] strs) { foreach (var item in strs) { Console.WriteLine(item); } } } }
出处:https://blog.51cto.com/1433189426/1574523
=======================================================================================
C#不定长参数的使用
在使用不定长参数params时,如果除了params参数还有其他参数,params参数要作为最后一个参数.否则程序无法识别.
public void test(int sd, params int[] arr)//不定长参数前要加params
{
Console.WriteLine("第一个参数是:{0};第二个参数是:{1};第三个参数是:{2};", sd, arr[0], arr[1]);
}
static void Main(string[] args)
{
Program ps = new Program();
ps.test(22, 5, 6, 7, 8, 9, 10);
Console.Read();
}
出处:https://www.cnblogs.com/fumj/archive/2012/03/22/2412441.html
=======================================================================================
C# 不定长参数
C# 提供一种语法,允许你设计的一个函数可以支持传入不定长的参数。例如一个用于整数计算的Add方法,可以将传入的参数累加起来,如
Add(1, 2)返回3
Add(1, 2, 3)放回6
代码是这样的,使用params int[] i作为参数就可以接受任意个int参数了,其中params是关键字
class Program
{
public static int Add(params int[] i)
{
return i.Sum(i => i);
}
public static void Main(string[] args)
{
Console.WriteLine(Add(1, 2));
Console.WriteLine(Add(1, 2, 3));
//也可以直接传数组
Console.WriteLine(Add(new int[] { 1, 2, 3, 4}));
}
}
出处:https://blog.csdn.net/m0_47659279/article/details/121245031
关注我】。(●'◡'●)
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的【因为,我的写作热情也离不开您的肯定与支持,感谢您的阅读,我是【Jack_孟】!
本文来自博客园,作者:jack_Meng,转载请注明原文链接:https://www.cnblogs.com/mq0036/p/10613787.html
【免责声明】本文来自源于网络,如涉及版权或侵权问题,请及时联系我们,我们将第一时间删除或更改!
posted on 2019-03-28 11:25 jack_Meng 阅读(24840) 评论(0) 编辑 收藏 举报