VB.NET中选项比较二进制/文本的优缺点

时间:2011-06-22 01:29:43

标签: vb.net

使用Option Compare Text与Option Compare Binary进行VB.NET开发的标准化有哪些优缺点?

---编辑---

只是一些背景,因为它似乎会有所帮助 - 我的开发团队发现在Option Strict OnOption Infer OnOption Explicit上标准化要容易得多,因为它们比备择方案。我们没有发现容易标准化的选项比较文本/二进制文件,因为两者似乎都有优点和缺点,不同的开发人员有不同的意见。每一方的一些论点如下:

Option Compare Text的一些优点/参数:

  1. 通过消除对所有地方StringComparer.ToLower()来电和StringComparison.OrdinalIgnoreCase的需求,减少了代码中的详细程度
  2. 数据需求很少涉及套管,大多数数据库都不区分大小写。在进行数据比较时,您很少会真正想要区分THISThis以及this
  3. 当您不必担心套管时,某些特定用例会更简单。例如,处理ASP.NET控件事件,其中命令被发送到代码隐藏作为字符串和套管问题很难跟踪,因为编译器无法帮助您。以Select Case事件的<asp:repeater>语句为例。
  4. 关于文本比较的许多问题涉及国际化,这通常与许多应用程序无关。
  5. VB特别是作为一种语言不区分大小写,尽管Visual Studio至少可以帮助您在大小写中强制执行一致性。 SQL也不区分大小写。字符串是你唯一需要记住担心它的地方,如果你在任何地方担心它,就会突出你通常不会注意到的尴尬。
  6. Option Compare Binary的一些优点/参数:

    1. C#就像这种方式一样,大多数其他语言也是如此。具有替代行为并且意外在编程方面不好有点意外。
    2. 使用选项比较文本会有轻微的性能损失,这可以通过编译时生成的IL来证明。选项比较二进制没有这种惩罚。
    3. 选项比较文本仅使字符串处理的某些部分不区分大小写。但是,它并不能使字典索引这样的东西默认情况下不区分大小写。因此,它不像选项比较文本实际上使它,所以你根本不必担心套管。如果它只能工作一半,为什么要这么麻烦?
    4. 编程很难。最好不要试图平息这个事实。担心字符串套管是交易的一部分。人类认识THISThistHiS不同。当然你的代码也应该 - 毕竟,它们并不是完全相同的字符串。
    5. 所以我真的只是想知道是否还有其他考虑因素。

      - 编辑2 -

      如果我定义了我认为对此的答案,也许会有所帮助。如果您可以指出任何权威的外部资源,更彻底地讨论这些问题,或者指向标准和最佳实践讨论或书籍,提供有关该主题的指导,那肯定会很重要。

4 个答案:

答案 0 :(得分:10)

使用Option Compare Text时,您无需担心比较字符串时的情况。这可能是一个很大的好处,并且避免将所有内容转换为较低(或较高)的情况,以便将字符串相等转换为comapre。

这个角色扮演的另一个地方是字符串的排序。 Option Compare Text将与Windows中的文件列表类似,但Option Compare Binary将排序为Unix文件列表(所有大写文件名都出现在小写文件名之前)。

<强>更新

在阅读了评论和其他答案之后,我想说Option Compare Binary是从与.Net框架的其余部分保持一致的角度出发的方式。如果字典键等区分大小写,无论Option Compare设置如何,那么在整个代码中默认使用二进制比较就是一致的。然后,您需要担心的是,对于特定的比较,您是否需要它不区分大小写并为此编写代码。

如果你选择Option Compare Text,那么你不仅需要担心是否需要进行特定的比较才能保持敏感,你还需要了解当前的默认行为上下文。

然后它成为一个不与其他语言保持一致的论据,而是与你正在发展的框架保持一致。

答案 1 :(得分:5)

使用二进制文件,就像大多数其他语言默认使用的一样,这就是.NET类默认的

弄乱单个单词不应该破坏整个文件。

如果确实需要文字(通常不是),请使用String.CompareString.Equals

答案 2 :(得分:2)

如果需要执行大量不区分大小写的比较,请编写一个带有一些简洁命名辅助方法的模块,并将其包含在项目中。虽然CaseInsenstiveEquals(S1, S2)或(使用扩展方法)S1.CaseInsensitiveEquals(S2)S1 = S2更冗长,但许多应用程序需要区分大小写和不区分大小写的比较。使用equals运算符报告包含不同字符序列的相等字符串将增加区分大小写的比较的详细程度。此外,有许多方法可以执行不区分大小写的比较。如果使用辅助方法,该方法的代码将精确地揭示它使用的方法。相比之下,如果使用Option Compare Text,那么要知道如何处理所有不同的角落情况将会更加困难。

答案 3 :(得分:1)

SQL不区分大小写,但LINQ中的查询是。它是一些内部错误的来源。

解决方案不是将密钥用于文本。必要时,确保db中的大小写是一致的。最后,如果无法做到这一点,只需根据需要使用tolower。除非需要,否则我不会建议使用tolower,因为这确实让代码变得丑陋。