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字段的辅助类或结构也很有用.
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#在语法中隐藏了几乎所有这些内容.任何隐藏细节的好处总是值得商榷,但在这种情况下隐藏任何有用的东西都没有多少,所以这是一个很难批评的东西.
| 归档时间: |
|
| 查看次数: |
217 次 |
| 最近记录: |