.net - VB.NET 语言和什么都没有 : why is it the way it is?

标签 .net vb.net compiler-construction

这是一个关于 VB.NET 语言的问题。由于我每天都在使用它,因此我只是尝试了解其某些构造背后的动机。

我只是发现这一行:

If myObject Is Nothing then

和这个一样正确:
If Nothing Is myObject Then

结果一样。使用 ildasm,我们可以看到这些行被转换为:
if myObject = null then


if null = myObject then

嗯,但是,在 VB.NET 中,你不能写:
if myObject = Nothing Then

编译器不会接受。

嗯,对我来说,如果没有什么是我的对象 远不如 明显如果 myObject = 无 .

为什么 VB.NET 作者的想法正好相反?任何提示?

最佳答案

您遇到的问题是 VB.Net 区分了两种类型的对象比较。即引用和值比较。

VB.Net 中的“Is”运算符用于引用比较。当所讨论的值既是引用类型又是可空值时,可以使用此方法。尝试以这种方式比较值类型将导致编译错误。

“=”运算符用于值比较。值比较只能用于在其类定义中定义显式 =、<> 运算符对的类型。等式的实际实现取决于运算符的实现。

C# 采用不同的方法,它使用 == 进行值和引用比较。使用哪个取决于几个因素,包括被比较的值的类型和某些相等方法的实现。

关于.net - VB.NET 语言和什么都没有 : why is it the way it is?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1034651/

相关文章:

c# - SQLite 内存数据库急切加载实体

vb.net - 带有 case OR 运算的 VB.NET select case 语句逻辑是什么?

wpf - WPF 中的自定义控件

c - 有没有办法让 gcc 或 clang 对显式强制转换发出警告?

.net - 什么是 WCF?它可以做什么?

c# - 我的 wcf 应用程序中是否存在安全错误?

C# 从内部代码事件 WF 4.0 以编程方式终止工作流

c# - 同时使用 catch 和 finally 的 try-catch-finally 的用例

database - MS-Access .mdb 编译器?

c++ - 关于条件编译 (ifndef) 的快速问题