在C#中传递的数组参数:为什么它是通过引用隐式的?

时间:2010-08-30 21:33:42

标签: c# arrays pass-by-reference parameter-passing pass-by-value

假设以下代码没有任何ref关键字,显然不会替换传递的变量,因为它是作为值传递的。

class ProgramInt
{
    public static void Test(int i) // Pass by Value
    {
        i = 2; // Working on copy.
    }

    static void Main(string[] args)
    {
        int i = 1;
        ProgramInt.Test(i);
        Console.WriteLine(i);
        Console.Read();

        // Output: 1
    }
}

现在要让该功能按预期工作,可以像往常一样添加ref关键字:

class ProgramIntRef
{
    public static void Test(ref int i) // Pass by Reference
    {
        i = 2; // Working on reference.
    }

    static void Main(string[] args)
    {
        int i = 1;
        ProgramInt.Test(ref i);
        Console.WriteLine(i);
        Console.Read();

        // Output: 2
    }
}

现在我很困惑为什么在函数中传递的数组成员是通过引用隐式传递的。不是数组值类型吗?

class ProgramIntArray
{
    public static void Test(int[] ia) // Pass by Value
    {
        ia[0] = 2; // Working as reference?
    }

    static void Main(string[] args)
    {
        int[] test = new int[] { 1 };
        ProgramIntArray.Test(test);
        Console.WriteLine(test[0]);
        Console.Read();

        // Output: 2
    }
}

6 个答案:

答案 0 :(得分:16)

不,数组是类,这意味着它们是引用类型。

答案 1 :(得分:2)

数组不是通过引用传递的。对数组的引用按值传递。如果需要更改传入的数组变量指向的WHAT数组(例如,更改数组的大小),则必须通过引用传递该变量。

答案 2 :(得分:2)

记住这个的好方法是:

  • “ref”将别名设为变量
  • 数组是变量集合;每个元素都是一个变量。

正常传递数组时,传递变量集合。集合中的变量不会改变。

当您使用“ref”传递数组时,您为包含数组的变量赋予新名称。

当您正常传递数组元素时,您将传递变量中的值。

当您使用“ref”传递数组元素(变量)时,您为该变量提供新名称

有意义吗?

答案 3 :(得分:1)

你能想象按值传递200万个元素数组吗?现在假设元素类型是decimal。你将不得不复制 240MB 30.5175781MB的数据。

答案 4 :(得分:0)

the MSDN reference所示,数组是对象( System.Array是所有数组的抽象基类型),对象通过引用传递。

答案 5 :(得分:0)

除了基本数据类型之外,你不能传递任何其他值作为传递值,Array是基本数据类型的集合,也允许在集合上传递值会创建多个集合副本,这对性能有害。