Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Entsteht ein Memory Leak beim zuweisen einer Auflistung
glandorf
myCSharp.de - Member

Avatar #avatar-4144.jpg


Dabei seit:
Beiträge: 84
Herkunft: Chemnitz

Themenstarter:

Entsteht ein Memory Leak beim zuweisen einer Auflistung

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.209

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
glandorf
myCSharp.de - Member

Avatar #avatar-4144.jpg


Dabei seit:
Beiträge: 84
Herkunft: Chemnitz

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.209

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
glandorf
myCSharp.de - Member

Avatar #avatar-4144.jpg


Dabei seit:
Beiträge: 84
Herkunft: Chemnitz

Themenstarter:

beantworten | zitieren | melden

Danke für deine Erläuterungen.

glandorf
private Nachricht | Beiträge des Benutzers