Pourquoi le compilateur n'a-t-il pas utilisé la même référence d'objet pour un arbre d'expression statique?

c# expression-trees

Question

Comme je sais que les arbres d'expression sont immuables, alors pourquoi le compilateur n'a pas utilisé la même référence d'objet pour une expression statique, comme les littéraux de chaîne?

Pour clarifier la question s'il vous plaît voir l'exemple:

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());
}

Réponse acceptée

Comme je sais que les arbres d'expression sont immuables, alors pourquoi le compilateur n'a pas utilisé la même référence d'objet pour une expression statique, comme les littéraux de chaîne?

La spécification indique que le compilateur est autorisé mais pas obligé d'interner des lambdas identiques.

Les littéraux de chaîne sont internés gratuitement par le moteur d'exécution; le développeur du compilateur n'a aucun coût pour le faire.

La raison pour laquelle je n'ai pas interné d'arborescence d'expression est que chaque jour que nous passions à travailler sur des "optimisations" inutiles et inutiles pour des scénarios irréalistes qui ne sauvegardent aucune ressource valable est un jour où Visual Studio aurait échappé à son horaire. Nous avons passé ce temps sur des optimisations réelles .


Réponse populaire

Devinez à l'aveuglette en quoi consiste votre problème actuel: utilisez la réponse de cette question au lieu de l'égalité des références, en tant que IEqualityComparer pour votre dictionnaire. Ce n'est évidemment pas aussi rapide que Object.ReferenceEquals, mais est nettement plus rapide que la compilation de l'arbre d'expression, je l'imagine.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi