C#编译的lambda表达式实例创建和/或垃圾回收? [英] C# Compiled lambda expressions instance creation and/or garbage collection?

查看:109
本文介绍了C#编译的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的新实例,例如

Now suppose that I make in different places new instances of Class1, e.g.

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

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

When I do this, what happens:

  1. 我得到两个不同的编译函数吗?
  2. 如果是这样,那么当Class1的实例被垃圾回收时,两个编译函数是否会被垃圾回收?
  3. 如果没有,如何避免内存泄漏(假设我无法实际控制Class1实例的创建)?

推荐答案

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

这篇关于C#编译的lambda表达式实例创建和/或垃圾回收?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆