C# 为什么建议检查字符串长度以确定空值?

C# 为什么建议检查字符串长度以确定空值?,c#,C#,通常,人们说最好说s.Length==0而不是s==”。但这似乎是一个微观优化,也会使它更难阅读。此外,前者的1000万次与后者相比最多可节省60毫秒 是否有我遗漏的原因,例如,如果s.Length==0实际上更好地传达了意图?还是经常需要比较多个字符串以获得空值 编辑:我知道IsNullOrEmpty,但是当人们回答这个问题时,他们经常提到长度检查比比较空字符串要好 EDIT2:不是问最好的方法是什么,这对两种情况都是无效的,但我想问的是,为什么不可忽视的少数人坚持认为长度检查更优越。我假设他

通常,人们说最好说
s.Length==0
而不是
s==”
。但这似乎是一个微观优化,也会使它更难阅读。此外,前者的1000万次与后者相比最多可节省60毫秒

是否有我遗漏的原因,例如,如果
s.Length==0
实际上更好地传达了意图?还是经常需要比较多个字符串以获得空值

编辑:我知道IsNullOrEmpty,但是当人们回答这个问题时,他们经常提到长度检查比比较空字符串要好

EDIT2:不是问最好的方法是什么,这对两种情况都是无效的,但我想问的是,为什么不可忽视的少数人坚持认为长度检查更优越。我假设他们有一些很好的理由这么说,并且想知道他们是什么


编辑3:正如一开始所说的,我知道一个比另一个快。问题是,这就是人们推荐它的原因吗?一些计时显示,这并没有导致显著的差异。

原因是,通过执行
s==”
您正在执行一个比另一种方式慢的字符串比较(
s.Length==0

您是对的,这本质上是一个微观优化。尽管如此,测试长度确实可以让FxCop/代码分析保持安静——理由是性能

至于哪个更具可读性,这是主观的,我相信任何开发人员都会理解。因为它们在语义上是不同的(<代码> s长度=0 如果S是空的,则抛出,而<代码> s= =”“/<代码>”,可读性不是唯一考虑的标准。


如果您不确定字符串是否为空,
string.IsNullOrEmpty
string.IsNullOrWhiteSpace
可能更具可读性(即表达您的意图)。

在我的大多数代码中,使用
string.IsNullOrEmpty()
string.IsNullOrWhiteSpace()
(在.NET 4中)更容易阅读,并且更具体地做我真正需要做的事情。

s==string.Empty是s.length==0的替代品


我猜测为什么不建议使用s==“”是因为“”会在堆上创建一个不可变的字符串。只是为了比较,您可能不想创建字符串对象。无论如何,可能有人会验证我的状态。

字符串值分隔比数值分隔慢


我会在您的情况下使用。

并非所有的点网络字符串都是在运行时使用的 这意味着在这些情况下,s.Length==0会更快 因为它避免了实际的字符串比较,如果两个字符串中的一个未被插入,则会产生这种比较

我宁愿使用
string.IsNullOrEmpty()
以防在出现空引用异常时出错。。。(不小心吞没了我的评论)谁说“推荐”?它实际上是建议使用的IsNullOrEmpty/IsNullOrWhitespace。网线知道它们的长度;这是先检查的如果两次检查的JIT代码不一样,我会非常震惊。看起来JIT代码至少应该有所不同,因为第一个将返回false,第二个将在空字符串的情况下引发异常。我的印象是代码中几乎所有空字符串都共享同一个实例。“”是一个不可变的字符串文本。您可以看到(“”)将具有字符串变量可以保存的所有属性。这就是我写这篇文章的原因,你正在创建一个字符串对象来进行比较。我明白了,但似乎所有的(“”)都会通过interning()Hmmm引用同一个字符串。这对我来说是个新闻。谢谢。我还没有检查官方的csc,但是Mono的编译器(dmcs)实际上是
ldsfld string[mscorlib]系统。string::Empty
之前
调用bool string::op_Equality(string,string)
,即使源代码中使用了
。因此,不会创建不需要的字符串实例。