非参考非输出参数(如局部变量)表示存储位置。如果存储位置的类型是引用类型,则存储位置将持有对该类型实例的引用。
Ref和输出参数,相反,保持到的存储位置的参考。该存储位置可以是局部变量,字段或数组元素。换句话说,ref和out参数引入了另一个间接层。如果在方法中有引用类型的ref或out参数,那么它表示对对象引用的引用。
为什么要引用对象的引用?如果您需要修改对象的引用(而不是修改对象本身)。
在一些狭隘的环境下,这是一种有用的技巧。例如,您可能要编写订单两个队列取决于其顶部有较小值的函数:如果你想从一个方法返回多个值
void OrderQueues(ref Queue<int> a, ref Queue<int> b)
{
if (a.Peek <= b.Peek) return;
var temp = a;
a = b;
b = temp;
}
输出参数是有用的:
void OldestAndYoungest(IEnumerable<Person> people, out Person youngest, out Person oldest)
{
youngest = null;
oldest = null;
foreach (var person in people)
{
if (youngest == null || person.Age < youngest.Age)
youngest = person;
if (oldest == null || oldest.Age < person.Age)
oldest = person;
}
}
根据我的经验,ref和out参数相当少见,甚至更少见于参考类型。
请注意,ref参数必须由调用方初始化,而out参数必须由被调用方初始化。如果您从不为ref参数赋值,那么它可能应该是一个“正常”参数。如果您从不向out参数赋值(如您的示例中所示),那么您的代码将无法编译。