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
Muss meine Liste static sein, damit sie lange genug lebt?
Viper2000
myCSharp.de - Member



Dabei seit:
Beiträge: 63

Themenstarter:

Muss meine Liste static sein, damit sie lange genug lebt?

beantworten | zitieren | melden

Hallo Forum,

ich habe eine Klasse "ProgramParser". Die Klasse hat eine statische Klassenvariable "ArrayList program". Diese ArrayList wird in einer ebenfalls statischen Methode der Klasse instanziert und gefüllt. In einer anderen statischen Methode wird wieder auf diese Instanz der ArrayList zugegriffen. Meine Frage wäre nun wie man das aus SW-Architekten Sicht eleganter lösen kann. Oder ist das OK so?

Mein anderer Gedanke war die komplette Klasse von "außen" zu instanzieren und im Konstruktor dann die ArrayList zu instanzieren. Diese würde ja dann solange leben wie das Objekt der Klasse lebt. Aber auf die unten programmierte Art müsste ja die ArrayList bis zum Ende des Programms leben oder? Die Daten darin sind jedenfalls wichtig und sie müssen während der Laufzeit des Programms ständig verfügbar sein.

Hier der stark gekürzte Code:

Viele Grüße
Viper


class ProgramParser
    {
        public static string lastError;
        //TODO: Ist das so okay???
        static ArrayList program;

        public ProgramParser()
        {
        }

        
        public static bool StartConvertingFromQBasicToDeviceIndependent(string filename)
        {
            program = new ArrayList();

            try
            {
                 ...tue viele Dinge...
                    program.Add(line);
                    
                }

            }
            catch (Exception ex)
            {
                lastError = ex.Message;
                return false;
            }
        }

        public static bool saveProgramToFile(string filename)
        {
            try
            {                                                       
                  ...tue vieles...
                foreach (string line in program)
                {
                    sw.WriteLine(line);
                }

                sw.Close();                
                return true;
            }                                                            
            catch (Exception ex)
            {
                lastError = ex.Message;
                return false;
            }
        }
    }
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Viper2000 am .
private Nachricht | Beiträge des Benutzers
zero_x
myCSharp.de - Member

Avatar #avatar-2567.gif


Dabei seit:
Beiträge: 1.044
Herkunft: Koblenz

beantworten | zitieren | melden

Hallo Viper2000,

verwende statt der ArrayList wieder List<T>. Mehr möchte ich bis dahin nicht sagen. Du solltest schon selbstständig lernen können.

zero_x
zero_x | myCSharp.de - gemeinsam mehr erreichen

Für längere Zeit inaktiv.
private Nachricht | Beiträge des Benutzers
Vitab
myCSharp.de - Member



Dabei seit:
Beiträge: 78

beantworten | zitieren | melden

Siehe dazu auch List<T> statt ArrayList?


Eventuell wären weitere Infos, über den Sinn der Klasse hilfreich. Für mich hört sich das ein bisschen nach dem Singleton-Pattern an.

Vielleicht hilft dir auch das: Zentrales Dataset - Zugriff von überall - Wie mögllich?
private Nachricht | Beiträge des Benutzers
Corpsegrinder
myCSharp.de - Member



Dabei seit:
Beiträge: 401

beantworten | zitieren | melden

Wo würdest du denn eine Liste in einer normalen Klasse instanziieren? Genau das gibt es auch für statische Klassen ;-). Den Rest solltest du selber herausfinden können.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Viper2000,
Zitat
Mein anderer Gedanke war die komplette Klasse von "außen" zu instanzieren und im Konstruktor dann die ArrayList zu instanzieren. Diese würde ja dann solange leben wie das Objekt der Klasse lebt.
abgesehen von dem berechtigten Einwand, dass du unbedingt List<T> statt ArrayList verwenden solltest, ist das auf jeden Fall die bessere Lösung.
Zitat
Aber auf die unten programmierte Art müsste ja die ArrayList bis zum Ende des Programms leben oder?
Nein, bei jedem Aufruf von StartConvertingFromQBasicToDeviceIndependent wird ja eine neue Liste erstellt und die alte (irgendwann) vom GC weggeräumt.
Zitat
Die Daten darin sind jedenfalls wichtig und sie müssen während der Laufzeit des Programms ständig verfügbar sein.
Glaube ich nicht. So wie es aussieht, reicht es vollkommen, wenn die Daten innerhalb des Objekts während der Lebensdauer des Objekts vorhanden sind. Sei sparsam mit static und verwende es nur, wenn du dir wirklich sicher bist. Hier ist es ziemlich sicher nicht nur nicht nötig, sondern echt falsch, static zu verwenden, weil sich sonst mehrere ProgramParser-Instanzen gegenseitig in die Quere kommen, auch bei lastError. BTW: Verwende keine öffentlichen Felder, sondern nur öffentliche Properties.

Beachte bitte auch [Hinweis] Wie poste ich richtig? Punkt 1.1.1.

herbivore
private Nachricht | Beiträge des Benutzers