我們在c#中調用方法的時候,是否曾擔心過我們傳進去的參數會被修改,或者擔心其不被修改;本文介紹了常見的幾種情況,并做了代碼測試,可以做個參考。
測試方法:
1. 定義兩個類,IntClass(僅包含一個int類型的屬性)及StringClass(僅包含一個string類型的屬性)。
2. 測試時,定義四個分別為以下類型:int,string,IntClass,StringClass的變量。
3. 對于每一個變量,定義兩個方法(帶ref及不帶ref關鍵字),在方法中修改參數的值;4個變量共計8個方法。
4. 觀察每次方法調用,是否對方法調用之外的變量產生影響。
測試代碼:
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 不會被修改 IntTest2(ref i); // i 會被修改 IntClassTest(ic); // ic.I 會被修改 IntClassTest2(ref ic); // ic.I 會被修改 StringTest(str); // str 不會被修改 StringTest2(ref str); // str 會被修改 StringClassTest(sc); // sc.S 會被修改 StringClassTest2(ref sc); // sc.S 會被修改 } }}測試結果:
結論:
1. 如果方法參數是類,則會被當作引用類型,無論是否使用ref,值都會在調用方法時被修改。
2. 如果方法參數是基本類型,如int或者string,不使用ref,則值不會在調用方法時被修改;使用ref,值會在調用方法時被修改。
新聞熱點
疑難解答