最近在寫項目中有同事碰到這樣的傳值問題,可能很多對這個參數的傳遞還有點疑惑,自己也是對這個基礎知識做一個回顧和鞏固。
首先什么是值類型和引用類型可以去園里看一下相關的資料,都有介紹。
常用值類型包括:int ,long ,bool,decimal,char,float 等
常用的引用類型包括:string,arry,delegate, interface,class 等
一。傳遞值類型參數
向方法傳遞值類型變量意味着向方法傳遞變量的一個副本。方法內發生的對參數的更改對該變量中存儲的原始數據無任何影響。如果希望所調用的方法更改參數的值,必須使用 ref 或 out 關鍵字通過引用傳遞該參數。
static void SquareInt(int x) { x *= x; System.Console.WriteLine("步驟二: {0}", x); } static void Main() { int n = 5; System.Console.WriteLine("步驟一: {0}", n); SquareInt(n); System.Console.WriteLine("步驟三: {0}", n); }
以上通過值傳遞值類型,輸出:步驟一:5 步驟二:25 步驟三:5
static void SquareInt(ref int x) { x *= x; System.Console.WriteLine("步驟二: {0}", x); } static void Main() { int n = 5; System.Console.WriteLine("步驟一: {0}", n); SquareInt(ref n); System.Console.WriteLine("步驟三: {0}", n); }
以上通過引用傳遞值類型,輸出:步驟一:5 步驟二:25 步驟三:25
二。傳遞引用類型參數
引用類型的變量不直接包含其數據;它包含的是對其數據的引用。當通過值傳遞引用類型的參數時,有可能更改引用所指向的數據,如某類成員的值。但是無法更改引用本身的值;也就是說,不能使用相同的引用為新類分配內存並使之在塊外保持。若要這樣做,應使用 ref 或 out 關鍵字傳遞參數。
public class People { public string name { get; set; } public int age { get; set; } } static void Main() { People model = new People(); model.name = "張三"; model.age = 18; System.Console.WriteLine("姓名:{0},年齡:{1}", model.name, model.age); Change(model); System.Console.WriteLine("姓名:{0},年齡:{1}", model.name, model.age); } private void Change(People model) { model.name = "李四"; model = new People() { name = "王五", age = 20 }; System.Console.WriteLine("姓名:{0},年齡:{1}", model.name, model.age); }
以上通過值傳遞引用類型,輸出:姓名:張三,年齡:18 姓名:王五,年齡:20 姓名:李四,年齡:18
public class People { public string name { get; set; } public int age { get; set; } } static void Main() { People model = new People(); model.name = "張三"; model.age = 18; System.Console.WriteLine("姓名:{0},年齡:{1}", model.name, model.age); Change(ref model); System.Console.WriteLine("姓名:{0},年齡:{1}", model.name, model.age); } private void Change(ref People model) { model.name = "李四"; model = new People() { name = "王五", age = 20 }; System.Console.WriteLine("姓名:{0},年齡:{1}", model.name, model.age); }
以上通過引用傳遞引用類型,輸出:姓名:張三,年齡:18 姓名:王五,年齡:20 姓名:王五,年齡:20
二。傳遞特殊的引用類型參數string
string是引用類型,沒錯,但它的很多操作是與值類型看齊的,下面直接代碼演示
static void Main() { string str1 = "張三"; StringBuilder str2 = new StringBuilder(); str2.Append("李四"); System.Console.WriteLine("str1是{0}str2是{1}", str1, str2.ToString()); SwapStrings(str1, str2); System.Console.WriteLine("str1是{0}str2是{1}", str1, str2.ToString()); } private void SwapStrings(string s1,StringBuilder s2) { s1 = "張三瘋"; s2.Append("李四瘋"); s2 = new StringBuilder(); s2.Append("王五"); System.Console.WriteLine("str1是{0}str2是{1}", s1, s2.ToString()); }
以上通過值傳遞引用類型string,輸出:str1是張三str2是李四 str1是張三瘋str2是王五 str1是張三str2是李四李四瘋
static void Main() { string str1 = "張三"; StringBuilder str2 = new StringBuilder(); str2.Append("李四"); System.Console.WriteLine("str1是{0}str2是{1}", str1, str2.ToString()); SwapStrings(ref str1, ref str2); System.Console.WriteLine("str1是{0}str2是{1}", str1, str2.ToString()); } private void SwapStrings(ref string s1,ref StringBuilder s2) { s1 = "張三瘋"; s2.Append("李四瘋"); s2 = new StringBuilder(); s2.Append("王五"); System.Console.WriteLine("str1是{0}str2是{1}", s1, s2.ToString()); }
以上通過引用傳遞引用類型string,輸出:str1是張三str2是李四 str1是張三瘋str2是王五 str1是張三瘋str2是王五