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

mik*_*010 2 .net c#

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

if (somestring == "Test" || someString == "Test1")
{
   ...
   NotifyPropertyChanged("Name");
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 7

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

ldstr "Test1"
Run Code Online (Sandbox Code Playgroud)

这样做的影响是:任何通过云ldstr自动扣留,那么,你可以这样做:

string x = "abc";
string y = "abc";
bool sameInstance = ReferenceEquals(x,y); // true
Run Code Online (Sandbox Code Playgroud)

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

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


asa*_*yer 5

它将实习字符串.

公共语言运行库通过维护一个名为intern pool的表来保存字符串存储,该表包含对在程序中以编程方式声明或创建的每个唯一文字字符串的单个引用.因此,具有特定值的文字字符串实例仅在系统中存在一次

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

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