2

「copy_of_digits」配列を変更すると、「digits」配列と「parse_result」配列の両方が変更される理由がわかりません。参照渡しと値渡しに関するオンライン ヘルプを確認したところ、C# では値渡しがデフォルトであり、参照渡しには「ref」を使用する必要があると書かれています。ここで起こることは、配列が値ではなく参照によって渡されることだと思いますが、その理由と修正方法を理解できません。どんな助けでも大歓迎です!

namespace TestWithArrays
    {
        class Program
        {
            public static void Main()
            {
                Console.WriteLine("Please enter 2 digits:");
                string user_input = Console.ReadLine();
                int[] parse_result = Parse(user_input);
                int[] multiply_by_two_result = MultiplyByTwo(parse_result);
                Console.WriteLine("The End...");
                Console.ReadLine();
            }
            public static int[] Parse(string user_input)
            {
                int[] digits = new int [2];
                digits[0] = Int32.Parse(user_input.Substring(0,1));
                digits[1] = Int32.Parse(user_input.Substring(1,1));
                return digits;
            }
            public static int[] MultiplyByTwo(int[] digits)
            {
                int[] copy_of_digits = new int [2];
                copy_of_digits = digits;
                Console.WriteLine("´digits´ array before copy has been modified: " + string.Join(string.Empty, digits));
                copy_of_digits[0] = copy_of_digits[0] * 2;
                copy_of_digits[1] = copy_of_digits[1] * 2 ;
                Console.WriteLine("´digits´ array after copy has been modified: " + string.Join(string.Empty, digits));
                Console.WriteLine("´parse_result´ after copy has been modified: " + string.Join(string.Empty, digits));
                return copy_of_digits;
            }
        }
    }
4

4 に答える 4

7

参照を割り当てる代わりに

copy_of_digits = digits;

digits 配列のすべてのを copy-of_digites 配列にコピーします。

Array.Copy(digits, copy_of_digits, 2);

そうしないと、メモリ内の同じアイテムを指す複数の参照が作成されます。

于 2013-09-23T10:00:15.007 に答える
1

C# では値渡しがデフォルトであり、参照渡しには「ref」を使用する必要があると書かれています。

そうなんですけど、値渡ししているのは参照そのものです(.NETでは配列は参照型なので)。

そのため、配列をコピーする必要があります。参照型オブジェクトの配列である場合のみ、すべての配列項目をコピーする必要があります。

于 2013-09-23T10:02:27.010 に答える
1

はい、C# のデフォルトは値渡しです。ただし、何を値渡ししているのかを認識する必要があります。ここでは、参照を値渡ししています。参照は基本的に配列のアドレスです。を変更するか、別の変数にdigits[0] = ...代入してから を変更しても、同じ配列を変更しています。重要なことは、ここにあります:digitscopy_of_digits[0] = ...

int[] copy_of_digits = new int [2];
copy_of_digits = digits;

最初のnew int [2]配列はここでは完全に破棄されます- それは何の役にも立ちません。また、2 行目は配列をコピーしません。参照をコピーして別の変数に代入するだけです。

基本的に、冗長を無視すると、質問には 1 つの配列しかnew int [2]ありません。当然のことながら、内容をどこでどのように変更しても、変更はどこにでも見られます。結局、すべて同じ配列です。

ここで実際にやりたいことは次のとおりだと思います。

public static int[] MultiplyByTwo(int[] digits)
{
    int[] copy_of_digits = (int[])digits.Clone();
    ...
于 2013-09-23T10:02:52.053 に答える
0

ref は、変数への参照を渡すために使用されます。これは、変数が保持する参照/値も変更できることを意味します。

変数が保持している値は、参照型または値型 ( http://msdn.microsoft.com/en-us/library/t63sy5hs.aspx ) にすることができます。int/struct などの値型の場合、値のコピーが渡されますが、参照型の場合は、元のオブジェクトへの参照 (この場合は元の配列への参照) が引き続き取得されるため、メンバーを変更すると元のオブジェクトのメンバー。

于 2013-09-23T10:08:04.450 に答える