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

我们在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 会被修改
        }
    }
}


测试结果:

c# - 外部对象作为参数调用方法时需要注意的问题_第1张图片


结论:

1. 如果方法参数是类,则会被当作引用类型,无论是否使用ref,值都会在调用方法时被修改。 

2. 如果方法参数是基本类型,如int或者string,不使用ref,则值不会在调用方法时被修改;使用ref,值会在调用方法时被修改。

你可能感兴趣的:(C#)