我正在从VB6过渡到VB.Net(VS 2010),并对后者有一个基本而非广泛的了解。我显然有很多代码可以......我很犹豫地使用"升级"一词,因为"端口"更合适,因为以前版本的VS的升级向导也可能已经注释掉了代码并说""嘿,你为什么不从头开始?"
在我遇到的Len()函数中,使用了一个过程来确定字符串变量的长度。这在VB.Net中仍然有效(尽管我认为它实际上是对Strings.Len方法的调用),但是另一种选择是只查询变量的.Length属性。
问题是使用哪个以及为什么使用。我浏览了相关的MSDN页面,他们似乎只告诉我方法/属性存在。没有任何有关性能问题的信息,特别是当涉及大量呼叫的循环时。
那么,我的问题是,是否有人知道使用一种方法优于另一种方法的任何经过测试和确认的好处,还是仅仅是个人喜好问题。尽管在给出堆栈溢出指导原则的同时,我很想看看是否有针对该问题的具体答案,但我在进展过程中遇到的任何类似情况的指针也将不胜感激。
-
另请参阅此处有关前VB6程序员关于VB.Net运行时的讨论
因为您使用的是VB.NET,所以您的Strings可以是Nothing,除非您明确进行检查,否则大多数VB方法(包括Len)都将其与String.Empty相同,即""。
使用Reflector,您可以看到Len被实现为空检查,为Nothing返回0,否则返回.Length,JITter可能会内联该调用。
因此,如果您使用其他VB方法,我建议您也使用Len,除非您知道String不是Nothing或在各处检查Nothing。
-
+1可以让您真正了解VB!
-
如果没有分配值,则以某种方式Id假定它们都返回0。这是我尚未开始以"变量作为对象"的方式思考的另一方面。我想我还是可以选择安德鲁和史蒂夫建议的路线,以更接近标准的.Net语法,但这是一个唤醒调用,用于初始化所有零长度字符串的字符串变量。非常感谢。我很想能够给出多个"答案"标记(尽管Ive投票赞成了所有答案,因为它们都对它有帮助),但是为了帮助我避免那个特别的陷阱,Ill会给这个答案。
-
IMHO检查Nothing的原因不足以使用Len,而提供Len是为了向后兼容VB6。我宁愿写一个包装来检查Nothing并使用String.Length
-
@ user961954关于该逻辑Left,Mid和Right不应在新代码中使用,因为您可以使用自己对.Length的数值操作来提取.SubString,尽管我知道人们建议有效路径,我认为不使用语言提供的内容只是愚蠢的做法。
-
@MarkHurd恕我直言,使用一种语言提供的所有内容并不总是明智的(例如JS中的eval)。就像其他人提到的那样,这些方法是为了向后兼容以及对于习惯于使用它们的开发人员。如果它们具有任何值,它们也将在C#中使用。无论如何,如果使用它们可以证明您的智慧,请继续使用它们。
-
@ user961954那是如果C#试图复制VB.NET,但它显然没有。在他们承认命名之前,花了很多版本,可选参数才有用(特别是我同意的传统编码)。 C#试图成为C-(和Java-)。
所以根据这个:
Len, another classic BASIC function, returns the length of a string. System.String has the Length property that provides the same information. Is one better than the other?
Performance-wise, these two functions show little difference over 1000’s of iterations. There doesn’t appear to be any reason to prefer one over the other in this case plus there is no functional difference. I’m kind of partial to using the property value rather than the VB function since it encourages thinking of .NET strings as objects. However, at the core, it’s really only a personal preference thing.
如果您相信他们的话,那么您就会找到答案。否则,编写一个测试并进行迭代应该会给您最终的答案。
-
谢谢安迪。进行一些测试的想法让我大吃一惊,但是如果不做这些工作,您将永远无法确定测试结果是否特定于您使用的数据集。因此,我提出这个问题主要是看是否有人可以对"幕后"发生的事情有所了解。我没有在搜索中找到该网站;我认为非常有用。
我不确定Len()方法的细节(我选择的语言是C#),但是我肯定会说Length属性。 Length是System.String类的成员,而Len()不是。
我的猜测是Len()只是Length属性之上的VB填充。从VB的角度来看,可能有人认为使用Len()更惯用。我想我更喜欢使用内置在类中的属性,而不是仅仅因为语言提供它而使用其他机制。
-
为什么要猜?马克·赫德(Mark Hurd)没有,他调查了一下,发现莱恩(Len)在语义上与《长度》不同。看到他的答案。
-
谢谢安德鲁;我明白你的意思。我希望在我开始"思考.Net"之前,病态可能仍会使用一些"经典" VB习惯用法,但至少看来这样做并没有真正的危害。 (除了偶尔有经验丰富的.Net作家的眼球。8 ^>)
提供Len方法是为了与旧的VB6(及更早版本)非.NET代码向后兼容。使用它在技术上没有任何错误。它将工作,并且同样如此。但是,最好尽可能使用新的.NET做事方式。但是,除了让您更深入地了解" .NET思维方式"之外,使用String.Length的唯一真正的好处是,将来可以更轻松地将代码移植到其他.NET语言。
除了@Andrew的帖子外,Len()是Visual Basic运行时库中的字符串函数,其中Length是.net Framework API的System.String类的属性。
最近,我遇到了使用Len()函数的旧VB.Net代码的问题。我将项目升级到Core,后者引用了旧的VB.net dll文件,并且使用Len()函数。我遇到运行时兼容性错误-找不到方法:'Int32 Microsoft.VisualBasic.Strings.Len(System.String)'
我必须更改Core不推荐使用的所有旧功能。因此,我支持Steven Doggart建议在Len()上使用String.Length。