2010-02-17 19 views
6

Dies scheint grundlegend, aber ich finde dies ziemlich trivial. Wie würden Sie eine globale Variable mit einer statischen Klasse (z. B. Konsolenanwendung) empfehlen?Globale Variable in einer statischen Methode

Um Ihnen ein wenig mehr Hintergrund zu geben, ruft die Hauptmethode einige benutzerdefinierte Eventhandler auf, von denen ich hoffe, dass sie die Variablen erhalten/setzen.

Alle Ideen oder Vorschläge, die Sie haben, werden geschätzt.

+9

Ich würde persönlich empfehlen, den Ausdruck "globale Variable" aus Ihrem Wortschatz zu löschen. – Aaronaught

+6

für zukünftige Referenz, etwas, das trivial ist, ist etwas, das Sie für einfach halten. – NerdFury

Antwort

9

einfachste Weg ist

public static Object MyGlobalVariable; 

, die ein öffentliches statisches Feld erzeugt. Ein wenig besser ist:

public static Object MyGlobalVariable { get; set; } 

Das schafft eine öffentliche statische Eigenschaft.

+1

Warum ist das Eigentum ein wenig besser? – IllidanS4

+0

@ IllidanS4, stackoverflow.com/questions/653536/difference-between-property-and-field-in-c-sharp-3-0/653799 –

+0

Ich kenne den Unterschied, aber sind statische Eigenschaften objektiv besser als statische Felder? – IllidanS4

1

Nicht 100% sicher, aber Sie könnten ein Singleton versuchen, Ihre Variablen zu halten. Ohne zu wissen, was Sie zu erreichen versuchen, ist es schwer zu empfehlen, ob diese Lösung Sie nicht auf der Straße beißen würde.

http://www.yoda.arachsys.com/csharp/singleton.html

13

Es gibt keine globalen Variablen in C#. Eine Variable ist immer lokal begrenzt. Die grundlegende Codeeinheit ist die Klasse und innerhalb einer Klasse haben Sie Felder, Methoden und Eigenschaften.

Sie können eine „globale Variable“ imitieren, indem Sie ein öffentliches statisches Feld oder eine Eigenschaft in irgendeiner Klasse zu machen, aber man sollte nicht . C# macht dies aus einem sehr guten Grund schwierig; Globale Variablen sind pures Übel. Sie verletzen mehrere gute Prinzipien des OO-Designs - Einkapselung, lose Kopplung und hohe Kohäsion, um nur einige zu nennen.

Ich weiß, dies ist eine Anfängerfrage, aber ich denke, es ist , weil dies eine Anfängerfrage ist, dass es so wichtig ist, dies zu sagen. Jetzt ist der beste Zeitpunkt, um zu lernen, welche Taktiken in C# aktiv oder sogar gefährlich sind. Wenn Sie ein statisches Feld/eine statische Eigenschaft als globale Variable verwenden, sind es etwa sechs. Es gibt legitime Verwendungen für diese Konstrukte, aber die Weitergabe von Daten von Ort zu Ort gehört nicht dazu.

Wenn zwei verschiedene Klassen von derselben Information abhängig sind, übergibt die Informationen von der Quelle an das Ziel. Dies geschieht normalerweise entweder über den Konstruktor oder als Argument für die aufgerufene Methode. Sie sollten immer eine einzige Instanz haben, die diese Information wirklich "besitzt". Informationen "global" zu machen bedeutet, dass Sie nicht darüber entscheiden können, wer oder was zu einem bestimmten Zeitpunkt davon abhängig sein könnte.

Bitte beachten Sie dies und versuchen Sie, über andere Möglichkeiten nachzudenken, wie Sie die Informationen, die Sie in einer globalen Variablen speichern möchten, teilen möchten (z. B. indem Sie sie einem Konstruktor oder einer Methode als Argument übergeben). Wenn du dir nicht sicher bist, poste ein Beispiel, was du zu tun versuchst und wir helfen dir weiter.

+0

Vielen Dank für die Ausarbeitung .. das war sehr hilfreich. –

+0

Angenommen, ich habe ein paar Threads gleichzeitig und weg vom Haupt-Thread und jetzt, wenn es einen Fehler in einem dieser Threads gibt, möchte ich die Anzahl der Fehler erhöhen. Wie würde das dann gemacht werden? – user20358

+0

@ user20358: Das ist nicht wirklich genug Informationen, um eine Lösung zu empfehlen. Was machen die Threads? Warum sollten sie versagen? Was sind die Folgen eines Scheiterns? Was genau bedeutet das, sie zu zählen, anstatt sie zu protokollieren oder Folgemaßnahmen zu ergreifen? Sie sollten Ihr Problem klären und eine neue Frage stellen. – Aaronaught

Verwandte Themen