001 using System;
002
003 public class ArgsByRefOrValue
004 {
005 public static void Main(string[] args)
006 {
007 // 实验1. 传值调用--基元类型
008 int i = 10;
009 Console.WriteLine("before call ChangeByInt: i = " + i.ToString());
010 ChangeByInt(i);
011 Console.WriteLine("after call ChangeByInt: i = " + i.ToString());
012
013 Console.WriteLine("==============================================");
014 // 实验2. 传值调用--结构体
015 Person_val p_val = new Person_val();
016 p_val.name = "old val name";
017 Console.WriteLine("before call ChangeByStruct: p_val.name = " + p_val.name);
018 ChangeByStruct(p_val);
019 Console.WriteLine("after call ChangeByStruct: p_val.name = " + p_val.name);
020
021 Console.WriteLine("==============================================");
022 // 实验3. 传引用调用--类
023 Person_ref p_ref = new Person_ref();
024 p_ref.name = "old ref name";
025 Console.WriteLine("before call ChangeByClass: p_ref.name = " + p_ref.name);
026 ChangeByClass(p_ref);
027 Console.WriteLine("after call ChangeByClass: p_ref.name = " + p_ref.name);
028
029 Console.WriteLine("==============================================");
030 // 实验4. 传引用调用--利用ref
031 Person_ref p = new Person_ref();
032 p.name = "old ref name";
033 Console.WriteLine("before call ChangeByClassRef: p.name = " + p.name);
034 ChangeByClassRef(ref p);
035 Console.WriteLine("after call ChangeByClassRef: p.name = " + p.name);
036
037 Console.WriteLine("==============================================");
038 // 实验5. 传引用调用--类 在调用的函数重新new一个对象
039 Person_ref p_ref_new = new Person_ref();
040 p_ref_new.name = "old new ref name";
041 Console.WriteLine("before call ChangeByClassNew: p_ref_new.name = " + p_ref_new.name);
042 ChangeByClassNew(p_ref_new);
043 Console.WriteLine("after call ChangeByClassNew: p_ref_new.name = " + p_ref_new.name);
044
045 Console.WriteLine("==============================================");
046 // 实验6. 传引用调用--利用ref 在调用的函数重新new一个对象
047 Person_ref p_new = new Person_ref();
048 p_new.name = "old new ref name";
049 Console.WriteLine("before call ChangeByClassRefNew: p_new.name = " + p_new.name);
050 ChangeByClassRefNew(ref p_new);
051 Console.WriteLine("after call ChangeByClassRefNew: p_new.name = " + p_new.name);
052
053 Console.ReadKey(true);
054 }
055
056 static void ChangeByInt(int i)
057 {
058 i = i + 10;
059 Console.WriteLine("when calling ChangeByInt: i = " + i.ToString());
060 }
061
062 static void ChangeByStruct(Person_val p_val)
063 {
064 p_val.name = "new val name";
065 Console.WriteLine("when calling ChangeByStruct: p_val.name = " + p_val.name);
066 }
067
068 static void ChangeByClass(Person_ref p_ref)
069 {
070 p_ref.name = "new ref name";
071 Console.WriteLine("when calling ChangeByClass: p_ref.name = " + p_ref.name);
072 }
073
074 static void ChangeByClassRef(ref Person_ref p)
075 {
076 p.name = "new ref name";
077 Console.WriteLine("when calling ChangeByClassRef: p.name = " + p.name);
078 }
079
080 static void ChangeByClassNew(Person_ref p_ref_new)
081 {
082 p_ref_new = new Person_ref();
083 p_ref_new.name = "new ref name";
084 Console.WriteLine("when calling ChangeByClassNew: p_ref_new.name = " + p_ref_new.name);
085 }
086
087 static void ChangeByClassRefNew(ref Person_ref p_new)
088 {
089 p_new = new Person_ref();
090 p_new.name = "new ref name";
091 Console.WriteLine("when calling ChangeByClassRefNew: p_new.name = " + p_new.name);
092 }
093 }
094
095 public struct Person_val
096 {
097 public string name;
098 }
099
100 public class Person_ref
101 {
102 public string name;
103 }
则运行结果为: