C#值类型和引用类型作为方法参数时,加与不加ref的区别

示例1:

        private static void Main(string[] args)
        {
            StringBuilder test = new StringBuilder();
            test.Append("HELLO ");
            MyTest(test);
            Console.WriteLine(test);
            Console.ReadLine();
        }

        private static void MyTest(StringBuilder str)
        {
            str.Append("WORLD !");
        }

在调用MyTest方法的时候,将实例的内存地址传递给方法参数str,此时,test和str中的地址都指向保存实例的内存。

运行结果:

示例2:

        private static void Main(string[] args)
        {
            StringBuilder test = new StringBuilder();
            test.Append("HELLO ");
            MyTest(test);
            Console.WriteLine(test);
            Console.ReadLine();
        }

        private static void MyTest(StringBuilder str)
        {
            StringBuilder temp = new StringBuilder();
            temp.Append("haha!");
            str = temp;
        }

在调用MyTest方法的时候,将实例1的内存地址1传递给方法参数str,此时,test和str中的地址都指向实例1的内存。在执行完str = temp时,将实例2的内存地址2传递给方法参数str,此时,temp和str中的地址都指向保存实例2的内存,str不再指向实例1。但是,test中的地址仍然指向实例1。

运行结果:

示例3:

        private static void Main(string[] args)
        {
            StringBuilder test = new StringBuilder();
            test.Append("HELLO ");
            MyTest(ref test);
            Console.WriteLine(test);
            Console.ReadLine();
        }

        private static void MyTest(ref StringBuilder str)
        {
            StringBuilder temp = new StringBuilder();
            temp.Append("haha!");
            str = temp;
        }

在执行MyTest方法后,此时将实例地址1的地址传递给方法参数地址的地址。此时实例地址1的地址指向实例地址1(test),方法参数地址的地址指向方法参数地址(str),其实“实例地址1(test)”和“方法参数地址(str)”是同一块内存区域(应该吧)。实例地址1(test)和方法参数地址(str)都指向实例1。在执行完str = temp后,实例2的地址(实例地址2(temp))传递给方法参数地址(str)(也就是实例地址1(test)),此时,实例地址1(test)、方法参数地址(str)和实例地址2(temp)均指向实例2。

运行结果:

猜你喜欢

转载自blog.csdn.net/wu_pan123/article/details/85125593