Expressionツリーはimmutableなので、なぜコンパイラは文字列リテラルのような静的な表現に対して同じオブジェクト参照を使用しませんでしたか?質問を明確にするコンパイラが静的な式ツリーに対して同じオブジェクト参照を使用しなかったのはなぜですか?
例を参照してください:私は式の木を知っているよう
static void Main(string[] args)
{
Test(p => true);//2637164
Test(p => true);//3888474
Test("true");//-292522067
Test("true");//-292522067
Console.ReadKey();
}
public static void Test(Expression<Func<string,bool>> exp)
{
Console.WriteLine(exp.GetHashCode());
}
public static void Test(string str)
{
Console.WriteLine(str.GetHashCode());
}
重複した式を検出するより重複した文字列値を検出する方が簡単です。それを超えて、「なぜコンパイラはXをしないのですか?一般にスタックオーバーフローには役立ちません。それは_practical_programming_problem_ではなく、あなたが得る可能性のある唯一の答えは、推測になるだろう。いくつかの奇跡によって、コンパイラのその機能の作者が答えた場合、答えは、コンパイラにない他のすべての機能についても、ほぼ確実に同じことになるでしょう: "利益はコストを正当化するものではありません。 –
@PeterDuniho:まあ、それは奇跡ではありません。それは私の特徴の一つでした。仕様によれば、コンパイラは許可されていますが、同一のラムダ参照を同じにする必要はありません。あなたが推測したように、その機能にはコストがかかり、コンパイラチームは、(1)決して起こらない状況に対して「最適化」を書くよりも良いことがあります。(2)開発者が望むならば。 –
文字列リテラルは、コンパイラではなく、ランタイムによってインターンされます。 –