参数传入函数的默认行为是按值传递,如果没有参数标记参数相关的修饰符,数据的副本就会被传入函数,到底复制什么取决于参数是值类型还是引用类型。
1.
static int Add(int x, int y)
{
int ans = x + y;
//数值数据(int)属于值类型,修改的是原始数据的副本
x = 11111;
y = 22222;
}
2.
out修饰符:输出参数,在函数退出之前必须对out参数进行赋值。
static int Add(int x, int y, out int ans)
{
ans = x + y;
}
调用:
...
int outAns ;
Add(1,2,out outAns);
3.
ref修饰符:
static void SwapStrings(ref string s1, ref string s2)
{
string tempStr = s1;
s1 = s2;
s2 = tempStr;
}
调用:
...
string str1 = "aaaa";
string str2 = "bbbb";
SwapStrings(ref str1, ref str2);
4.
params修饰符:params参数可以把可变数量的参数作为一个数组
static double Fun1(params double[] values)
{
double sum = 0;
for(int i=0;i<values.Length;i++)
{
sum += values[i];
}
return (sum / values.Length);
}
调用:
....
double avgs = Fun1(1.1,2.2,3.3);
5.
命名参数调用,可以任意顺序指定参数的值
static void Fun2(int x, string str)
{
}
调用:
...
Fun2(str : "aaaaaa", x: 2);
6.
按值传递引用类型
这里传递的是引用的值,所以是可以改变传递的对象的内部的数据的。但是无法把引用赋值给一个新的对象
class A
{
public int x;
public A(int a)
{
x = a;
}
}
static void TestFun(A a)
{
a.x = 100; //可以改变a.x的值
a = new A(200); // 这里对a的引用改变了,但是改变的传入的a的引用的副本
}
调用:
...
A clsA = new A(2);
TestFun(clsA); //这里a.x 的值为100,而不是200
7.
按引用传递引用类型
static void TestFun1(ref A a)
{
a.x = 300;
a = new A(400); //这里a指向了对上的一个新的对象
}