4 Stimmen

C# Kompilierte Lambda-Ausdrücke Instanz Erstellung und/oder Garbage Collection?

Betrachten Sie das folgende Codebeispiel:

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

Nehmen wir nun an, dass ich an verschiedenen Stellen neue Instanzen von Klasse1 erzeuge, z. B.

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

Was passiert, wenn ich das tue?

  1. Bekomme ich zwei verschiedene kompilierte Funktionen?
  2. Wenn ja, werden die beiden kompilierten Funktionen garbage collected, wenn die Instanzen von Class1 garbage collected werden?
  3. Wenn nicht, wie kann ich ein Speicherleck vermeiden (unter der Annahme, dass ich die Erstellung von Class1-Instanzen realistischerweise nicht kontrollieren kann)?

3voto

leppie Punkte 111830
  1. Ja. Machen Sie dies statisch, wenn "singleton" erforderlich ist.
  2. Vor .NET 4, nein, mit .NET 4 können dynamisch erstellte Assemblies/Code unter bestimmten Bedingungen Garbage Collect sein.
  3. Wenn das "Singleton"-Muster nicht funktioniert, versuchen Sie es mit einem statischen Caching-Mechanismus.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X