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

基本データ型以外は、値渡しとして渡すことはできません。配列は基本データ型のコレクションであり、コレクションで値を渡すと、コレクションの複数のコピーが作成され、パフォーマンスが低下します。

于 2010-08-30T21:44:21.880 に答える