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

时间:2010-10-15 07:27:56

标签: 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> GetValue { get; protected set; }
}

public class DataClass
{
    public long Data { get; set; }
}

现在假设我在不同的地方制作了Class1的新实例,例如

var instance1 = new Class1<DataClass, long>(x => x.Data);
var instance2 = new Class1<DataClass, long>(x => x.Data);

当我这样做时,会发生什么:

  1. 我有两种不同的编译功能吗?
  2. 如果是这样,当Class1的实例被垃圾收集时,这两个编译的函数是否会被垃圾收集?
  3. 如果没有,我怎样才能避免内存泄漏(假设我无法真实地控制Class1实例的创建)?

1 个答案:

答案 0 :(得分:3)

  1. 是。如果需要'singleton',请将其设为静态。
  2. 在.NET 4之前,不,使用.NET 4动态创建的程序集/代码在某些条件下可以进行垃圾收集。
  3. 如果'singleton'模式不起作用,请尝试使用静态缓存机制。