您的位置:首页 > 编程语言 > C#

C# 参数传递行为

2016-03-03 22:19 399 查看
参数传入函数的默认行为是按值传递,如果没有参数标记参数相关的修饰符,数据的副本就会被传入函数,到底复制什么取决于参数是值类型还是引用类型。

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指向了对上的一个新的对象

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: