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

Geo*_*ett 6 .net c# reflection language-design pass-by-reference

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

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

假设它表现为在反射分离型,因为这是它是如何在内部,什么语言的好处是有具有该作为一个单独的类型(我猜简单的方法重载或东西)?

在一个类似的说明,为什么ref做一个不同的类型,但out没有(我不能想到ref作为一个单独的类型的原因,不适用out)?

小智 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");
Run Code Online (Sandbox Code Playgroud)

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

  • C#确实使用的ref _return type_函数的一个例子是你自己在C#中自己定义它是数组上的Address函数,它允许你获取多维的地址(为了传递给ref参数)数组元素. (2认同)

Jon*_*nna 5

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

赋值local意味着内存中local标记的位置现在指向指向的同一对象SomeStaticlyHeldString.

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

获取local.Length查询local指向的对象.获取strParam.Length查询strParam指向的变量指向的对象.

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

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