这两种方法有什么区别
本文关键字:什么 区别 方法 两种 | 更新日期: 2023-09-27 17:59:51
下面的代码有什么区别?两种方法都实现了从列表中删除4的相同输出。
static void Main(string[] args)
{
var list = new List<int> {1, 2, 3, 4, 5, 6, 7, 8, 9};
ModifyList(ref list);
Console.WriteLine(string.Join(", ", list));
list.Add(4);
ModifyList(list);
Console.WriteLine(string.Join(", ", list));
Console.ReadLine();
}
public static void ModifyList(ref List<int> list)
{
list.Remove(4);
}
public static void ModifyList(List<int> list)
{
list.Remove(4);
}
在这种情况下,两者做的事情完全相同。通过ref传入参数的区别在于,如果您为变量本身赋值(例如list = new List<int>();
),它将更新调用方的引用,以指向新列表。
有关更多信息,请参阅传递引用类型参数(C#编程指南)。
在这种情况下,唯一的区别是隐藏的,不容易察觉,区别在于在ModifyList(ref List<int> list)
中,列表对象是通过引用传递的,因此原始引用(托管指针)与传递的原始对象相同,而在第二种情况下,引用被复制到另一个引用,因此列表参数基本上是指向真实对象的另一个参考的引用。
你得到的结果是一样的,因为在C#中,使用安全引用对你来说是完全透明的,但如果你使用带有原始指针的C或C++,你会注意到在第二种情况下,你必须两次取消引用指针才能访问对象。。。