2016-10-02 2 views
1

Ich habe eine Menge Probleme bei der Auswahl zwischen Singleton oder Static für eine Klasse, die Statusvariablen enthält. Ich wollte das Klassenobjekt instanziieren und nur als eins existieren.C# sollte Singleton statische Methoden enthalten?

Ich weiß, beide Möglichkeiten können Zustandsvariablen speichern. Static Klasse scheint leicht mit den Variablen umzugehen, da alle Methoden static werden, auf die sie die Variablen static ohne weitere Arbeit zugreifen können.

Dieser Fall unterscheidet sich jedoch für eine Singleton. Ich habe beide Arten von Methoden; Eine Art, die Zugriff auf die SingletonInstance Variable benötigt, und andere, die ohne Zugriff auf die Instance Variable, die ich es statisch markieren kann.

ein Beispiel:

/// <summary>Singleton.</summary> 
    public sealed class Singleton 
    { 
     private static readonly Singleton instance = new Singleton(); /// <summary>Instance.</summary> 
     public static Singleton Instance { get { return instance; } } 

     private int integer; /// <summary>Integer.</summary> 
     public int Integer { set { integer = value; } get { return integer; } } 

     /// <summary>Constructor.</summary> 
     private Singleton() { } 

     /// <summary>TestA</summary> 
     public void TestA(int val) 
     { 
      Integer = val; 
     } 

     /// <summary>TestB</summary> 
     public static int TestB(int val) 
     { 
      return Instance.Integer * val; 
     } 

     /// <summary>TestC</summary> 
     public static int TestC(int val) 
     { 
      return val * val; 
     } 
    } 

Aus dem oben gegebenen Beispiel, gibt es drei Verfahren; TestA, TestB und TestC.

  1. TestA ist eine non-static Instanzmethode, die den Zugriff auf seine Eigenschaft aufweist.
  2. TestB ist eine static Methode, aber greift auf die Instance, um seine Eigenschaften zu erhalten.
  3. TestC ist eine static Methode, die die Instanz nicht verwendet.

Es stellt sich die Frage:

  1. Sollte der Singleton enthält nur static Methoden und den Zugang zu seinen Instance Eigenschaften und Methoden von der staticInstance Eigenschaft durchlaufen? Mit anderen Worten, alle Methoden sind ähnlich wie TestB oder TestC.
  2. Sollte die Singleton enthält nur non-static Methoden, unabhängig davon, ob es die Instance oder nicht braucht? Alle Methoden ähnlich wie TestA.
  3. Sollte die Singleton enthält beide gemischt static und non-static (in diesem Fall, TestA, und TestB Art) Methoden? Was ich glaube, kann ziemlich unordentlich werden.
  4. Wenn nicht, was soll ich tun? Soll ich die Idee von Singleton abwerfen und mit allen static für alle Klassen gehen, die nur einmal instanziiert werden sollen?

Edit: Mit ähnlicher Frage sollte Singleton selbst enthält keine Static Variablen// Eigenschaft neben den Instance?

Antwort

1

Sie sollten beide Muster nicht mischen.

Wenn Sie ein Singleton-Muster haben, sollte das einzige statische Feld die Instanz (+ der Getter) sein. Alle Ihre Methoden und Felder sollten über die Instanz zugänglich sein. Wenn Sie es vermischen, wird es nur Verwirrung verursachen.

Wenn Sie das statische Klassenmuster wählen, verwenden Sie keine geheime Instanz innerhalb dessen ist der Job von .NET.

Wenn Sie nicht sicher sind, welches Muster am besten zu Ihnen passt, werfen Sie einen Blick in diesen Artikel Singleton-vs-Static. Es erklärt die Pro und Kontra von beiden: https://www.dotnetperls.com/singleton-static

+0

Ich sehe, danke! – Kei