在相等性测试中使用字符串文字是否会创建新字符串?

时间:2012-07-30 19:47:25

标签: c# .net

以下代码在每次调用方法并计算为true时编译3个新字符串,或者编译是否足够聪明以将右侧字符串编译为常量?

if (somestring == "Test" || someString == "Test1")
{
   ...
   NotifyPropertyChanged("Name");
}

2 个答案:

答案 0 :(得分:7)

它们是文字,这意味着它们加载了ldstr操作码,即

ldstr "Test1"

这样做的影响是:经过ldstr的任何内容都自动实习,因此,您可以这样做:

string x = "abc";
string y = "abc";
bool sameInstance = ReferenceEquals(x,y); // true

所以:是的,第一次使用该方法时,可以创建文字"Test""Test1""Name",但只能创建一次。之后,使用相同的现有字符串实例。这由ldstr保证:

  

公共语言基础结构(CLI)保证引用具有相同字符序列的两个元数据标记的两个ldstr指令的结果精确地返回相同的字符串对象(称为“字符串实习”的过程)。

答案 1 :(得分:5)

它会实现字符串。

  

公共语言运行库通过维护a来保存字符串存储   表,称为实习池,包含单个引用   以编程方式声明或创建的每个唯一文字字符串   你的计划。因此,带有一个文字字符串的实例   特殊值仅在系统中存在一次

http://msdn.microsoft.com/en-us/library/system.string.intern.aspx

http://broadcast.oreilly.com/2010/08/understanding-c-stringintern-m.html