c# - 从 C# 迁移到 VB.Net

标签 c# vb.net

<分区>

因此,作为这场全局金融 Storm 的直接结果,我明天将开始一份 VB.net 开发人员的新工作。到目前为止,我一直在用 C# 进行开发(到处都是 java、vb6、sql、tibco 等)

所以问题是,需要注意哪些陷阱?有人对编写好的 vb.net 代码有什么好的建议吗?

(任何其他关于应对薪水/前景下降的建议都欢迎但不是必需的 ;-))


只是快速更新,公司看起来真的很好,当前的代码库似乎质量很高。我开始适应 VB 的做事方式(尽管我无法阻止自己到处添加分号!)。再次感谢大家的有益建议。

最佳答案

严格选项

在 VB 中要做的最重要的事情,以我(绝对不谦虚)的观点是使用 Option Strict On 在任何时候(除了,在每文件基础,当非严格类型有意义时,例如因为您使用 PIA 与 MS Office 互操作)并在 VS 选项中启用它。

Option Strict OnOption Explicit On 一起提供与 C# 大致相同的行为。关闭后,它会在编译时删除大量类型检查,并允许在完全不相关的类型之间进行虚假的、不必要的和难以调试的隐式转换。

Option Strict Off 在使用 COM API 时很有意义。 Option Explicit Off never 有意义。它很愚蠢(主要是为了与 VB6 兼容)。

比较:=Is

另一件需要注意的事情:平等与引用测试。在 C# 中,您对两者都使用 ==。在 VB 中,您有不同的运算符:

Dim StringA = "Hello"
Dim StringB = Console.ReadLine()
Dim EqualContent = StringA = StringB
Dim EqualRefs = StringA Is StringB

现在根据用户输入,EqualContent 可能是 TrueEqualRefs 将始终为 False。请注意,此处的 Is 在语义上等同于以下 C# 代码(通常没有人编写):

var equalRefs = object.ReferenceEquals(stringA, stringB);

我实际上认为这是 VB 相对于 C# 的优势,但很少需要。 Is 的反义词是 IsNot。这里要注意的另一件事是,通过 = 运算符进行的字符串比较实际上调用了 VB 运行时方法:Microsoft.VisualBasic.CompilerServices.Operators.CompareString

这考虑了其他几个设置,尤其是 Option Compare 设置,它可能是 Binary(默认,行为类似于 C#)或 Text(不区分大小写的比较)。

CTypeDirectCastTryCast

在其他一些情况下也会调用 VB 运行时,其中一个值得注意的是 CType,它是 VB 中的通用转换运算符。我倾向于避免使用运算符,我强烈建议任何人都这样做,以支持其他更明确的转换。这样做的原因是 CType 在应用时会尝试几种语义上非常不同的转换。这使得很难跟踪代码中到底发生了什么,可能会引入输入错误。

一方面,CType 允许将字符串解析为数字。这是一个通过 NumberType.Parse 操作更好地表达的概念,就像在 C# 中一样。

我建议使用 DirectCast,而不是 CType,它相当于 C# 的转换,或者 TryCast,它与 C# 的相同作为转换。

另一个陷阱。当检查对象 x 是否具有特定类型 T 时,必须使用以下语法:

If TypeOf x Is T Then …

请注意,这不会调用正常的引用比较运算符 Is。相反,它使用自己的运算符构造 TypeOf … Is …。不过,您不能TypeOf … IsNot …。这可能是规范中的错误。

杂项。 ...

还有很多差异,一些有用(例如 Select Case 语句中的差异)和一些较少(例如用于基本通配符匹配的 Like 运算符……只是请改用正则表达式)。

其他一些与此相关的问题:

关于c# - 从 C# 迁移到 VB.Net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/623747/

相关文章:

c# - 从 lambda 表达式获取自定义属性

asp.net - 通过 .ashx 从数据库返回调整大小的图像

vb.net - 函数中的递归值

vb.net - Mono VB .Net 应用程序,缺少 System.Collections.Generic Mac OS X

javascript - 当用户检查 `Other` 按钮时使文本框可见

asp.net - 使用 system.data.oracleclient 构建良好的搜索查询

c# - 具有多态对象集合的复杂模型的自定义模型绑定(bind)器

c# - 如何在C#中写保护USB驱动器

c# - 在布局页面的部分 View 中显示博客类别

c# - 如何在 ASP.Net 中确定上传图像的颜色模式