我正在准备一门关于 Visual Basic 2005 的课程,目标对象是迁移到 .NET 平台的 Visual Basic 6 程序员。

我想听听关于是否建议他们始终启用的建议 选项严格 或不。

我只使用 C 风格的编程语言,主要是 Java 和 C#,所以对我来说 显式转换 这是我一直期望我必须做的事情,因为它从来都不是一个选择。
然而,我认识到使用内置支持的语言的价值 后期绑定, ,因为不必对代码中的类型过于明确确实可以节省时间。这一点从广为人知的传播中得到了进一步证明。 动态类型语言, ,甚至在具有动态语言运行时的 .NET 平台上。

考虑到这一点,是否应该鼓励首次使用 VB.NET 接触 .NET 并具有 VB6 背景的人进入这样的心态: 必须进行编译时类型检查 因为这是 CLR 中的“最佳实践”?或者继续享受后期绑定的好处“可以”吗?

有帮助吗?

解决方案

是的!Option Strict 绝对是 .Net 的最佳实践。强调 .Net 的核心是一个强类型平台,直到 DLR 得到更全面的支持为止。除极少数例外,每个 DimFunction 应该有一个明确的类型声明来配合它。像 LINQ 或 Boo 和 JScript 这样的东西是证明规则的例外。

这里还有一些需要指出的事情。我相信您很清楚这一切,但我不得不使用和维护许多由前 VB6ers 编写的 VB.Net 代码,因此这对我来说是一个痛处:

  • 不要使用旧的字符串函数: LEN(), REPLACE(), TRIM(), , ETC
  • 不再推荐匈牙利疣。 oMyObjectsMyString 不洁食。向他们展示参考文献 微软的设计指南 如果他们不相信你。
  • 确保他们了解新内容 AndAlso/OrElse 逻辑运算符
  • 参数化查询和现代 ADO.Net。这一点怎么强调都不过分。他们永远不需要打电话 CreateObject() 再次。
  • .Net 中的作用域与 VB6 中的作用域不同(并且更重要)。VB.Net 仍然具有模块,但它们现在更类似于静态类。了解在真实的面向对象环境中进行开发与 VB6 提供的部分 OOP 支持有何不同非常重要。没有充分的理由允许方法运行到不合常理的程度。
  • 确保他们了解泛型和接口(包括 IEnumeralbe(Of T)),并了解为什么他们永远不应该使用 ArrayList 再次。

我可以继续,但我只会向你指出 VB.Net 的隐藏功能 结束这个咆哮的问题。

其他提示

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

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

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

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

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

YES !!!!

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

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

加入

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

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

选项明确 选项严格

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

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

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

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

我将不同意 RS Conley (非常不寻常)。我最喜欢的VB6大师 - Francesco Balena,Dan Appleman - 都不喜欢VB6的自动转换,并且 in 赞成 .NET中的 Option Strict 。许多有经验的VB6程序员都知道自动转换为“邪恶类型强制”。 ( pdf ),并将很高兴打开 Option Strict

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top