从VB.NET反编译的Operators.ConditionalCompareObjectEqual

时间:2013-04-24 12:48:59

标签: vb.net cil

我使用ILSply从遗留的VB.NET应用程序中解构了一些旧代码,并出现了这一行:

Operators.ConditionalCompareObjectEqual(safeDataReader["isLoader"], -1, false)

我知道这是编译器生成的,但不建议在应用程序源代码中使用此代码。我的问题是为什么会出现这种情况,应该在正常的情况下采取什么措施?码?

1 个答案:

答案 0 :(得分:4)

documentation for the method在那里说:

  

表示重载的Visual Basic equals(=)运算符。

为什么呢?我不“知道”,但很容易做出有根据的猜测。

VB.NET中“=”运算符的语义与C#和标准Object.Equals()的语义略有不同。语义是从VB6继承的,由于向后兼容性原因无法更改。显然,这个方法实现了编译器的VB6语义。

如果能够对这些差异进行系统分析,那将是一个有趣的读物。

进一步的想法:

“不推荐”的原因是因为没有理由从VB.NET调用该方法:只需使用=。在C#中,没有特别的理由调用VB6语义,所以这个方法在那里也没有多大意义。

显然,如果你正在编译从VB.NET生成的C#代码,那么这些是特殊情况:调用方法是正确的做法,除非你愿意花时间分析代码并向自己证明标准= cn可以安全替换。