Laden...

Entsteht ein Memory Leak beim zuweisen einer Auflistung

Erstellt von glandorf vor einem Jahr Letzter Beitrag vor einem Jahr 418 Views
glandorf Themenstarter:in
87 Beiträge seit 2016
vor einem Jahr
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

16.834 Beiträge seit 2008
vor einem Jahr

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.

glandorf Themenstarter:in
87 Beiträge seit 2016
vor einem Jahr

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

16.834 Beiträge seit 2008
vor einem Jahr

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.

glandorf Themenstarter:in
87 Beiträge seit 2016
vor einem Jahr

Danke für deine Erläuterungen.

glandorf