为什么ref参数类型与常规类型不同?

时间:2012-01-17 09:41:04

标签: c# .net reflection language-design pass-by-reference

我理解如何在两种不同的类型之间进行,但我的问题是;为什么这种差异在类型级别

我原以为它会是ParamterInfo对象的属性,而不是单独的特殊类型。

假设它在反射中作为一个单独的类型呈现,因为它是内部的,它是什么语言的好处是将它作为一个单独的类型(我猜测更容易的方法重载解决或什么)?

在类似的说明中,为什么ref会产生不同的类型,但out却没有(我不能想到ref是一个单独的类型的原因,'不要'适用于out)?

2 个答案:

答案 0 :(得分:6)

ref参数具有不同的类型,因为ref类型也允许在参数之外的其他上下文中使用。 C#不允许它,但其他语言(至少是C ++ / CLI)确实支持,例如,引用类型的局部变量。这样的事情对ref有意义,但不适用于out

假装C#允许它,你可以写(它由IL支持):

int x = 3;
ref int y = x;
y = 4;
if (x == 4)
    MessageBox.Show("x is 4");

这不是有用的的例子,但在ref参数有用的相同情况下,使用辅助类或结构也很有用。 ref字段。

答案 1 :(得分:5)

public static int SomeMethod(string local, ref string strParam)
{
  local = SomeStaticlyHeldString;
  strParam = SomeStaticlyHeldString;
  int localInt = local.Length;
  return strParam.Length;
}

local的分配意味着内存中local标记的位置指向SomeStaticlyHeldString所指向的同一对象。

strParam的赋值意味着参数使用ref标签传递给方法的内存位置现在指向SomeStaticlyHeldString所指向的同一对象。

获取local.Length查询local指向的对象。获取strParam.Length查询strParam指向的变量指向的对象,指向。{/ p>

这两者的表现非常不同,不仅仅是在定义参数或本地时,而是每次使用它们。这种差异在很大程度上是隐藏的,因此它们之间的差别越大,因为它们的每一项操作都有所不同。

如果我们的低级语言只有局部变量,某些非本地堆上的对象以及指向这两者的指针,那么local类型为string*并且类型为strParam的{​​{1}}。这将是我们如何在C中进行类似的操作,以及我们如何在C ++中这样做虽然它也有引用类型(尽管使用C ++,类型是引用类型更明显是其类型定义的一部分,并且他们有进一步的用途和改进)。 C#在语法中隐藏了几乎所有这些内容。任何隐藏细节的方式总是有争议的,但在这种情况下隐藏任何有用的东西都没有多少,所以人们很难批评它。