Ist ein neues Objekt, das in einer statischen Eigenschaft Getter erstellt werden nur einmal erstellt?

StackOverflow https://stackoverflow.com/questions/2042857

Frage

Ich erstelle eine statische Hilfsklasse für Web-Services ich schreibe. Ich bin in die API von Telligent tippen und deshalb diese Telligent „Service“ Objekte erstellen, die mir erlauben, Dinge mit der Plattform zu tun. Zum Beispiel, Ich erstelle ein MembershipSerice Objekt in meiner Hilfsklasse, damit ich die Mitgliedschaft Sachen mit dem gleichen Objekt tun kann. In meinem Helfer Klasse habe ich eine Eigenschaft mit einem Getter, die ein neues eines dieser Objekte erzeugt:

private static MembershipService _MembershipService {
  get {
    return new MembershipService(path, usr, pwd);
  }
}

Und dann habe ich ein Verfahren, dass die Renditen dieser Eigenschaft:

public MembershipService getMembershipService() {
  return _MembershipService;
}

Heisst das, da die Eigenschaft statisch ist, dass das neue Objekt in dem Getter erstellt nur einmal erstellt wird? Auch Stil in Bezug auf die Codierung, wäre es einfach besser, das Eigentum öffentlich zu machen und daher das Verfahren unnötig wäre.

oder ... es wäre besser, nur das Objekt als private Variable erstellen und über die öffentliche Methode zurück:

private static MembershipService _mbrSvc = new MembershipService(path, usr, pwd);
public MembershipService getMembershipService() {
  return _mbrSvc;
}

// then called elsewhere by me via:
MembershipService svc = MyHelperClass.getMembershipService();

Wenn Sie irgendwelche Gedanken über die Art, wie ich dies so einrichten, seine effiziente und führt gut, lassen Sie es mich wissen.

War es hilfreich?

Lösung

  

Heisst das, da die Eigenschaft statisch ist, dass das neue Objekt in dem Getter erstellt nur einmal erstellt wird?

Nein, denn Sie haben

new MembershipService(path, usr, pwd);

innerhalb des Getter, unabhängig von _MembershipService wird static erklärt eine neue Instanz wird bei jedem Aufruf erstellt werden. Alle dass static bedeutet in diesem Zusammenhang ist, dass Sie die Methode aufrufen kann eine Instanz der definierenden Klasse ohne.

Was auf dem Stil zu kommentieren, na ja, es hängt wirklich davon ab, was Sie tun wollen. Wollen Sie eine einzelne Instanz? Wenn ja, erstellen Sie eine statische Membervariable _mbrSvc und Rendite, die aus dem Getter:

private static MembershipService _mbrSvc = new MembershipService(path, usr, pwd);
private static MembershipService _MembershipService {
    get {
        return _mbrSvc;
    }
}

Ansonsten, wie es ist in Ordnung.

Andere Tipps

Jason, Mark Nur der Vollständigkeit halber willen, es Kü über die Definition des MembershipService abhängt. Wenn MembershipService ist eine Klasse, dann das Objekt zwischen den Aufrufen von Methoden gemeinsam genutzt wird. Wenn MembershipService eine Struktur ist, wird eine Kopie immer erstellt wird. Nur ein MembershipService-Objekt aufgerufen wird den Unterschied nicht angegeben ist, da in DotNet alles ist ein Objekt.

Wenn das Objekt teuer zu erstellen, verwenden Sie einen Singletonmuster mit verzögertes Laden kombiniert:

private static MembershipService _mbrSvc;
private static MembershipService _MembershipService { 
    get { 
        if(_mbrSvc == null)
        {
          _mbrSvc = new MembershipService(path, usr, pwd); 
        }
        return _mbrSvc; 
    } 
} 

Jedes Mal wenn Sie verwenden neue ein neues Objekt erstellt wird.

Daher ist der erste Ansatz erzeugt ein neues Objekt jedes Mal das Objekt zugegriffen wird.

Was Sie suchen aufgerufen wird ein Singleton -. Ihr zweiter Ansatz ist eine Möglichkeit, es in C # zu implementieren

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top