Laden...

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

Erstellt von Viper2000 vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.263 Views
V
Viper2000 Themenstarter:in
63 Beiträge seit 2008
vor 13 Jahren
Muss meine Liste static sein, damit sie lange genug lebt?

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;
            }
        }
    }

1.044 Beiträge seit 2008
vor 13 Jahren

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

V
78 Beiträge seit 2008
vor 13 Jahren

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?

C
401 Beiträge seit 2007
vor 13 Jahren

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.

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Viper2000,

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.

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.

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