我来自C#背景,但我现在主要使用VB.Net。在我看来,上述功能(以及其他功能 - 例如UCase,LCase)等是VB6及之前的结转。这些功能的使用是否在VB.Net中不受欢迎,还是纯粹归结为个人偏好?
我个人的偏好是远离他们,但我想知道这是否只是我的C#偏见。
我遇到了一些问题 - 特别是从VB6转换为VB.Net的代码,其中集合的0索引意味着错误已经被引入代码中,因此我对它们持谨慎态度。
答案 0 :(得分:6)
这些函数首先出现的原因当然是它们是VB语言的一部分,继承自VB 6。
但是,它们不仅仅是框架中方法的包装器,它们中的一些还有一些额外的逻辑,使它们在某些方面有所不同。例如Mid
函数允许您指定字符串之外的范围,它将以静默方式减小范围并返回剩余字符串的一部分。如果指定字符串之外的范围,则String.Substring
方法会抛出异常。
因此,函数不仅仅是包装器,它们代表了一种不同的编程方法,它更符合Visual Basic,您可以在函数中抛出任何东西,几乎总能得到一些东西。在某些方面更容易,因为您不必考虑所有特殊情况,但另一方面,当您向函数提供不合理的东西时,您可能希望获得异常而不是获得结果。在调试时,如果您尽早获得异常而不是尝试追溯错误值的来源,通常会更容易。
答案 1 :(得分:1)
这些选项是为了向后兼容。
但是,人们使用框架类/方法来确保一致性会更好 话虽如此,VB6的功能很容易理解。因此,对于具有VB背景的人来说,这不应该是一个问题。
编辑:此外,框架类可用的一些重载可能不等同于简单的VB6类声明。我现在不记得了 - 但是我认为这可能是使用框架类/方法的更好理由。
答案 2 :(得分:1)
会有特殊情况,但是,请放下,使用VB6版本,除非你关心字符串是“”和“无”之间的区别。
我正在开发一个大型项目,其中不同的程序员使用两种方式,人们使用'MyString.SubString(1)'的代码正在爆炸,而'Mid(MyString,2)'正在运行。
此示例的两个主要错误:(以各种方式适用于其他人) (1)字符串可以是空的,你必须在运行方法之前检查它。 OO表示法的限制:如果对象什么都没有,你就不能调用成员方法,即使你想要“没有”或(空对象)。即使通过对字符串使用nullable / stub对象(你可以使用“”或string.empty)来解决这个问题,你仍然必须确保它们被正确初始化 - 或者,如我们的情况那样 - 转换Nothing当从我们无法控制的库调用中接收字符串时“到”。
你将拥有Nothing的字符串。 90%的时间你都希望它意味着“”。使用.SubString,你总是要检查什么。对于VB版本,只有10%你会关心它。
(2)特别是对于Mid示例,再次,90%的时间如果你想要2个char字符串的3-10个字符,你会希望看到“”返回,而不是让它抛出一个execption!事实上,你很少需要一个execption:你必须首先检查适当的长度并编码它应该如何表现(通常有一个定义的行为,至少,一个数据输入错误,你不要不想抛出异常。
因此,您使用.Net版本100%检查,而很少使用VB版本检查。
.Net希望将一切都放在面向对象的哲学中。但字符串与微妙使用的大多数对象略有不同。 MS-Basic在编写函数时没有考虑到这一点,它很幸运 - 函数的一个优点是它们可以处理空对象。
对于我们的项目,人们可能会首先询问“没有”字符串如何进入我们的流程。但最终,一些程序员决定使用.Net功能意味着可以避免服务调用,紧急错误修复和补丁。省去麻烦。
答案 3 :(得分:0)
我会避免他们。既然你已经提到它们,听起来好像你继承了一些可能转换为VB.NET项目的VB6代码。否则,如果它是一个新的VB.NET项目,我认为使用VB6方法没有价值。
我一直在进行一些VB6到VB.NET的转换项目。虽然我熟悉基于0的索引的名称和差异,但我遇到的任何代码都被重构为使用它们的.NET等价物。这部分是为了保持一致性,并让该项目的VB6程序员熟悉该框架。但是,我在重构中发现的另一个好处是能够将方法调用链接在一起。
请考虑以下事项:
Dim input As String = "hello world"
Dim result As String = input.ToUpper() ' .NET
Dim result As String = UCase(input) ' VB6
接下来你知道,我需要做更多工作来满足其他要求。假设我需要获取子字符串并获取“hello”,这会导致代码更新为:
Dim result As String = input.ToUpper().Substring(0, 5) ' .NET
Dim result As String = Mid(UCase(input), 1, 5) ' VB6
哪个更清晰,更容易修改?在.NET中我只是链接它。在VB6中,我必须从方法的开头开始,然后转到它的末尾并添加右括号。如果它再次改变或我需要删除它,在.NET中我只是砍掉了结束,但在VB6中我需要回溯到开始和结束。
我认为使用.NET方法很有价值,因为以后加入该项目的其他.NET开发人员,特别是那些来自C#背景的开发人员,可以轻松搞定。