我理解如何在两种不同的类型之间进行,但我的问题是;为什么这种差异在类型级别?
我原以为它会是ParamterInfo
对象的属性,而不是单独的特殊类型。
假设它在反射中作为一个单独的类型呈现,因为它是内部的,它是什么语言的好处是将它作为一个单独的类型(我猜测更容易的方法重载解决或什么)?
在类似的说明中,为什么ref
会产生不同的类型,但out
却没有(我不能想到ref
是一个单独的类型的原因,'不要'适用于out
)?
答案 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#在语法中隐藏了几乎所有这些内容。任何隐藏细节的方式总是有争议的,但在这种情况下隐藏任何有用的东西都没有多少,所以人们很难批评它。