【发布时间】:2008-10-11 16:27:45
【问题描述】:
在related question 中,我的团队即将(希望)开始使用 LINQ,我想利用匿名类型。混合 VB.NET 的 Option Strict(我们在项目的整个生命周期中一直在使用)和新的 Option Infer 指令的最佳方式是什么?
【问题讨论】:
标签: vb.net linq option-strict option-infer
在related question 中,我的团队即将(希望)开始使用 LINQ,我想利用匿名类型。混合 VB.NET 的 Option Strict(我们在项目的整个生命周期中一直在使用)和新的 Option Infer 指令的最佳方式是什么?
【问题讨论】:
标签: vb.net linq option-strict option-infer
Option Strict 和 Option Infer 不冲突,所以我认为同时打开两者并没有什么坏处。
作为样式指南,我更喜欢将 Option Strict、Explicit 和 Infer 放在每个类文件的顶部 - 这可以防止项目或 IDE 设置的差异导致问题,并明确使用了哪些设置。
【讨论】:
Option Strict 可以在没有 Option Infer 的情况下使用,但 Option Infer 不应该在没有 Option Strict 的情况下使用,因为这会导致生成的 IL 出现差异。
考虑这行代码:
txtBox.Text = If(str="", Nothing, CDate(str))
使用 Option Strict Off 和 Option Infer Off,相当于:
txtBox.Text = CStr(If(str="", Nothing, CType(CDate(str), Object)))
如果 str="" 则 txtBox.Text 设置为 Nothing/空字符串。
Option Infer On 但 Option Strict Off 变为:
txtBox.Text = Cstr(If(str="", CDate(Nothing), CType(CDate(str), Object)))
而 CDate(Nothing) = Date.MinValue 等等 txtBox.Text = "01/01/0001"
Option Strict 只能让你的代码无法编译,Option Infer 可以改变它的含义。这并不是说 Infer 不是一件好事,总的来说它是,但有一些注意事项需要注意。
原代码可以写成:
txtBox.Text = Cstr(If(str="", Nothing, CDate(str)))
在这种情况下,如果您打开 Option,Option Strict 将无法拯救您。 Infer On,但在没有 Strict 的代码库中,原始版本的可能性更大。
【讨论】: