String.Empty为什么不是常量?是否有特定的原因?

4

可能是重复问题:
为什么String.Empty不是常量?

我想在一些属性的特性中使用string.Empty,但后来发现它实际上不是一个常量而是一个静态成员。

微软有没有做这样的决定有任何原因呢?


只需使用空字符串字面量:"" - Cody Gray
糟糕。没看到重复的内容,通常在编写时会出现。 - Dan
2个回答

5

我认为在引用程序集中使用const通常是一个非常糟糕的想法。

原因是C#编译器将常量视为值而不是引用,正如我在这个答案中所说。

我的意思是,C#编译器将替换您代码中所有常量的实例,并用值替换“变量”。

这意味着即使您更新了GlobalConstants.dll程序集并将其复制到其中一个应用程序中,您仍需要重新编译该应用程序。否则,该应用程序将使用旧的常量值。

为解决此问题,您可以简单地使用public static readonly而不是public const,因为readonly修饰符与const不同,它在代码中被C#编译器视为引用而不是值。


1
总是一个坏主意吗?你能想象出一个情况,例如“空字符串”或Math.PI会改变吗? - Jon Skeet
1
你太不厚道了,Skeet先生。再次阅读问题和我的答案,让我想知道我当时在想什么。我觉得我的回答应该留在我已经回答的另一个问题中,那里我认为它是有效的。对于这个问题,就不那么适用了。如果可以的话,我会给自己一个负分。 - Mikael Östberg

0
我认为原因是:字符串是引用类型,而不是值类型。当你使用静态成员比较两个引用时,比较速度更快,而当你使用const时比较两个字符串实例的速度则更慢。

不,这与此无关。 - Cody Gray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接