c# - 为什么编译器不对静态表达式树使用相同的对象引用?

标签 c# expression-trees

据我所知,表达式树是 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。

字符串文字由运行时免费驻留;编译器开发人员无需为此付出任何代价。

我没有实习表达式树的原因是因为我们每天都在为不切实际的场景进行毫无意义的不必要的“优化”,而这些场景实际上没有节省任何宝贵的资源,而 Visual Studio 会推迟它的日程安排的那一天。我们将这些时间用于实际优化。

关于c# - 为什么编译器不对静态表达式树使用相同的对象引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47258305/

相关文章:

c# - 根据对 Azure 应用程序网关的传入请求触发 Azure Function

c# - 获取 TF30063 : You are not authorized to access https://{url}. Visualstudio.com/

c# - 为什么在使用动态时我能够在静态上下文中访问非静态方法

c# - 有没有办法以编程方式导出/保存生成的 javascript 和 css 包?

.net - 为什么从表达式动态生成的委托(delegate)比硬编码的 lambda 慢?

c# - 将结构数组从 C++ 编码到 C#?

c# - 使用表达式树而不是反射来获取和设置对象属性

linq - IronPython 的表达式树

c# - Expression<Func<>> 仅有效内联而不是通过 Moq 的 Setup() 中的绑定(bind) lambda?

c# - 给定类型 ExpressionType.MemberAccess,如何获取字段值?