我们在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,值会在调用方法时被修改。
新闻热点
疑难解答