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)
通常你想避免传递引用类型(如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.