-1

このコードサンプルがあります。参照によって変数を渡しますが、そうすべきではありません(私は思いません)。変数を参照渡しすることがデフォルトになっていると思います。これに関するドキュメントを見つけるために正確に何を検索すればよいかわかりません。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace CS_example_2
    {
        class Program
        {
            static void Main(string[] args)
            {
                int result = setResult();

                List<string> namesResult = new List<string>();
                setResultAr(namesResult);

                for (int i = 0; i < namesResult.Count; i += 1)
                {
                    if (i == result)
                    {
                        System.Console.WriteLine("Result is " + namesResult[i]);
                        break;
                    }
                }

                System.Console.ReadKey();
            }

            static int setResult()
            {
                int result = 3;
                return result;
            }

            static void setResultAr(List<string> namesResult)
            {
                List<string> res_array = new List<string>() { "item1", "item2", "item3, "item4", "item5" };

                foreach (string s in res_array)
                {
                    namesResult.Add(s);
                }
            }
        }
    }
4

2 に答える 2

6

変数を参照渡しすることがデフォルトになっていると思います。

そうではない。への参照である変数を値渡ししていList<string>ます。は参照型であるためList<string>、メソッド内で内容を変更できます。

変数自体を再割り当てnamesResultしようとすると、変数 ( ) が参照渡しされないことがわかります。つまり、次のようになります。

static void SetList(List<string> namesResult)
{
    List<string> res_array = new List<string>() { "item1", "item2", "item3, "item4", "item5" };
    namesResult = res_array; 
}

上記を実行しても、値によって渡されるため、元の変数には影響しません。ただし、 ( を使用して) 参照によって渡した場合はref List<string>、変数自体を再割り当てできることがわかります。

この件に関する資料を読むことについては、Jon Skeet がC# でのパラメーターの受け渡しに関するすばらしい記事を書いており、これについて詳しく説明しています。

于 2013-05-20T22:28:07.430 に答える
0

MSDN で答えを見つけました:

参照型の変数には、そのデータが直接含まれていません。そのデータへの参照が含まれています。参照型パラメーターを値で渡すと、参照が指すデータ (クラス メンバーの値など) を変更できます。ただし、参照自体の値を変更することはできません。つまり、同じ参照を使用して新しいクラスにメモリを割り当て、それをブロックの外に保持することはできません。

http://msdn.microsoft.com/en-us/library/s6938f28.aspx

namesResult 値が変更されていないため、この変数は Main で定義された namesResult と同じデータを参照していました。したがって、変数は 2 つの別個の変数ですが、含まれる値は同じデータへの参照でした。したがって、setResultAr メソッド内から使用されるすべてのメソッドは、参照されるデータに影響を与えます。

理にかなっています。君たちありがとう。

于 2013-05-20T22:41:48.390 に答える