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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code