【问题标题】:Len() function vs String.Length property; which to choose?Len() 函数与 String.Length 属性;选择哪个?
【发布时间】:2019-01-12 05:32:08
【问题描述】:

我正在从 VB6 过渡到 VB.Net (VS 2010),并且对后者有基本的而不是广泛的理解。我显然有相当多的代码......我犹豫使用“升级”这个词,因为“端口”会更合适,因为过去版本的 VS 中的升级向导可能只是注释掉了代码并说“嘿嘿,为什么不从头开始呢?”

在我带来的一个过程中,Len() 函数用于确定字符串变量的长度。这在 VB.Net 中仍然有效(尽管我认为它实际上是对 Strings.Len 方法的调用),但另一种选择是只查询变量的 .Length 属性。

问题是使用哪个以及为什么。我浏览了相关的 MSDN 页面,他们似乎告诉我的只是方法/属性存在。没有提及性能问题,尤其是在可能涉及大量调用循环时。

那么,我的问题是,是否有人知道使用一种方法比另一种方法有任何经过测试和确认的好处,或者这仅仅是个人偏好的问题。尽管考虑到 Stack Overflow 指南,我对在进行过程中可能遇到的类似情况的任何指示也将不胜感激,这只是我有兴趣查看是否有特定答案的一个问题。

【问题讨论】:

  • 另见关于前 VB6 程序员的 VB.Net 运行时的讨论here

标签: vb.net string vb6-migration string-length


【解决方案1】:

因为您使用的是 VB.NET,所以您的 Strings 可以是 Nothing,除非您明确检查这一点,否则大多数 VB 方法(包括 Len)会将其视为与 String.Empty 相同,即 @987654325 @。

使用 Reflector,您可以看到 Len 被实现为空检查,为 Nothing 返回 0,否则返回 .Length,JITter 可能会内联调用。

所以,如果您正在使用其他 VB 方法,我建议您也使用 Len,除非您知道 String 不是 Nothing 或到处检查 Nothing

【讨论】:

  • 不知何故,我假设如果没有分配值,它们都会返回 0。这是我尚未开始以“作为对象的变量”术语思考的另一个方面。我想我可能仍然会选择 Andrew 和 Steve 建议的路线,以更接近更标准的 .Net 语法,但这是用零长度字符串初始化所有字符串变量的警钟。非常感谢。我希望能够给出一个以上的“答案”标记(尽管我已经投票了所有答案,因为它们都有帮助)但是为了帮助我避免那个特定的熊陷阱,我会把它给这个。
  • 恕我直言,检查Nothing 不足以成为使用Len 的理由,Len 是为了向后兼容 VB6 而提供的。我宁愿写一个包装器来检查Nothing并使用String.Length
  • @user961954 在该逻辑上,LeftMidRight 不应在新代码中使用,因为您可以使用自己的 .Length 等数值操作来提取 .SubStrings . 虽然我知道人们认为这是一条有效的路径,但我认为不使用该语言提供的内容是愚蠢的。
  • @MarkHurd 恕我直言,使用语言提供的所有东西并不总是明智的(例如 JS 中的 eval)。正如其他人所提到的,这些方法是为了向后兼容以及为习惯使用它们的开发人员而设计。如果它们有任何价值,它们也会出现在 C# 中。无论如何,如果它们的使用证明了您的智慧,请继续使用它们。
  • @user961954 如果 C# 试图复制 VB.NET,但它显然不是。在他们承认命名、可选参数有用之前需要版本(特别是对于我同意的遗留编码)。 C# 试图像 C-(和 Java-)一样。
【解决方案2】:

所以根据this

Len,另一个经典的 BASIC 函数,返回字符串的长度。 System.String 具有提供相同信息的 Length 属性。一个比另一个好?

在性能方面,这两个函数在 1000 次迭代中几乎没有差异。在这种情况下,似乎没有任何理由更喜欢其中一个,而且没有功能差异。我倾向于使用属性值而不是 VB 函数,因为它鼓励将 .NET 字符串视为对象。但是,归根结底,这实际上只是个人喜好。

如果您相信他们的话,那就是您的答案。否则,编写测试代码并进行迭代应该会给你最终的答案。

【讨论】:

  • 谢谢安迪。做一些测试的想法掠过我的脑海,但如果没有专业化,你永远无法确定测试结果是否特定于你正在使用的数据集。因此,我提出这个问题主要是想看看是否有人可以对“幕后”发生的事情有所了解。我在搜索中没有遇到那个网站;我认为非常有用。
【解决方案3】:

我不确定Len() 方法的细节(我选择的语言是C#),但我会说肯定会使用Length 属性。 LengthSystem.String 类的成员,而 Len() 不是。

我的猜测是 Len() 只是 Length 属性之上的一个 VB 垫片。从 VB 的角度来看,有人可能会认为使用 Len() 更符合习惯。我想我更喜欢使用类中内置的属性,而不是仅仅因为它是由语言提供的而使用不同的机制。

【讨论】:

  • 为什么要猜?马克赫德没有,他查了一下,发现 Len 在语义上与 Length 不同。见his answer
  • 谢谢安德鲁;我同意你的观点。我希望在我开始“思考 .Net”之前,我可能仍会使用一些“经典”VB 习语,但至少看起来这样做并没有真正的危害。 (除了经验丰富的 .Net 作家偶尔翻白眼。8^>)
【解决方案4】:

提供Len 方法是为了向后兼容旧的 VB6(和更早版本)非 .NET 代码。使用它在技术上没有任何问题。它会起作用,而且同样有效。但是,最好尽可能使用新的 .NET 做事方式。不过,除了让您更深入地了解“.NET 思维方式”之外,使用String.Length 的唯一真正切实好处是它可以更轻松地在未来将代码移植到其他 .NET 语言。

【讨论】:

    【解决方案5】:

    除了@Andrew 的帖子,Len() 是来自Visual Basic run-time library 的字符串函数,其中LengthSystem.String .net 框架API 类的属性。

    【讨论】:

      【解决方案6】:

      最近我遇到了使用 Len() 函数的旧 VB.Net 代码的问题。我将我的项目升级到引用旧的 VB.net dll 文件的 Core,它使用的是 Len() 函数。我遇到运行时兼容性错误 - 找不到方法:'Int32 Microsoft.VisualBasic.Strings.Len(System.String)'

      我必须更改 Core 已弃用的所有这些旧功能。所以我坚持使用 Steven Doggart 建议的 String.Length 而不是 Len()。

      【讨论】:

      • 您可以通过添加对Microsoft.VisualBasic 程序集的引用来解决此问题。但是,从 VB6 舒适功能转向更现代的 .NET 等效功能是值得的,因此我也推荐System.String.Length
      猜你喜欢
      • 1970-01-01
      • 2013-03-02
      • 2022-11-04
      • 2011-05-09
      • 1970-01-01
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多