【问题标题】:Best Practices: Option Infer [closed]最佳实践:期权推断 [关闭]
【发布时间】:2009-03-20 20:27:43
【问题描述】:

您认为在您的项目中使用 Option Infer 的最佳做法是什么?

在 Visual Studio 2008 中,Option Infer 是一个指令,它允许编译器通过查看分配给它的内容来推断已声明变量的数据类型。

这是 VS2008 中的一个关键特性,广泛用于 LINQ 语句和查询。但是,打开 Option Infer 可能会给未来的维护程序员带来陷阱。

【问题讨论】:

标签: vb.net visual-studio-2008 option-infer


【解决方案1】:

C# 使用的类型推断(因此我认为是其他 .net 语言)非常精确(而且非常出色)。编译器仅在类型清晰明确的情况下才允许该语句。因此,结果并不是真正的精度损失......这只是让开发人员不必多次声明类型。您正在减少代码中的重复。

(编辑:另外,重要的是要意识到结果仍然是强类型。编译器在编译时知道变量的确切类型。 没有类似于变体。如果您键入 var x = 42;,它只会发现 x 是一个 int,因为您在右侧放置了一个 int,从而节省了一些打字和重复) .

未来的维护程序员可能不理解它的唯一原因是他们根本不理解类型推断的语言特性。但我认为期望和要求维护程序员了解语言特性比避免良好的语言特性担心未来的程序员不知道它们更合理。

我想如果你处于知道未来的程序员是初级并且对语言不是很了解的情况,那么也许你会避免一些事情。但这让我想知道您是否应该考虑其他语言,甚至是像 Access 这样的“平台”,它是“真正的编程”和非程序员可以做一些事情的混合体。

【讨论】:

    【解决方案2】:

    这是我的建议:

    如果您已经设置 Option Explicit On 和 Option Strict On(在任何级别)

    1. 在 IDE 和项目属性中关闭 Option Infer
    2. 在需要时打开代码文件中的 Option Infer。这确保了代码易于阅读,并且当它打开时,它会提醒读者注意其使用情况,并提醒他们将鼠标悬停在 var 上以查看其类型。

    当 Option Explicit 关闭时...

    打开 Option Infer On 可以让充满变体的旧 VB6 代码更好地编译和运行,因为编译器会在编译时为 var 分配一个类型,而不是允许 var 被后期绑定。但是,应进行测试以确保 var 在其生命周期内不会存储多种类型。

    注意:这不能替代对移植到 .NET 的 VB6 代码的适当重构。变种很糟糕,孩子们,嗯?

    【讨论】:

    • Re“当 Option Explicit 关闭时......但是,应该进行测试以确保 var 在其生命周期内不会存储多种类型。”编译器会抱怨,或者分配一个有效的类型,对吧?在什么条件下需要进一步测试?你能举一个例子,其中存储了多种类型,但编译器既不抱怨,也没有找到合适的类型来声明?
    • 另一个问题:假设Option ExplicitOn,但Option StrictOff - 如果打开Option Infer 会有什么后果? (我正在维护一个包含数百个遗留文件的项目。最终我希望打开 Option Strict,但是有很多地方需要更改代码,所以还没有这样做。)
    【解决方案3】:

    我看到的大多数错误都与 Strict 和 Explicit 有关,但有些错误与 Infer 有关。对于 VB,我认为这 Option Strict On : Option Explicit On : Option Infer Off 是最好的起点。它确实使 For Next 的编写变得更加麻烦,但这确实意味着您的意图不会受到质疑。

    【讨论】:

      【解决方案4】:

      VB.Net 类型推断不能在部分信任环境中的 aspx 页面中使用 …… 通常,VB.Net 默认选项让我们的生活更加艰难。 在 VB9 中,有用的 Option Infer 默认是关闭的。 我们不能写 Option Infer On... 我们不能在页面顶部写 ... 我们不能在 web.config 中写入... 有人刚刚忘记了 VB.Net。

      ……

      请看这里:https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=321981

      【讨论】:

      • 可以将 /optioninfer 添加到页面的 CompilerOptions,如
      • @AMissico:实际上,在 Eric 发布的链接中,您可以看到使用 CompilerOptions 不适用于部分信任级别。微软已经发布了一个答案,并在 web.config 中推荐<providerOption name="OptionInfer" value="true"/>
      【解决方案5】:

      我相信这是一个安全的选择,因为您不能跨方法边界传递“Var”类型。我不是 VB 或 Javascript Variant 类型的忠实粉丝,但 C# 中的 Var 非常方便。如果您打算使用 Linq,我不会关闭该选项。

      --马特

      【讨论】:

      • Option infer 不会专门创建变体...特别是如果您打开了 Option Explicit (您应该这样做,除非您不能这样做)。据我了解(如有必要,请更正),IDE / 编译器根据其分配为变量分配一个类型,并且永远不是变体。
      • 这正是我所说的,新的 Var 类型与传统的 Variant 类型不同。编译器将允许您在本地使用 Var,但不能跨越方法边界传递它或将其设置为成员变量,因此在将 Var 与 Linq 一起使用时不存在 Variant 的固有问题。
      • 这个答案没有用,而且令人困惑(至少目前是这样写的)。应该删除它,因为其他人已经提供了没有此类缺陷的答案。但是,我决定撤消我的 -1,因为它还不错,值得进一步劝阻回答者。 (现有的 -1 足以将其推到列表底部。)
      • 这个答案根本没有用,充其量只是欺骗性的。它需要被删除。我不确定这一点,但我认为删除它会提高作者的声誉。
      猜你喜欢
      • 1970-01-01
      • 2021-07-13
      • 2013-10-02
      • 2010-10-06
      • 2011-10-28
      • 2010-09-10
      • 2011-10-11
      • 1970-01-01
      • 2014-04-26
      相关资源
      最近更新 更多