2

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

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

2 回答 2

7

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

ldstr "Test1"

这样做的影响是:任何经过的东西ldstr都会自动被实习,所以,你可以这样做:

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

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

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

于 2012-07-30T19:50:08.160 回答
5

它将实习字符串。

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

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

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

于 2012-07-30T19:49:59.343 回答