String.Empty
和""
有什么区别?它们是否可以互换使用,或者在相等性方面是否存在基础引用或本地化问题,String.Empty
可以确保这些问题不会成为问题?String.Empty
和""
有什么区别?它们是否可以互换使用,或者在相等性方面是否存在基础引用或本地化问题,String.Empty
可以确保这些问题不会成为问题?string.IsNullOrEmpty( stringVar )
。 - Flynn1179什么是 String.Empty 和 "" 的区别,它们是否可以互换使用?
string.Empty
是一个只读字段,而""
是一个编译时常量。它们的行为不同的情况有:
C# 4.0或更高版本中的默认参数值
void SomeMethod(int ID, string value = string.Empty)
// Error: Default parameter value for 'value' must be a compile-time constant
{
//... implementation
}
在 switch 语句中使用 case 表达式
string str = "";
switch(str)
{
case string.Empty: // Error: A constant value is expected.
break;
case "":
break;
}
属性参数
[Example(String.Empty)]
// Error: An attribute argument must be a constant expression, typeof expression
// or array creation expression of an attribute parameter type
String.Empty
作为参数传递。您是正确的,所有示例都表明“您无法将(运行时)“值”放入(编译时)元数据”,这就是示例的目的所在。 - Sasuke Uchihastring.Empty
是只读字段会很有趣。它似乎是编译时常量的完美位置。毕竟,string.Empty
永远不需要在运行时计算,对吧? - ClonkexString.Empty
是一个只读字段,而""
是一个常量。这意味着你不能在switch语句中使用String.Empty
,因为它不是一个常量。
default
关键字的出现,我们可以提高可读性,避免意外修改,并拥有编译时常量。不过,说实话,我仍然认为 String.Empty 比 default 更易读,只是打字速度较慢。 - EnzoaeneasString.Empty
而不是""
,原因很简单,但并不明显:""
和""
并不相同,前者实际上有16个零宽字符。显然,没有一个称职的开发人员会在他们的代码中放置任何零宽字符,但如果这样做了,它可能会成为维护的噩梦。我在此示例中使用了U+FEFF。
不确定SO是否会吞噬这些字符,但您可以尝试使用众多零宽字符之一。
我之所以知道这一点,只是因为https://codegolf.stackexchange.com/
另一个区别是String.Empty会生成更大的CIL代码。虽然引用""和String.Empty的代码长度相同,但编译器不会对使用String.Empty作为参数进行字符串连接进行优化(请参见Eric Lippert的博客文章)。以下是等效函数。
string foo()
{
return "foo" + "";
}
string bar()
{
return "bar" + string.Empty;
}
生成这个IL
.method private hidebysig instance string foo() cil managed
{
.maxstack 8
L_0000: ldstr "foo"
L_0005: ret
}
.method private hidebysig instance string bar() cil managed
{
.maxstack 8
L_0000: ldstr "bar"
L_0005: ldsfld string [mscorlib]System.String::Empty
L_000a: call string [mscorlib]System.String::Concat(string, string)
L_000f: ret
}
"bar " + (ok ? "" : "error")
的意思是,如果 ok
为真,则返回空字符串,否则返回字符串 "error"
,并将其连接到字符串 "bar "
上。 - symbiont上述答案在技术上是正确的,但为了获得最佳的代码可读性和最小的异常几率,您可能希望使用String.IsNullOrEmpty(s)
--foo=$BAR
调用您的应用程序,则可能希望区分他们是否忘记设置环境变量以及他们根本没有传递标志。string.IsNullOrEmpty
通常是代码异味,表明您没有正确验证输入或正在进行奇怪的操作。当您真正想使用null
或类似的Maybe / Option类型时,不应该通常接受空字符串。 - Alastair Maw所有的""实例都是相同的,即内部化的字符串字面量(或者它们应该是)。因此,每次使用""时,您实际上不会在堆上抛出一个新对象,而只是创建对同一内部化对象的引用。话虽如此,我更喜欢string.Empty。我觉得这可以使代码更易读。
String.Empty
而不是""
,这与速度有关,而非内存使用,是一个很好的技巧。由于""
是一个字面量,因此它将作为字面值:在第一次使用时创建,并返回其引用。无论我们使用多少次,只会在内存中存储一个""
实例!我没有看到任何内存惩罚。问题在于每次使用""
时,都会执行比较循环以检查""
是否已经在内部池中。另一方面,String.Empty
是对存储在.NET Framework内存区域中的""
的引用。对于VB.NET和C#应用程序,String.Empty
指向同一内存地址。因此,在需要""
时为什么要每次搜索引用,当你可以在String.Empty
中拥有该引用呢?String.Empty
vs ""
""
识别为与 string.Empty
相同,并因此能够立即发出正确的引用。 - StewartString.Empty不会创建对象,而""会创建对象。然而,如此处所指出的那样,这种区别微不足道。
String.IsNullOrEmpty
将变量设置为空字符串,或将空字符串作为函数参数传递? - Stewart
string.Empty
,并且为什么将其声明为readonly
而不是const
,背后的原因是什么。 - user1451111