C#编译的lambda表达式实例创建和/或垃圾回收?

C#编译的lambda表达式实例创建和/或垃圾回收?,c#,.net,lambda,C#,.net,Lambda,考虑以下代码示例: using System; using System.Linq.Expressions; public class Class1<T, Y> { public Class1(Expression<Func<T, Y>> mapExpression) { GetValue = mapExpression.Compile(); } public Func<T, Y> GetValu

考虑以下代码示例:

using System;
using System.Linq.Expressions;

public class Class1<T, Y>
{
    public Class1(Expression<Func<T, Y>> mapExpression)
    {
        GetValue = mapExpression.Compile();
    }

    public Func<T, Y> GetValue { get; protected set; }
}

public class DataClass
{
    public long Data { get; set; }
}
使用系统;
使用System.Linq.Expressions;
公共班级1
{
公共类别1(表达式映射表达式)
{
GetValue=mapExpression.Compile();
}
public Func GetValue{get;protected set;}
}
公共类数据类
{
公共长数据{get;set;}
}
现在假设我在不同的地方创建Class1的新实例,例如

var instance1 = new Class1<DataClass, long>(x => x.Data);
var instance2 = new Class1<DataClass, long>(x => x.Data);
var instance1=newclass1(x=>x.Data);
var instance2=新类别1(x=>x.Data);
当我这样做时,会发生什么:

  • 我得到两个不同的编译函数吗
  • 如果是这样,那么当Class1的实例被垃圾回收时,这两个编译函数是否被垃圾回收
  • 如果不是,我如何避免内存泄漏(假设我无法实际控制Class1实例的创建)
  • 对。如果需要“singleton”,则将此设置为静态
  • 在.NET4之前,在某些条件下,使用.NET4动态创建的程序集/代码可以进行垃圾收集
  • 如果“singleton”模式不起作用,请尝试使用静态缓存机制

  • 谢谢你的回答。在.NET4中,您能否更具体地(或提供参考)说明动态创建的代码在什么情况下会被垃圾收集?@Nathan:我必须深入研究文档。IIRC它是从.NET4.Hmm中的新特性“链接”而来的。我想知道lamba.Compile是否会生成DynamicMethod?似乎表明即使在.NET3.5中,动态方法也会被垃圾收集?@Nathan:我相信除了极少数情况外,这种方法不会真正起作用。@Nathan:根据我的经验,ModuleBuilder中也存在“内存泄漏”,阻止了生成字节码的GC。