c#语言中有几种参数类型,这边做个简单的总结,供大家参考和学习。
1、具名参数
具名参数顾名思义就是出具参数的名字,在调用有参数的方法时,我们需要根据参数的顺序和类型给参数赋值,否则程序就会报错的。而具名参数就可以打破这种约束,使用起来也是非常的简单:
public int Reduce(int fir , int sec){
return fir - sec;
}
public void Demo()
{
//普通调用
Reduce(15, 12);
//具名调用
Reduce(sec:12,fir:15); // 13
}
具名参数有这么几点好处:首先他可以在一定程度上增加程序的可读性,前提是参数的名称不要乱写,一定要有意义;还有一点就是可以不受参数位置的约束。
2、可选参数
可选参数在实际的开发中很有用武之地的,也是非常的简单易用,说白了就是给参数设置默认值。同样,我们通过一个简单的例子来看一下:
public string UserInfor(string name = "mac", string age = "27", string tel = "18888888888")
{
return "我的名字是" + name + ",我今年" + age + "岁,我联系方式:" + tel;
}
public void Demo()
{
string ss = UserInfor(); //我的名字是mac,我今年27岁,我联系方式:18888888888
string ss1 = UserInfor(name: "maaici"); //我的名字是maaici,我今年27岁,我联系方式:18888888888
string ss2 = UserInfor(age: "18"); //我的名字是mac,我今年18岁,我联系方式:18888888888
string ss3 = UserInfor(tel: "18852999999"); //我的名字是mac,我今年27岁,我联系方式:18852999999
}
我在平时的开发中常会有这样一个场景:想修改或者拓展一个现有的方法,但是有很多地方调用,有了可选参数我们就可以对方法进行拓展,而不用改变原先的调用代码,也不用重新写一个类似的方法,产生冗余代码。
另外,可选参数必须在所有必需参数的后面!
3、this 参数
this 参数最主要的用途就是为目标类型拓展方法。关于拓展方法我的另外一个文章中有过详细的介绍,附带简单的例子供参考用。请戳:拓展方法的定义及调用和微软拼音组件的使用
4、值参数和引用参数
这两个类型的参数放在一起来介绍。首先我们要把值参数、引用参数和C#的值类型和引用类型区分开来,这并不是同一个东西,对于值类型个引用类型,我推荐一篇文章,感兴趣的同学可以去学习一下:https://www.cnblogs.com/bakuhert/articles/5878086.html。
引用参数和值参数的区别在于是否有ref关键字来修饰,不加ref的参数统称为值参数。值参数就是常说的传值参数,当我们把一个变量的值作为方法的参数传递给方法,其实是在方法中创建了一个副本,在方法中对这个副本的各种修改都不会影响方法外面的那个本尊(有例外,下面会强调)。但是我们有时候就是需要在方法里面的修改,同步到本尊,就需要引用变量出马了。下面用代码来简答的说明一下
static void Main(string[] args)
{
int number = 1314;
Console.WriteLine("我现在是:" + number);
Add100(number);
Console.WriteLine("我现在是:" + number);
Add1000(ref number);//这边也必须要加上 ref 关键字
Console.WriteLine("我现在是:" + number);
Console.ReadLine();
}
public static void Add100(int num)//传值参数
{
num += 100;
}
public static void Add1000(ref int num)//引用参数
{
num += 1000;
}
结果:
刚刚上面说了传值参数会有例外的情况,那么就是在给值参数传递引用参数的时候,请看代码:
class Program
{
static void Main(string[] args)
{
Person maaici = new Person { NAME = "maaici", AGE = 26 };
Console.WriteLine("我的名字是:" + maaici.NAME + ",今年" + maaici.AGE + "岁。");
ChangeYourName(maaici);
Console.WriteLine("我的名字是:" + maaici.NAME + ",今年" + maaici.AGE + "岁。");
Console.ReadLine();
}
public static void ChangeYourName(Person person) {
person.NAME = "曾阿牛";
}
}
public class Person {
public string NAME { get; set; }
public int AGE { get; set; }
}
大家猜一下,我到底是谁?
6、输出参数
输出参数是用out关键字修饰的参数。我们都知道一个方法至多就只能有一个返回值,有时候我们会需要有多个返回值,这时我们就可以使用输出参数。我个人的觉得输出参数和引用参数很像,都可以改变传进方法的变量本身,有时候我们甚至可以换着用。但是有一个区别,引用参数必须是赋值过的参数,否则会报错,但是输出参数却可以使用没有赋值的变量,并且输出参数原来的值将变得没有意义,因为在有输出参数的方法中,必须要对变量进行赋值。
7、参数数组
参数数组有的也叫可变参数,用params 关键字来修饰。主要用途是我们不知道参数的类型有多少个的情况下,避免重复多次的重载下使用的,有一个经典的例子,一起看一下:
private static void Main(string[] args)
{
//可以一个一个输
Console.WriteLine("最大的数字是:" + GetMaxNumber(2,3,34,54,232,32,232,32,45,65665,757));
//也可以直接传一个数组
int[] numbers = new int[] { 2, 3, 34, 54, 232, 32, 232, 32, 45, 65665, 757 };
Console.WriteLine("最大的数字是:" + GetMaxNumber(numbers));
Console.ReadKey();
}
public static int GetMaxNumber(params int[] nums) {
int maxNum = -99999;
if (nums.Length > 0) {
foreach (int item in nums) {
if (maxNum < item)
maxNum = item;
}
}
return maxNum;
}
在使用可变参数的有以下几个注意点:
1、若形参表中含一个参数数组,则该参数数组必须位于形参列表的最后。
2、不允许将params修饰符与ref和out修饰符组合起来使用。
3、参数数组必须是一维数组。
4、与参数数组对应的实参可以是同一类型的数组名,也可以是任意多个与该数组的元素属于同一类型的变量。
5、若实参是数组则按引用传递,若实参是变量或表达式则按值传递。
6、有参数数组的方法的优先级要小于没有参数数组的重载。例如:
private static void Main(string[] args)
{
//以下调用两个重载都没问题,但是他优先调用没有参数数组的重载。
string retMsg = DoSomeThing("我没用", "我没用");
Console.WriteLine(retMsg); //结果是 : 我没有参数数组
Console.ReadKey();
}
public static string DoSomeThing(string str1,string str2) {
return "我没有参数数组。";
}
public static string DoSomeThing(params string[] strs)
{
return "我有参数数组。";
}
以上是对C#参数的整理,如果有错误,请帮忙指出。
下一讲:C#第五讲:类和成员的访问修饰符