4

次のようなクラスがあるとします。

public class ThingManager {
    List<SomeClass> ItemList;

    public void AddToList (SomeClass Item)
    {
        ItemList.Add(Item);
    }

    public void ProcessListItems()
    {
        // go through list one item at a time, get item from list,
        // modify item according to class' purpose
    }
}

「SomeClass」は非常に複雑なメソッドとメンバー(たとえば、List <>と配列)を含むかなり大きなクラスであり、それらが大量に存在する可能性があるため、プログラムの周囲に大量のデータをコピーしないと仮定します。重要。

「AddToList」メソッドに「ref」を含める必要がありますか?なぜ?

これは、Cでポインタをもう一度学習しようとしているようなものです;-)(これがおそらく私が混乱している理由です。これらをポインタに関連付けようとしています。Cでは、「SomeClass*Item」と「のリスト」になります。 SomeClass * "変数)

4

4 に答える 4

17

SomeClass はクラスであるため、参照によって AddToList メソッドに自動的に渡されます (より正確には、その参照は値によって渡されます)。したがって、オブジェクトはコピーされません。ref キーワードを使用する必要があるのは、AddToList メソッドなどで参照ポイントがオブジェクトを再割り当てする場合のみですItem = new SomeClass();

于 2010-05-14T23:05:41.553 に答える
2

SomeClass は参照型であるため、「ref」キーワードを使用する必要はありません。値型の場合は、「ref」が役立つ場合があります。

于 2010-05-14T23:02:27.880 に答える
1

outパラメータを戻り値として機能させる方法と考えてください。

したがって、これらは非常に似ています。

void Foo(out int result)
{
    result = 5;
}

int Foo()
{
    return 5;
}

次にref、パラメーターを入力と出力の両方にできるようにする方法と考えてください。

したがって、あなたの例では、メソッドを宣言した場合:

public void AddToList(ref SomeClass Item)

次に、呼び出し元は次のように記述する必要があります。

SomeClass i = null;
obj.AddToList(ref i);

これは違法です。たとえば、次のようになります。

obj.AddToList(ref new SomeClass());

AddToListメソッドが変数に値を格納できるように、式ではなく変数名を渡す必要があります。接頭辞を追加することrefにより、メソッドが渡された変数を別のオブジェクトにポイントできるようになります。

于 2010-05-14T23:11:35.373 に答える
0

パラメータuserrefの元の値を使用する必要がある場合。そうでない場合は、使用してください。参考のために:

http://www.yoda.arachsys.com/csharp/parameters.html

http://msdn.microsoft.com/en-us/library/0f66670z(VS.71).aspx

于 2010-05-14T23:01:46.000 に答える