C#引數值傳遞與引用傳遞問題(我們需要時刻溫習基礎知識)
阿新 • • 發佈:2019-02-08
C#引數值傳遞與引用傳遞問題,太久沒有關注這些基礎的C#知識,導致很多東西都忘了,幸好有公司小培訓幫助補充了這些。
本次例子以傳遞類物件引數,對類物件的屬性值進行寫操作。(接著昨天寫序列化的程式碼來寫的)
class Program { public static void Main(string[] args) { TestRefObject1(); Console.Read(); } public static void TestRefObject1() { TestSerializationObject obj1 = new TestSerializationObject(); obj1.Attr3 = 0; AddAttr3_1(obj1); Console.WriteLine("1:"+obj1.Attr3); TestSerializationObject obj2 = new TestSerializationObject(); obj2.Attr3 = 0; AddAttr3_2(ref obj2); Console.WriteLine("2:" + obj2.Attr3); TestSerializationObject obj3 = new TestSerializationObject(); obj3.Attr3 = 0; AddAttr3_3(obj3); Console.WriteLine("3:" + obj3.Attr3); TestSerializationObject obj4 = new TestSerializationObject(); obj4.Attr3 = 0; AddAttr3_4(ref obj4); Console.WriteLine("4:" + obj4.Attr3); string str1 = "nihao,"; ChangeStr(str1); Console.WriteLine(str1); string str2 = "nihao,"; ChangeStr(ref str2); Console.WriteLine(str2); int a1 = 0; ChangeInt(a1); Console.WriteLine(a1); int a2 = 0; ChangeInt(ref a2); Console.WriteLine(a2); } public static void ChangeInt(int a) { a++; } public static void ChangeInt(ref int a) { a++; } public static void ChangeStr(string str) { str = str + "haha"; } public static void ChangeStr(ref string str) { str = str + "haha"; } public static void AddAttr3_1(TestSerializationObject obj) { obj.Attr3++; } public static void AddAttr3_2(ref TestSerializationObject obj) { obj.Attr3++; } public static void AddAttr3_3(TestSerializationObject obj) { obj=new TestSerializationObject(); obj.Attr3 = 5; obj.Attr3++; } public static void AddAttr3_4(ref TestSerializationObject obj) { obj = new TestSerializationObject(); obj.Attr3 = 5; obj.Attr3++; }
}
public class TestSerializationObject { public string Attr1 { get; set; } public string Attr2 { get; set; } public int Attr3 { get; set; } }
先想想上面的程式碼的答案是什麼?
想
想
想
想
想
想
想
想
恩,答案是
這裡說明:由於類物件屬於引用型別,在進行引數傳遞時,會傳入棧中物件的地址。
對於引用型別:
1、在修改變數本身時,結果類似於值傳遞,即不會改變傳遞前的變數的值(本例中的string)
2、在修改變數的屬性或欄位時,才是引用傳遞,會影響到傳遞前的變數的值(本例中的類)
3、引數使用了ref後,才是真正的引用傳遞,不管修改變數本身還是修改變數的屬性或欄位,都會影響到傳遞前的變數的值
而值傳遞,只是傳遞了物件的值拷貝。
注意將例子中的TestSerializationObject類改為Struct,會出現什麼情況呢?
注意struct型別為值型別。
結果顯示為:
這樣子就對上了!
附上C#方法、類等預設訪問修飾符,這個部落格介紹的比較全:
http://blog.csdn.net/andrew_wx/article/details/6843426