在 C# 中,大多数情况下 "" 和 string.Empty 可以互换使用。比如:
strings="";
strings2=string.Empty;


if(s==string.Empty)
{
//
}
但是我发现有一种情况下只能是用常数形式: "", 而不能使用 string.Empty 这个静态变量。就是在标签(Attribute) 的构造器里面:
这个代码是正确的:
[Default("")]

publicstringName
{

get
{returnname;}

set
{name=value;}
}
这个是错误的,无法通过编译:
[Default(string.Empty)]

publicstringName
{

get
{returnname;}

set
{name=value;}
}









但是我发现有一种情况下只能是用常数形式: "", 而不能使用 string.Empty 这个静态变量。就是在标签(Attribute) 的构造器里面:
这个代码是正确的:











这个是错误的,无法通过编译:











错误信息是:
error CS0182: 属性参数必须是常数表达式、typeof 表达式或数组创建表达式
其他地方我并未发现类似的例子。
顺便提一下,判定为空字符串的几种写法,按照性能从高到低的顺序是:
s.Length == 0 优于 s == string.Empty 优于 s == ""
//************************************************************************
之所以不能使用 [Default(String.Empty)] 而必须使用 [Default("")],那是由两个方面的因素决定的:
1. 特性(Attribute)是在编译器实例化并用自身的数据来扩展目标对象的元数据,这就要求你传递给它的参数必须在编译器是“可知”的;
2. String.Empty 是一个静态只读字段(static readonly field),这种字段和常量字段很象,不同的是只读字段(不管是否静态的)都可以把自身的初始化推迟到运行时。
鉴于以上两个方面存在矛盾的可能性,编译器只好禁止我们使用 [Default(String.Empty)] ,以防意外。