首页 > 学院 > 开发设计 > 正文

c# - 外部对象作为参数调用方法时需要注意的问题

2019-11-14 12:30:21
字体:
来源:转载
供稿:网友

我们在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,值会在调用方法时被修改。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表