为什么编译器不对静态表达式树使用相同的对象引用?
Why compiler didn't use same object reference for a static expression tree?
据我所知,表达式树是 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());
}
As I know Expression trees is immutable so why compiler didn't use same object reference for a static expression, like string literals?
规范表示允许但不要求编译器驻留相同的 lambda。
字符串文字由运行时免费驻留;编译器开发人员无需支付任何费用。
我没有实习表达式树的原因是因为我们每天都在处理毫无意义的不必要的 "optimizations" 不切实际的场景,实际上没有节省任何宝贵的资源是 Visual Studio 的一天推迟了它的时间表。我们将那段时间用于 实际 优化。
盲目猜测您的实际问题是什么:使用 this question 的答案作为您字典的 IEqualityComparer,而不是引用相等性。它显然没有 Object.ReferenceEquals 快,但肯定比我想象的编译表达式树快。
据我所知,表达式树是 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());
}
As I know Expression trees is immutable so why compiler didn't use same object reference for a static expression, like string literals?
规范表示允许但不要求编译器驻留相同的 lambda。
字符串文字由运行时免费驻留;编译器开发人员无需支付任何费用。
我没有实习表达式树的原因是因为我们每天都在处理毫无意义的不必要的 "optimizations" 不切实际的场景,实际上没有节省任何宝贵的资源是 Visual Studio 的一天推迟了它的时间表。我们将那段时间用于 实际 优化。
盲目猜测您的实际问题是什么:使用 this question 的答案作为您字典的 IEqualityComparer,而不是引用相等性。它显然没有 Object.ReferenceEquals 快,但肯定比我想象的编译表达式树快。