Code Bye

c# 中值传递与引用传递的一个问题

        各位大大大家好,c#新手对于值传递和引用传递一直心存疑问,看了http://www.cnblogs.com/kirinboy/archive/2012/06/15/value-and-reference-in-csharp-2.html感觉清晰了不少,但是继续学习到数组排序的时候又产生了新的问题。
冒泡排序代码如下:
 class Program
    {
        static void Main(string[] args)
        {
            int[] a = { 2, 6, 4, 8, 10, 12, 89, 68, 45, 37 };
            string output = "The original order is : ";
            for (int i = 0; i < a.Length; i++)
                output += a[i] + " ";
            Console.WriteLine(output += "\n");
            BubbleSort(a);
            output = "The new order is : ";
            for (int i = 0; i < a.Length; i++)
                output += a[i] + " ";
            Console.WriteLine(output);
        }
        static void BubbleSort(int[] b)
        {
            for (int pass = 1; pass < b.Length; pass++)
                for (int i = 0; i < b.Length - 1; i++)
                    if (b[i] > b[i + 1])
                        Swap(b, i);
        }
        static void Swap (int[] c, int d)
        {
            int hold;
            hold = c[d];
            c[d] = c[d + 1];
            c[d + 1] = hold;
        }
    }

本人的问题在于,对于c#,默认的传递型式为值传递,那么这段代码中的Swap方法应该也是值传递吧?这样的话按照开头那篇帖子的说法,难到不是计算机在内存中新开辟一块内存保存局部变量c[i]的各个值么?为什么这段代码看上去是直接改变了原数组的各个变量呢?是原因是数组有什么特殊的性质么?
新手还在学习中,可能问题表述不够清楚,还望海涵。

解决方案

5

数组是引用类型

5

你的问题在于 对于c#,默认的传递型式为值传递
这是谁告诉你的?
假如是你本人,那就是你想当然了
假如是老师告诉你的,那就得打老师的屁股
错误的前提,是推导不出正确的结论的
对于c#,对于 值类型 默认的传递型式为值传递,对于 引用类型 默认的传递型式为引用传递
由于数组是 引用类型,所以你的疑惑就不存在了
至于能否是 在内存中新开辟一块内存保存局部变量c[i]的各个值 是不需要你去过问的(尤其是刚开始学者)
你去学开汽车,也需要先去知道汽车是怎么样制造出来的吗?

10

.net 中所谓的值传递,是 .net 的值传递。有些人套用 c/c++ 的说法,那是错误的。
以值传递方式方式传递参数 int[] c,这个意思就是把 c 这个引用(或也可以隐喻地说成是“指针”)作为值而传递。而一些只是学过一点 c 语言不知道什么入门书的人则说“是把c在堆栈中复制了一份而传递”这是完全错误的。
在 .net 中,值传递比引用传递更快。而在c中,引用传递通常比值传递更快。.net跟标准c完全是两个不同的东西,不能胡乱生搬硬套。
在.net中,所谓“按值传递”,是说传递过去的引用地址c,在方法 Swap 结束时(堆栈弹出时)直接被丢弃了,而不会用堆栈弹出的新的引用来重新赋值给变量c。而“按引用传递”,就是说在 Swap 从堆栈弹出新的引用之后把引用重新赋值给变量c,从而c的引用就改变了。
因此在 .net 中,按值传递比按引用传递更快。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明c# 中值传递与引用传递的一个问题