方法判断字符串长度是否最有效!=0?我正在尝试加快速度:strings;//-->s永远不会为nullif(s.Length!=0){}问题是,看起来.Length实际上是在计算字符串中的字符,这比我需要的工作要多。有谁知道如何加快速度?或者,有没有办法确定s[0]是否存在,而不检查字符串的其余部分?编辑:既然您已经提供了更多上下文:优化代码变为:privatestaticreadonlychar[]Delimiters="".ToCharArray();privatestaticreadonlystring[]EmptyArray=newstring[0];publicstaticstring[]SplitOnMultiSpaces(stringtext){if(string.IsNullOrEmpty(text)){returnEmptyArray;}returntext.Split(Delimiters,StringSplitOptions.RemoveEmptyEntries);}String.Length绝对不计算字符串中的字母。该值存储为一个字段——尽管我似乎记得该字段的最高位用于记住是否所有字符都是ASCII(或用于启用其他优化)。所以属性访问可能需要做一个位掩码,但它仍然是O(1),我希望JIT也可以内联它。(它是作为外部实现的,但希望在这种情况下不会影响JIT——我怀疑这是一个足够常见的操作,可能会有对它的特殊支持。)如果你已经知道字符串不为空,那么你如果您正在寻找原始性能IMO,现有测试if(s.Length!=0)是最好的方法。对于大多数情况,我个人写道:if(s!="")为了更清楚,我们对长度不太感兴趣,因为它是否为空字符串。这会比长度测试稍微慢一些,但我相信它更干净。和以前一样,我会选择最干净的代码,直到您有基准/分析数据表明这确实是一个瓶颈。我知道你的问题明确是关于找到最有效的测试,但我想我还是会提到这个。你有证据表明这是一个瓶颈吗?编辑:只是为了更清楚地说明为什么我不建议使用string.IsNullOrEmpty:对该方法的调用向我表明调用者明确尝试处理变量为null的情况,否则他们不会提到它。如果此时在您的代码中,如果变量为null则被视为错误,那么您不应该尝试将其作为正常情况来处理。在这种情况下,长度检查实际上比我建议的不等式测试更好:它充当变量不为空的隐式断言。如果你有一个错误并且它是空的,测试将抛出一个异常并且错误将被及早发现。如果您使用相等性测试,它将null视为不同于空字符串,因此它进入“if”语句的主体。如果您使用string.IsNullOrEmpty,它将null视为空,因此它不会进入块。String.IsNullOrEmpty是检查null或零长度字符串的首选方法。在内部,它将使用长度。不应动态计算字符串的Length属性。如果您绝对确定该字符串永远不会为null,并且您强烈反对String.IsNullOrEmpty,我能想到的最有效的代码是:if(s.Length>0){//DoSomething}or,and可能更好:if(s!=""){//DoSomething}访问Length属性不应该计数-.NET字符串存储对象内部的计数。SSCLI/Rotor源代码包含一个有趣的注释,表明String.Length是(a)有效的和(b)神奇的://获取此字符串的长度/////这是一个EE实现的函数,因此JIT可以recognizeisspecially///并消除循环中字符获取的检查,例如:///for(intI=0;IthisisthefunctionString.IsNullOrEmpty–if(!String.IsNullOrEmpty(yourstring)){//your根据您在回答中描述的意图,为什么不在Split上尝试这个内置选项:s.Split(new[]{""},StringSplitOptions.RemoveEmptyEntries);一如既往的性能:基准测试。使用C#3.5或更早版本,你会想要测试yourString.LengthvsString.IsNullOrEmpty(yourString)使用C#4,执行以上两个操作并添加String.IsNullOrWhiteSpace(yourString)当然,如果你知道你的字符串永远不会为空,你可以尝试访问s[0]并处理不存在的异常。这通常不是好的做法,但它可能更接近您的需要(ifs应该始终具有非空值)。对于(inti=0;i0){}timer.Stop();System.Diagnostics.Debug.Write(String.Format("s.Length!=0{0}ticks",timer.ElapsedTicks));定时器.Reset();定时器。开始();如果(s==String.Empty){}timer.Stop();System.Diagnostics.Debug.WriteLine(String.Format("s==String.Empty{0}ticks",timer.ElapsedTicks));}使用秒表,s.length!=0needslessticksthens==String.Empty我只是使用String.Split(newchar[]{"},StringSplitOptions.RemoveEmptyEntries)在我修复代码之后它会为你做这一切。以上是C#学习教程:是最有效的判断字符串长度的方法!=0?分享的所有内容,如果对大家有用,需要了解更多C#学习教程,希望大家多多关注---这个文章收集自网络,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载,请注明出处:
