7

假设以下代码,没有任何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
    }
}
4

6 回答 6

16

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

于 2010-08-30T21:35:27.673 回答
2

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

于 2010-08-30T21:41:35.863 回答
2

记住这一点的一个好方法是:

  • "ref"为变量创建别名
  • 数组是变量的集合;每个元素都是一个变量。

当你正常传递一个数组时,你传递的是一个变量集合。集合中的变量不会改变。

当您使用“ref”传递一个数组时,您将为包含该数组的变量提供一个新名称

当您通常传递一个数组元素时,您传递的是变量中的值

当您使用“ref”传递一个数组元素 - 一个变量时,您正在为该变量指定一个新名称

说得通?

于 2010-08-30T21:53:02.533 回答
1

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

于 2010-08-30T21:34:48.470 回答
0

正如MSDN 参考所指出的,数组是对象(System.Array 是所有数组的抽象基类型)并且对象是通过引用传递的。

于 2010-08-30T21:37:32.537 回答
0

除了基本数据类型之外,您不能通过值传递其他任何内容,Array 是基本数据类型的集合,还允许在集合上按值传递会创建集合的多个副本,这会影响性能。

于 2010-08-30T21:44:21.880 回答