我們?cè)赾#中調(diào)用方法的時(shí)候,是否曾擔(dān)心過(guò)我們傳進(jìn)去的參數(shù)會(huì)被修改,或者擔(dān)心其不被修改;本文介紹了常見(jiàn)的幾種情況,并做了代碼測(cè)試,可以做個(gè)參考。
測(cè)試方法:
1. 定義兩個(gè)類,IntClass(僅包含一個(gè)int類型的屬性)及StringClass(僅包含一個(gè)string類型的屬性)。
2. 測(cè)試時(shí),定義四個(gè)分別為以下類型:int,string,IntClass,StringClass的變量。
3. 對(duì)于每一個(gè)變量,定義兩個(gè)方法(帶ref及不帶ref關(guān)鍵字),在方法中修改參數(shù)的值;4個(gè)變量共計(jì)8個(gè)方法。
4. 觀察每次方法調(diào)用,是否對(duì)方法調(diào)用之外的變量產(chǎn)生影響。
測(cè)試代碼:
namespace RefTest{ public class IntClass { public int I { get; set; } } public class StringClass { public string S { get; set; } } class PRogram { public static void IntTest(int i) { i++; } public static void IntTest2(ref int i) { i++; } public static void IntClassTest(IntClass i) { i.I++; } public static void IntClassTest2(ref IntClass i) { i.I++; } public static void StringTest(string str) { str += " hello"; } public static void StringTest2(ref string str) { str += " hello"; } public static void StringClassTest(StringClass str) { str.S += " hello"; } public static void StringClassTest2(ref StringClass str) { str.S += " hello"; } static void Main(string[] args) { int i = 3; string str = "hi "; IntClass ic = new IntClass() { I = 3 }; StringClass sc = new StringClass() { S = "hi " }; IntTest(i); // i 不會(huì)被修改 IntTest2(ref i); // i 會(huì)被修改 IntClassTest(ic); // ic.I 會(huì)被修改 IntClassTest2(ref ic); // ic.I 會(huì)被修改 StringTest(str); // str 不會(huì)被修改 StringTest2(ref str); // str 會(huì)被修改 StringClassTest(sc); // sc.S 會(huì)被修改 StringClassTest2(ref sc); // sc.S 會(huì)被修改 } }}測(cè)試結(jié)果:
結(jié)論:
1. 如果方法參數(shù)是類,則會(huì)被當(dāng)作引用類型,無(wú)論是否使用ref,值都會(huì)在調(diào)用方法時(shí)被修改。
2. 如果方法參數(shù)是基本類型,如int或者string,不使用ref,則值不會(huì)在調(diào)用方法時(shí)被修改;使用ref,值會(huì)在調(diào)用方法時(shí)被修改。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注