本文章仅为个人学习总结,如有错误请指正,必须看demo3。
分别介绍五个参数修饰符的名称、效果和使用、声明、调用等情况:
参数顺序:
out、ref、默认参数->可选参数->params
区分概念:
引用类型、值类型和值传递和引用传递是两个完全不同的概念。
全面说明参数的各种特征:
out:
名称:输出参数
效果:实现将值传递变为引用传递,并实现一个函数多个返回值
声明:在定义函数时必须显示的使用out来表明这个参数为输出参数。
调用:调用时,必须使用out来声明这个变量是作为输出参数使用。
作为参数的变量可以不进行初始化(其他所有的参数都需要初始化),也就是可以不赋值。
函数执行完前,如果有返回值,则是return 前必须进行赋值。
ref:
名称:引用参数
效果:实现将值传递变为引用传递,一般用于排序。
声明:在定义函数时必须显示的使用ref来表明这个参数为引用参数。
调用:调用时,必须使用ref来声明这个变量是作为引用参数使用。
调用前,必须进行初始化。
params:
名称:可变参数。
效果:实现参数个数不确定且没必要进行重载。
声明:定义在函数中最后一个参数,且只支持一个params,参数类型必须为数组。
调用:调用时,不需要params修饰符,且可以不进行传参。
可以,(逗号)传递多个或不传递参数,书写方便。
可选参数:
效果:实现非必须参数的传参麻烦性。
声明:必须在声明函数时,给可选参数赋默认值。
定义在函数中默认参数的最后
命名参数:
调用:命名参数只是在调用时,可以通过形(参名称:参数值)的方式,实现不按照顺序进行传参,一般与可选参数连用,调用时必须在位置参数(正常传参的参数,按照顺序)之后。
提示:
必须理解的是out、ref、params,可选参数、命名参数看到认识即可。
应该了解的知识:
1.形参和实参:
形参:定义函数时,所使用的形式参数,形参在未调用前默认不占用内存空间,调用的时候会占用内存空间,可以通过&进行查询形参地址。
实参:调用函数时,实际传递的参数。
2.值传递和引用传递
引用传递和值传递最大的区别在于可以值传递无法把引用传递给新的对象,而引用传递是可以的。
很难理解,看demo3。
demo1:
out的使用,两个函数说明out特征,细细感受这两个函数
private void button9_Click(object sender, EventArgs e)
{
//并未初始化
double resultAdd;
double resultSub;
Calculate(10,20,out resultAdd,out resultSub);
//无法编译,提示使用了未赋值的局部变量,也就是未初始化
double resutTestAdd;
double resultTestSub;
Test_Calculate(resutTestAdd, resultTestSub);
}
//out,计算两个数字的和与差
public void Calculate(double numA, double numB,out double addValue,out double subValue)
{
addValue = numA + numB;
subValue = numA - numB;
}
public void Test_Calculate(double numA, double numB)
{
numA = 10;
numB = 20;
}
demo2:
params的使用
private void button10_Click(object sender, EventArgs e)
{
Add();
Add(1, 2, 3, 4, 5);
Add(new double[] { 1, 2, 3, 4, 5 });
}
public double Add(params double[] calculateNums)
{
double resultValue = 0;
for (int i = 0; i < calculateNums.Length; i++)
{
resultValue += calculateNums[i];
}
return resultValue;
}
demo3:
如果没看懂,请看引用传递和值传递。
private void button1_Click(object sender, EventArgs e)
{
string str1 = "aBcD";
string str2 = "EfGh";
ProcessStrUpper(str1);
ProcessStrLower(ref str2);
//返回值aBcD
Console.WriteLine(str1);
//返回值efgh
Console.WriteLine(str2);
}
public void ProcessStrUpper(string str)
{
str=str.ToUpper();
}
public void ProcessStrLower(ref string str)
{
str=str.ToLower();
}