1

我正在写一个游戏,将有一堂课只为我在世界上的碰撞。我想在它的构造函数中传递两个列表,一个包含所有敌人,另一个包含玩家发射的所有子弹。

这是在 XNA 中完成的 2d 船舶游戏,我应该这么说,但我想在这里发帖,因为它更多地与 C#ref关键字有关。如果我在将列表传递给它时在构造函数中使用 ref 关键字。

现在,如果我开始弄乱列表中的元素,删除和添加元素,修改等,因为它们是通过引用传递的,所以我不必将列表重新传递到类中,如果列表本身包含在其他类中吗?

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

1 回答 1

5

通常,您希望避免将引用类型(如List<T>)传递给ref. 您可以传入List<T>s 并调用您想要的任何方法,并且更改将很好地进行(如.Add(), .Remove(),.Sort()等)。您只需要传入List<T>一次(例如在构造函数中),即使您不使用ref.

它的不同之处在于,当您传递List<T>by时,您传递的是对变量ref参数的引用(指针),而不是object。如果您想为变量分配一个新的,这只会产生影响。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

注意如何listB包含新的List<T>listA不包含。这是因为我们有一个对变量 listB的引用。

于 2013-03-16T04:54:32.957 回答