为什么 String.Empty 不是常量?
在 .NET 中,为什么 String.Empty
是只读的而不是常量? 我只是想知道是否有人知道这个决定背后的原因是什么。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
在 .NET 中,为什么 String.Empty
是只读的而不是常量? 我只是想知道是否有人知道这个决定背后的原因是什么。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(4)
使用
static readonly
而不是const
的原因是与非托管代码一起使用,如 Microsoft 在 共享源公共语言基础结构 2.0 版本。 要查看的文件是 sscli20\clr\src\bcl\system\string.cs。我从CodeProject 上这篇方便的文章中找到了此信息。
The reason that
static readonly
is used instead ofconst
is due to use with unmanaged code, as indicated by Microsoft here in the Shared Source Common Language Infrastructure 2.0 Release. The file to look at issscli20\clr\src\bcl\system\string.cs
.I found this information from this handy article at CodeProject.
我认为这里有很多混乱和糟糕的反应。
首先,
const
字段是静态
成员(不是实例成员)。请查看 C# 语言规范的第 10.4 节常量。
如果
public const
成员是静态的,就不能认为常量会创建一个新对象。鉴于此,以下代码行在创建新对象方面完全相同执行相同的操作。
以下是 Microsoft 的注释,解释了两者之间的区别:
所以我发现这里唯一合理的答案是杰夫·耶茨的。
I think there is a lot of confusion and bad responses here.
First of all,
const
fields arestatic
members (not instance members).Check section 10.4 Constants of the C# language specification.
If
public const
members are static, one could not consider that a constant will create a new Object.Given this, the following lines of code do exactly the same thing in respect to the creation of a new Object.
Here is a note from Microsoft that explains the difference between the 2:
So I find that the only plausible answer here is Jeff Yates's.
如果您设置任何字符串常量,那么编译器将在您调用它的任何地方替换为实际字符串,并且在代码运行时用相同的字符串填充您的代码还需要一次又一次地从不同的内存数据中读取该字符串。
如果您将字符串保留在一处只读,因为它是 String.Empty,则程序仅将相同的字符串保留在一处并读取它,或引用它 - 将内存中的数据保持最少。
另外,如果您使用 String.Empty 作为 const 来编译任何 dll,并且由于任何原因 String.Empty 发生更改,那么编译后的 dll 将不再以相同的方式工作,因为
cost
使内部代码在每次调用时实际保留字符串的副本。例如,请参阅此代码:
将由编译器生成为:
和程序集调用
编辑:更正的拼写错误
If you make any string constant, then the compiler is replace with the actually string everywhere you call it and you fill your code with the same string all over and when the code runs is also need to read again and again that string from the different memory data.
If you leave your string read only on one place as it is the
String.Empty
, the program keep the same string only on one place and read it, or refer to it - keeping the data in memory minimum.Also if you compile any dll using the String.Empty as const, and for any reason the String.Empty change, then the compiled dll will not work any more the same, because the
cost
make the inside code to actually keep a copy of the string on every call.See this code for example:
will be come by the compiler as:
and the assembly call
Edit: Corrected typo
这个答案的存在是为了历史目的。
原来:
因为
String
是一个类,因此不能是常量。扩展讨论:
在审核这个答案的过程中敲定了很多有用的对话,而不是删除它,而是直接转载了这个内容:
This answer exists for historical purposes.
Originally:
Because
String
is a class and therefore cannot be a constant.Extended Discussion:
A lot of useful dialog was hammered out in vetting this answer, and rather than deleting it, this content is reproduced directly: