是否执行以下代码每次调用方法并将其计算为true时,都会创建3个新字符串,或者编译足够聪明以将右侧字符串编译为常量?在平等测试中使用字符串文字是否创建新字符串?
if (somestring == "Test" || someString == "Test1")
{
...
NotifyPropertyChanged("Name");
}
是否执行以下代码每次调用方法并将其计算为true时,都会创建3个新字符串,或者编译足够聪明以将右侧字符串编译为常量?在平等测试中使用字符串文字是否创建新字符串?
if (somestring == "Test" || someString == "Test1")
{
...
NotifyPropertyChanged("Name");
}
它们是文字,这意味着它们都装载有ldstr
操作码,即
ldstr "Test1"
这样做的影响是:任何通过0123去是自动扣留,所以,你可以这样做:
string x = "abc";
string y = "abc";
bool sameInstance = ReferenceEquals(x,y); // true
所以:是的,第一次使用该方法中,文字,"Test1"
和"Name"
可以被创建,但只有一次。之后,使用相同的现有字符串实例。这是通过ldstr
保证:
公共语言基础结构(CLI)保证两个ldstr指令指的是具有相同的字符序列的两个元数据标记的结果返回精确地相同的字符串对象(被称为处理“串入”)。
我永远不知道这个机制,整洁。 – asawyer 2012-07-30 19:58:51
它会实习字符串。
公共语言运行库通过维护 表节省字符串存储,叫实习生池,包含要 一个参考声明或 程序编程创建的每一个独特的文本字符串。因此,文字串与 特定值的一个实例只存在一次在系统中
http://msdn.microsoft.com/en-us/library/system.string.intern.aspx
http://broadcast.oreilly.com/2010/08/understanding-c-stringintern-m.html
'把右手边的字符串编译成常量'好吧,我希望看到他们*是*常量。 – asawyer 2012-07-30 19:48:59