C# 函数参数传递(按值和引用)
C#中的数据类型:分值类型和引用类型两大类.
- 值类型: 直接存储数据的值,保存在内存中的stack(堆栈)中
- 引用类型: 存储对值的引用,实际上存储的就是一个内存的地址.引用类型的保存分成两块,实际值保存在托管堆(heap)中.实际值的内存地址保存在stack中
当使用引用类型时先找到stack中的地址,再找到heap中的实际值.也就是说保存引用类型时要用到stack和heap,但使用引用类型时我们实际上只用到stack中的值,然后通过这个值间接的访问heap中的值。C#预定义的简单类型,像int,float,bool,char都是值类型,另外enum(枚举),struct(结构)也是值类型 string,数组,自定义的class就都是引用类型了.其中的string是比较特殊的引用类型.C#给它增加个字符恒定的特性.
C#函数的参数如果不加ref,out这样的修饰符显式申明参数是通过引用传递外,默认都是值传递.
按值传递参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public class temp { static void Main() { int anum = 1; int[] aarray = { 1, 2, 3 }; ChangeInt(anum); ChangeArray(aarray); Console.WriteLine("value of num: " + anum); Console.Write("value of aarray: "); foreach (int i in aarray) Console.Write(i + " "); } static void ChangeInt(int num) { num = 123; } static void ChangeArray(int[] array) { array[0] = 10; } }
|
1 2 3 4 5
| [Running] echo= && csc /nologo /utf8output temp.cs && temp value of num: 1 value of aarray: 10 2 3 [Done] exited with code=0 in 1.978 seconds
|
按引用传递参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| namespace NewBlog { public class temp { static void Main() { int anum = 1; int[] array = { 1, 2, 3 };
ChangeInt(ref anum); ChangeArray(ref array); Console.WriteLine("value of num: " + anum); Console.Write("value of aarray: "); foreach (int i in array) Console.Write(i + " "); }
static void ChangeInt(int num) { num = 123; }
static void ChangeInt(ref int num) { num = 123; }
static void ChangeArray(int[] array) { array[0] = 10; }
static void ChangeArray(ref int[] array) { array[0] = 10; array = new int[]{6,7,8}; } } }
|