前言
刚开始没注意到参数还有挺多内容,后来看了一些文章发现还是有必要拿出来记录下形参
、实参
,和值类型
传递、引用类型
传递。
形参和实参
类型 | 概念 |
---|---|
形参parameter
|
定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数 |
实参argument
|
在调用时传递给函数的参数,可以是常量、变量、表达式、函数等 |
一个例子就能看明白:
public static void Main(string[] args)
{
string myParams = "This is argument.";
Console.WriteLine(myParams);
}
private void ShowParams(string str)
{
Console.WriteLine("Parameter is + "str);
}
上面代码中myParams
就是实参,ShowParams
括号中的参数就是形参。
Params修饰符
先看例子:
public static void TestParams(params int[] list)
{
for (int i = 0; i < list.Length; i++)
{
Console.Write(list[i] + "");
}
Console.WriteLine("\nint array in the end!");
}
public static void TestParams2(params object[] list)
{
for (int i = 0; i < list.Length; i++)
{
Console.Write(list[i] + "");
}
Console.WriteLine("\nobject array in the end!");
}
我们定义两个方法TestParams
和TestParams2
参数分别为int[]
和object[]
。
接下来给方法传参,代码如下:
static void Main(string[] args)
{
TestParams(1, 2, 3, 4); //int数组
TestParams2(1, "a", "test"); //object数组
TestParams2(); //无参
int[] myIntArray = { 5, 6, 7, 8, 9 }; //定义实参数组
TestParams(myIntArray); //传递实参
TestParams2(myIntArray); //传递int实参数组给object数组
object[] myObjArray = { 2, 'b', "test", "again" }; //定义实参object数组
TestParams2(myObjArray); //传递实参object数组
}
结果如下:
1. 1234
2. int array in the end!
3. 1atest
4. object array in the end!
5.
6. object array in the end!
7. 56789
8. int array in the end!
9. System.Int32[]
10. object array in the end!
11. 2btestagain
12. object array in the end!
值得注意的是第9
行将int[]
传入object[]
入口输出的是System.Int32[]
对象,在使用的时候注意输出的对象。
引用类型传值
首先我们要注意到的是一般我们定义的都是值类型的形参,实质是实参和形参之间的值赋值。
而引用类型的形参,可以理解为将指针传递过去,所以形参发生改变会影响到实参。
这里还不太清楚值类型和引用类型的可以看看之前写的随笔:
理解.NET内存回收机制
听不懂没关系,看例子:
class User
{
public void Name(ref string tmps1, out string tmps2)
{
tmps1 = "传值后";
tmps2 = "在这里面赋值了";
}
}
定义一个名为Name的方法,形参分别定义为ref string tmps1
和out string tmps2
,接下来对方法传值,代码如下:
static void Main(string[] args)
{
string tmp1 = "传值前";
string tmp2;
User _user = new User();
_user.Name(ref tmp1, out tmp2);
Console.WriteLine("tmp1:{0}\ntmp2:{1}", tmp1, tmp2);
}
结果如下:
tmp1:传值后
tmp2:在这里面赋值了
结果很明显了,总结:
- 若要使用
out
和ref
参数,方法定义和调用方法均必须显式使用out
和ref
关键字 -
ref
参数要求在传递之前初始化变量 -
out
参数在传递的变量在方法调用中传递之前不必进行初始化,但是被调用的方法需要在返回之前赋一个值
把in
放在最后讲是因为它修饰的参数是不予许
被修改的,那不就是和不修饰一样吗?但其实要记住本质是引用地址的调用而不是值与值之间的赋值。
引文
END
- 如果文章内容能误导大家那真是再好不过了,嘻嘻嘻。
- 文章内容可能持续变更,修改或添加更多内容,以确保内容的准确性。
- 文章中大部分观点来自引文的总结,写文章的初衷是为了方便回忆。
- 更新时间:2018-10-12
网友评论