2

好的,所以我是一名 C# 编码员,我什至无法阅读 VB.NET,所以请原谅这可能是一个非常愚蠢的问题。但我有一些看起来像这样的代码:

Function GetName(sourceObject as Object) as String
    return sourceObject.Name
End Function

因此,忽略语法可能错误的事实——VB.NET 如何从 sourceObject 获取 Name 属性?在运行时检查它会发现 sourceObject 是一种类型,它支持一个名为 Name 的属性和一个 getter,但是 VB.NET 在这种情况下做了什么?编译器是否正在生成一些额外的代码,以便在运行时以某种方式自动转换?

你可能会说,我有点困惑。提前致谢!

4

4 回答 4

6

这是后期绑定的情况。因此,如果 sourceObject 包含一个作为 Name 的属性,它将返回该值,否则它只会抛出该属性未找到的错误。

C# 中的后期绑定需要反射,因此它会引发编译时错误,而在 vb.net 中它可以在没有反射的情况下完成。

将对象分配给对象变量时,Visual Basic 编译器执行称为绑定的过程。当一个对象被分配给一个声明为特定对象类型的变量时,它是早期绑定的。早期绑定对象允许编译器在应用程序执行之前分配内存并执行其他优化。相反,当一个对象被分配给一个声明为 Object 类型的变量时,它是后期绑定的。这种类型的对象可以保存对任何对象的引用。

于 2012-02-15T11:37:45.337 回答
3

如果您使用的是 c# 4.0,那么您可以试试这个。

return ((dynamic)SourceObject).Name;
于 2012-02-15T11:49:56.270 回答
2

由于固有的后期绑定,所有类型 Object 的 VB 变量都等效于已强制转换为动态的 c# 对象——或者换句话说,c# 添加了动态以便获得与 VB 的功能奇偶性。

因此,等效的 c# 代码将是((dynamic) sourceObject).Name

如果可能的话,我会考虑使用泛型或接口来做到这一点,因为那是一种更简洁的设计。

于 2012-02-16T05:01:42.070 回答
1

请注意,VB 的后期绑定会绕过编译器的类型检查。如果传入的对象没有 Name 属性,则可能会在运行时引发异常。

于 2012-02-15T19:44:12.497 回答