1

私はゲームを書いています。世界での衝突のためだけのクラスがあります。コンストラクターで 2 つのリストを渡したいと思います。1 つはすべての敵を含み、もう 1 つはプレイヤーが発射するすべての弾丸を含みます。

refこれは XNA で作成された 2D シップ ゲームですが、C# のキーワードと関係があるため、ここに投稿したいと思いました。リストをコンストラクターに渡すときに、コンストラクターで ref キーワードを使用するとします。

リスト内の要素をいじり始めた場合、要素の削除と追加、変更などは、それらが参照によって渡されたため、リストをクラスに再渡す必要がないようにするでしょう。リスト自体は他のクラスに含まれていますか?

public Collsion_manager(ref List<Bullet> bullets_world, ref List<Enemy_class> enemies_world)
{
}
4

1 に答える 1

5

List<T>一般に、参照型 ( など)を で渡すことは避けたいと考えていますref。sを渡して、List<T>必要なメソッドを呼び出すと、変更がうまくいきます ( .Add().Remove().Sort()など)。List<T>一度 (コンストラクターなどで)を渡すだけでよく、 を使用しなくても、参照はオブジェクトの存続期間中有効なままになりますref

違いは、List<T>byを渡すときに、 objectではなく変数引数refへの参照 (ポインター) を渡すことです。これは、変数に newを割り当てたい場合にのみ違いがあります。List<T>

この違いを説明する小さなプログラムを作成しました。

class Program
{
    static void Main(string[] args)
    {
        List<int> listA = new List<int> { 1, 2, 3 };
        List<int> listB = new List<int> { 1, 2, 3 };

        Update(listA);
        UpdateRef(ref listB);

        Console.WriteLine("listA");
        foreach (var val in listA)
            Console.WriteLine(val);

        Console.WriteLine("listB");
        foreach (var val in listB)
            Console.WriteLine(val);
    }

    static void Update(List<int> list)
    {
        list = new List<int>() { 4, 5, 6 };
    }

    static void UpdateRef(ref List<int> list)
    {
        list = new List<int>() { 4, 5, 6 };
    }
}

プログラムによって生成される出力は次のとおりです。

listA
1
2
3
listB
4
5
6

listBnewList<T>が含まれているのに含まれていないことに注意しlistAてください。これは、変数 listBへの参照があったためです。

于 2013-03-16T04:54:32.957 に答える