某SNSの某コミュでの話

string.Emptyと文字列リテラル""について参照比較をした場合の挙動が、
.NET Framework 1.1と2.0で異なることについて。


MSDNを引っ掻き回してみると、
string.Internに.NET Framework 1.1と2.0では
インターンの仕様が変わったよと書いてある。


String.Intern(String) Method (System) | Microsoft Docs


で、実際にコードを書いて試してみた。

using System;

namespace EmptyStringIsInterned
{
	public class EmptyStringIsInterned
	{
		[STAThread]
		public static void Main( string[] args )
		{
			Console.WriteLine( null != string.IsInterned( string.Empty ) );
		}
	}
}

こいつから.NET Framework 1.1と2.0でそれぞれバイナリを作って試してみた結果

C:\>empty_string_interned.2.0.exe
False

C:\>empty_string_interned.1.1.exe
True

ということで結論

.NET Framework 1.1

Emptyはインターンプールに存在し、中身は文字列リテラル""のため
同一のインスタンスとなり参照比較の結果Trueが返る。

.NET Framework 2.0

Emptyはインターンプールに存在しないため
異なるインスタンスとなり、参照比較の結果Falseが返る。


ってことじゃないでせうか?