考虑以下代码示例:

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

当我这样做时,会发生什么:
  • 我有两个不同的编译函数吗?
  • 如果是这样,当Class1的实例被垃圾回收时,两个编译的函数是否也被垃圾回收?
  • 如果没有,如何避免内存泄漏(假设我无法实际控制 Class1 实例的创建)?
  • 最佳答案

  • 是的。如果需要“单例”,请将此设为静态。
  • 在 .NET 4 之前,不,在某些条件下,.NET 4 动态创建的程序集/代码可以被垃圾收集。
  • 如果“单例”模式不起作用,请尝试使用静态缓存机制。
  • 关于C# 编译的 lambda 表达式实例创建和/或垃圾收集?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3940261/

    10-13 06:06