3

重複の可能性:
refによるオブジェクトの受け渡し

以下のコードでは、出力は次のようになります。

Without:
With:1

コード:

    static void Main(string[] args)
    {
        var listWithoutRef = new List<int>();
        WithoutRef(listWithoutRef);
        Console.WriteLine("Without:" + string.Join(" ", listWithoutRef));

        var listWithRef = new List<int>();
        WithRef(ref listWithRef);
        Console.WriteLine("With:" + string.Join(" ", listWithRef));
    }

    static void WithoutRef(List<int> inList)
    {
        inList = new List<int>(new int[] { 1 });
    }

    static void WithRef(ref List<int> inList)
    {
        inList = new List<int>(new int[] { 1 });
    }

これを見るだけで、リストはヒープ上にあり、とにかくrefによって渡されるので、同じである必要がありますか?refキーワードを誤解していますか?それとも私は何か他のものが欠けていますか?

4

2 に答える 2

7

refキーワードを誤解していますか?それとも私は何か他のものが欠けていますか?

はい。リスト自体をメソッドに渡すのではなく、参照ごとにリストに参照を渡します。これにより、メソッド内の参照(実際に参照するもの)を変更し、それを反映させることができますList<int>listWithRef

キーワードを使用しrefないと、メソッドはリストへの参照を変更できません。どちらの場合も、実際のリストストレージメカニズムは変更されません。

リストを使用するだけの場合は、これは必須ではないことに注意してください。List<int>.Addたとえば、どちらのメソッド内でも呼び出すことができ、リストには新しいアイテムが追加されます。参照は、参照自体を変更するために参照型でのみ必要です。

于 2012-06-26T18:28:08.253 に答える
3

はい、すべてのListオブジェクトはどちらの方法でもヒープに格納されます。ただし、refキーワードがないと、inListパラメータを再割り当てして、呼び出し元のスコープに影響を与えることはできません。新しいオブジェクトを作成すると、Listそのオブジェクトは新しいオブジェクトとしてヒープに配置されますが、 refキーワードを使用しない限り、呼び出し元のスコープ内の元の参照は影響を受けません。

ではWithoutRef、既存のメソッドListを再定義せずに呼び出すと、変更されていることがわかります。

inList.Clear();
inList.Add(1);
于 2012-06-26T18:28:06.503 に答える