Option Strict On和.NET for VB6程序员

时间:2008-10-21 15:51:44

标签: .net vb.net late-binding

我正准备一个Visual Basic 2005上的课程,目标是Visual Basic 6程序员迁移到.NET平台。

我想就是否建议他们始终启用 Option Strict 提出建议。

我专门使用C风格的编程语言,主要是Java和C#,所以对我来说,显式投射是我一直希望我必须做的事情,因为它从来都不是一个选择。
但是我认识到使用内置支持后期绑定的语言的价值,因为不必过分明确代码中的类型确实可以节省时间。即使在具有动态语言运行时的.NET平台上,动态类型语言的流行扩散进一步证明了这一点。

考虑到这一点,如果第一次使用VB.NET和VB6背景接近.NET的人应该被鼓励进入必须使用编译时类型检查的思维模式,因为那是CLR中的“最佳实践”吗?或者继续享受后期约束的好处是否“还可以”?

8 个答案:

答案 0 :(得分:26)

是的! Option Strict绝对是.Net的最佳实践。强调.Net是强类型平台的核心,直到DLR得到更完全的支持。除了少数例外情况,每个DimFunction都应该声明一个显式类型。 LINQ或Boo和JScript之类的东西是证明规则的例外。

以下是其他一些需要指出的事项。我相信你很清楚这一切,但我必须使用并维护很多由前VB6ers编写的VB.Net代码,所以这对我来说是一个痛处:

  • 请勿使用旧的字符串函数:LEN()REPLACE()TRIM()
  • 不再推荐匈牙利疣。 oMyObjectsMyString不是犹太教徒。如果他们不相信你,请在Microsoft's Design Guidelines中向他们展示参考。
  • 确保他们了解新的AndAlso / OrElse逻辑运算符
  • PARAMETERIZED QUERIES和现代ADO.Net。不能强调这一点。他们永远不需要再次致电CreateObject()
  • 在.Net中,Scope的工作方式与在VB6中的工作方式不同(并且更为重要)。 VB.Net仍然有模块,但它们现在更类似于静态类。理解在真实面向对象环境中的开发是如何不同的,而不是VB6提供的部分OOP支持。没有充分的理由允许方法运行到不合适的长度。
  • 确保他们了解泛型和界面(包括IEnumeralbe(Of T)),并了解他们为什么不再使用ArrayList

我可以坚持下去,但我会指出你的Hidden Features of VB.Net问题来解决这个咆哮。

答案 1 :(得分:18)

使用Option Strict启用开发的时间将为您节省大量的调试时间。

答案 2 :(得分:8)

Option Strict显然不能取代良好的单元测试 - 但是反过来也没有。虽然单元测试可以检测到与Option Strict相同的错误,但这意味着单元测试中没有错误,单元测试经常提前完成等等。

编写好的单元测试并不总是微不足道的,需要时间。但是,编译器已经实现了一些测试 - 以类型检查的形式。至少,这节省了时间。更可能的是,这节省了很多时间和金钱(至少偶尔),因为你的测试是错误的/没有涵盖所有情况/忘记考虑代码的变化。

总结一下,无法保证您的单元测试是正确的。另一方面,有一个强有力的保证,编译器执行的类型检查是正确的,或者至少是它的毛刺(未经检查的数组协方差,带有循环引用的错误......)是众所周知的并且有充分的文档记录。

另一个总结:是的,Option Strict On绝对是最佳做法。事实上,我已经在这样的在线社区工作了多年。每当有人需要帮助显然没有Option Strict启用的代码时,我们会礼貌地指出这一点并拒绝提供任何进一步的帮助,直到修复完毕。它节省了很多时间。通常,问题在此之后就消失了。这有点类似于在HTML支持论坛中寻求帮助时使用正确的HTML:无效的HTML可能有用,但话说再次,它可能不是问题的原因。因此,许多专业人士拒绝提供帮助。

答案 3 :(得分:5)

YES !!!!

在我看来,无论是作为开发人员还是作为大学导师,都是。

最好从一开始就养成良好的习惯,这使整个过程变得更加容易,而Option Strict是我认为需要的元素之一。

加入

有很多原因可以列举为什么,但关键是它是最佳实践,在教授新语言时,从一开始就教授这些最佳实践是关键。

答案 4 :(得分:4)

请记住,这里有两个级别。

选项明确 选项严格

两者的主要区别在于Option Strict禁用VB自动转换不同的数据类型。您必须明确使用CType或其他数据转换函数将变量分配给另一种类型。

我从1.0开始就使用VB,虽然我可以看到这一点,但我认为Strict在处理已实现或继承不同接口和类的对象时过于热心。

我首先会从Strict开始,如果它开始妨碍你,那么就下降到Explicit。但是,不要两个都关闭,这种方式是疯狂和过多的调试时间。

多年来使用VB我几乎都使用Double来表示所有浮点变量。这样可以避免许多舍入和精度损失的问题。在VB6中,我使用long,因为它是32位整数,但Integer在.NET中的工作方式与Int32相同。我还建议使用Int32,Int16等代替Integer,Long等,以防微软决定重新定义这些关键字。

答案 5 :(得分:3)

我不同意RS Conley(很不寻常)。我最喜欢的VB6大师 - Francesco Balena,Dan Appleman - 都不喜欢VB6的自动转换,并且是.NET中Option Strict inOption Strict。许多经验丰富的VB6程序员都知道自动转换为“邪恶类型强制”(favour),并且很高兴能够启用Option Strict

使用一个没有{{1}}的小模块有时会更好,以避免大量复杂的反射代码。但这是证明规则的例外。

答案 6 :(得分:2)

鉴于Boehm的观点,即在开发周期早期修复问题消耗的资源最少,我是每个工具的粉丝,可以帮助开发人员尽早“正确”。出于这个原因,我是IntelliSense之类的倡导者,既可以提高效率,也可以帮助您在周期的早期实现工作代码。 (工作,但必然正确。)

出于这个原因,我也支持使用Option Strict作为一种方法来帮助防止错误和随后的修正深入“设计时间”。

答案 7 :(得分:0)

如果您习惯于检查类型,那么您可能希望选项严格。关闭它可能有好处,但如果你的大脑没有调整到发现你的编译器通常会抱怨的错误,那么我会说让它保持开启。我已经在VB.Net中工作了很多,而且我不得不说,即使我在大多数时间都使用了严格禁用的选项,我已经看到很多情况下打开它会阻止很多错误。