使用ref with lists以及如何更新列表

Tuc*_*gan 1 c# parameters arguments ref keyword

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

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

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

public Collsion_manager(ref List<Bullet> bullets_world, ref List<Enemy_class> enemies_world)
{
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*mms 5

通常你想避免传递引用类型(如List<T>)ref.你可以通过在List<T>S和打电话给你希望在它的任何方法和变化将通过精细携带(如.Add(),.Remove(),.Sort(),等).您只需要传入List<T>一次(比如在构造函数中),即使您不使用,引用也将在对象的生命周期内保持有效ref.

它的不同之处在于,当您传递List<T>by时ref,您将引用(指针)传递给变量参数,而不是对象.如果要为变量分配新内容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 };
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是该程序产生的输出:

listA
1
2
3
listB
4
5
6
Run Code Online (Sandbox Code Playgroud)

注意如何listB包含新的List<T>listA不包含.这是因为我们引用了变量 listB.