2010-03-24 28 views
5

Ich habe zwei Objekte, die ich hauptsächlich innerhalb der einzelnen Klasse verwenden werde. Ich werde sie am Anfang initialisieren und sie während des gesamten Programms verwenden. Nun, meine Frage ist, dass, wenn ich sie nur als globale Variablen erstellen und auf sie irgendwo im Code (in der Seite der einzelnen Klasse) zugreifen sollte oder ich sie als lokale Variablen erstellen und sie als Parameter an andere Funktionen übergeben sollte. Ich möchte nur sehen, was die beste Programmierpraxis wäre.Globaler Zugriff vs. lokale Variablen

Ich benutze C#.

Danke.

Antwort

5

Im Allgemeinen sollten Sie globale Variablen vermeiden. Wenn es praktisch ist, empfehle ich, sie als Einheimische zu behalten und sie als Parameter an Ihre Funktionen zu übergeben.

Als Josh wies darauf hin, wenn diese Variablen nur verwendet innerhalb eines einzelne Instanz der Klasse sind, dann sollten Sie sie nur privat (oder geschützt) Mitglieder dieser Klasse und mit ihr geschehen. Natürlich konnten sie dann nur als Parameter an andere Methoden mit derselben Zugriffsebene (IE, privat) übergeben werden.

Alternativ können Sie die Verwendung der Singleton Design Pattern, die etwas sauberer (und vorzuziehen ist) mit Globals verwenden.

+0

Ich bekomme, dass Sie vermeiden sollten, Globals zu verwenden, und ich verwende Singleton die ganze Zeit, aber wie erstellt man sogar globale Variablen in einem .NET? – Merritt

+0

Sie können eine 'Public Static' string/int/float/etc Variable definieren, die effektiv global wäre. Aber ich stimme zu, dass es in C# wirklich kein "globales" Konzept im Vergleich zu anderen Sprachen wie C gibt. Vielleicht hätte ich das in meiner Antwort deutlicher machen sollen. –

+0

.Net unterstützt globale Variablen und sogar globale Methoden. Aber die Syntax für C# nicht (das ist wahrscheinlich eine gute Sache.) –

2

Wenn der Gültigkeitsbereich der Objekte die Lebensdauer der Klasse ist, in der sie instanziiert werden, sollten sie private Membervariablen sein.

Wenn sie den Status selbst nicht beibehalten, sollten Sie sie zu statischen Klassen machen.

Sie sollten immer noch übergeben sie als Variablen, oder mindestens erstellen Eigenschaft Zugriff auf das Hintergrundfeld zu erhalten. Auf diese Weise können Sie Implementierungsdetails ändern, ohne Ihren Code in die Luft zu jagen.

SOLID design principles sind ein guter Ausgangspunkt, wenn Sie über diese Dinge nachdenken.

0

Wenn die Objekte die gleiche für jede Instanz der Klasse sein, dann

static const double PI = 3.14158; 
0

Sie im Allgemeinen Methoden verwenden Accessor sollte (zum Beispiel Getter und Setter) und halten Sie Ihre internen Variablen privat. Auf diese Weise ist der Rest Ihres Codes außerhalb Ihrer Klasse nicht von Ihren tatsächlichen Variablen abhängig.

Siehe this Tutorial.

0

Wenn Ihre Klasse von diesen 2 Objekten abhängig ist, sollten sie wahrscheinlich Mitglieder der Klasse selbst sein. Etwas wie folgt (wobei A die Klasse, die Sie sprechen und B ist eines der Objekte, die Sie initialisieren:

public class A 
{ 
    private B _b; 

    public A(B b) 
    { 
     _b = b; 
    } 

    public void DoSomething() 
    { 
     //do something with _b; 
    } 

    private void DoSomethingElse() 
    { 
     //do something else with _b; 
    } 
} 

In diesem Beispiel A ist abhängig von B (so übergeben Sie Ihre Instanz von B in A Konstruktor oder durch einige Dependency Injection-Framework). es würde nicht viel Sinn für jede Methode auf Klasse machen A einen Parameter vom Typ benötigen B an sie übergeben werden.

2

ich habe zwei Objekte, die ich sein hauptsächlich innerhalb einzelner Klassen verwenden.I initialisiert sie am Anfang und verwendet sie während der gesamten Lebensdauer von das Programm.

Das klingt nach einer perfekten Zeit, um eine private static readonly Variable zu verwenden. Diese können in ihrer Deklaration initialisiert werden, oder Sie können einen statischen Konstruktor erstellen, um sie zu initialisieren.

Die Tatsache, dass Sie nur diese Objekte innerhalb einer einzelnen Klasse referenzieren, ist der Schlüsselpunkt. Es gibt andere bessere Möglichkeiten, Dinge zu tun, wenn diese Objekte jemals außerhalb der einzelnen Klasse benötigt werden.

0

Ich denke in diesem Fall sollten Sie fragen, was mehr Sinn macht. Gibt es eine Art Beziehung zwischen den 2 Objekten und der neuen Klasse? Wie oft werden sie in der Klasse verwendet? Wenn nur ein paar Methoden die Objekte verwenden, übergeben Sie sie andernfalls, instanziieren Sie sie als Variablen auf Klassenebene (möglicherweise mit privaten statischen Readonly, wie Jefferey vorschlägt) und verwenden Sie sie in der Klasse.

Es sollte Ihr Ziel sein, den Code lesbarer zu machen.

Verwandte Themen