Laden...

Entsteht ein Memory Leak beim zuweisen einer Auflistung

Letzter Beitrag vor 2 Jahren 5 Posts 437 Views
Entsteht ein Memory Leak beim zuweisen einer Auflistung

Hallo zusammen,

folgendes Beispiel habe ich ähnlich in produktivem Code gefunden.

Gegeben ist folgende Klasse:


public class TestClass
{
	public string Name { get; set; }

	public IEnumerable<string> Lines { get; set; } = new List<string>();
}

Eine Instanz wird folgend erzeugt:


var testClass = new TestClass
{
	Name = "Class 1",
	Lines = new[] {"one", "two"}
};

Erzeugt die Zeile


Lines = new[] {"one", "two"}

nicht ein Memory Leak?

Zielframework ist .NET Standard 2.0

glandorf

Nein, warum sollte sie? Ist ja nur die Zuweisung eines Arrays. Was genau siehst Du hier falsch?
Ist alles Managed Code, in korrekter Form.

Ein Memory Leak wird meistens ausgelöst, wenn gewisse Ressourcen nicht korrekt behandelt werden oder zB. aufgrund eines Programmierfehlers durch den Garbage Collector nicht aufgeräumt werden können.

In dieser Zeile


public IEnumerable<string> Lines { get; set; } = new List<string>();

wird Lines schon erstellt.

Und mit


Lines = new[] {"one", "two"}

durch ein neues Array überschrieben.

Bin mir da eben nicht ganz sicher, darum lieber die Nachfrage.

glandorf

Das ist ineffizient, aber nicht falsch.

Ineffizient, weil List<string>() unter der Haube sofort ein 4-Item-Array erstellt und eben ein unnötiges Objekt erzeugt.
Ein bisschen besser wäre


    public IEnumerable<string> Liste { get; set; } = new string[] { };

da hier nur ein Objekt erstellt wird und das Array kleiner ist.

Am effizientesten ist aber


    public IEnumerable<string> Liste { get; set; } = Enumerable.Empty<string>();

da hier nicht mal ein Objekt erstellt wird, das getrackt werden müsste.
Hat also den geringst möglichen GC Impact.

Dein Beispiel ist aber alles sauberer Managed Code.
Kein Problem für den GC zum Aufräumen.

Danke für deine Erläuterungen.

glandorf