2009-03-08 11 views
1

Ich habe eine Produktbildklasse. Dies ist ein Objekt mit Wiederverwendungspotenzial für die allgemeine Arbeit mit Bildern (z. B. für ein Produkt, für ein CMS bei der Arbeit mit Bildern usw.). Dadurch kann ich den Titel der Datei festlegen und das Bild auf einfache Weise mit Standard-.NET-Klassen bearbeiten.Struct vs statische Klasse für eine freigegebene Ressource?

Ich kann eine Struktur verwenden, was bedeutet, wenn ich die Struktur in 5 verschiedenen Orten verwende, das sind 5 verschiedene Speicherorte, aber alle voneinander unabhängig. Ändern Sie den Status von einem dieser Speicherorte nicht die anderen (was das gewünschte Verhalten ist). Es wird eingerahmt, wenn nach einem Objekt gefragt wird.

Das Objekt ist instanzbasiert. So würde jedes Produkt das Produktobjekt verwenden und mit dem Bild arbeiten (z. B. seinen Titel bearbeiten usw.).

Wenn ich eine statische Klasse erstellen, sind das fünf verschiedene Positionen, die sich auf ein Objekt beziehen. Also müsste ich mich um die Thread-Synchronisation kümmern. Ich kann nicht einfach in eine Variable schreiben, da ein anderer Zugriff die Variable überschreiben könnte, unabhängig davon, wie gut ich den Zugriff auf diese freigegebene Ressource synchronisiere. Also muss ich immer neue Variablen zurückgeben. Wenn ich eine statische Klasse verwende, die von vielen verschiedenen Aufrufmethoden verwendet wird, würde dies dazu führen, dass eine Warteschlange auf die freigegebene Ressource zugreift. Weil Utility-Klassen statisch sind und nur Dienstprogramme sind, werden sie von vielen Klassen in meiner Codebasis verwendet. Ist es vielleicht nicht ratsam, in dieser Situation statische Klassen zu verwenden?

Wie die MSDN-Dokumentation erläutert, verwende ich nur eine statische Klasse für eine globale Entität. Also eine Klasse, die Details über meine Codebasis kapselt - es gibt nur eine Codebasis, und diese Klasse enthält Details über die Anzahl der Zeilen usw. Dies ist nicht instanzbasiert, wie eine Bestellklasse (1 Kunde-1 Bestellung-1 oder mehr Bestellungen)).

In diesem Szenario ist es eine gute Designentscheidung, vielleicht eine Struktur stattdessen zu verwenden?

Antwort

2

Es ist mir nicht ganz klar, wofür Sie diesen Typ verwenden möchten, aber es hört sich so an, als wäre es am besten, einen unveränderlichen Referenztyp zu erstellen. Es ist sehr selten angemessen, eigene Strukturen in .NET zu erstellen (und besonders eine "Produkt" -Struktur hört sich an, als sei sie fast sicher die falsche Wahl) und eine statische Klasse sollte normalerweise keinen veränderlichen Zustand haben, außer potentiell für Dinge wie Zähler.

Gibt es einen Grund, warum Sie nicht für eine normale Klasse gegangen sind? Machen Sie es unveränderlich, wenn Sie in der Lage sein möchten, eine einzelne Instanz zwischen mehreren "Eltern" zu teilen, ohne sich darum kümmern zu müssen, dass ein Elternteil den Inhalt ändert - fügen Sie zusätzliche Methoden hinzu, die eine neue Instanz basierend auf der alten zurückgeben, ähnlich wie String.Replace tut.

+0

Hallo. Ich beabsichtige, eine Standard-Bildklasse zu erstellen. Die Anforderung ist für eine E-Commerce-Engine, aber ich sehe unmittelbares Potenzial für die Wiederverwendung. Der einzige Grund, warum ich mich nicht für einen Referenztyp entschieden habe, war, dass ich alle Referenzen ändern würde, wenn sich 1 ref ändert. Ich denke, es sollte unveränderlich und ref Typ sein. – dotnetdev

+0

Yup, klingt wie ein großartiges Beispiel dafür, wo ein unveränderlicher Referenztyp angebracht ist. –

+0

Yup. Das Objekt wird von verschiedenen Subsystemen des Systems verwendet, so dass der Weg unveränderlich ist. Es scheint so, als ob der Grund für die Verwendung einer Struktur auf dem Szenario und nicht auf der Leistung basiert. Korrigiere mich, wenn ich falsch liege. Um das Boxen zu verhindern, könnte ich eine Struktur verwenden und eine Methode erstellen, die nach einem Werttyp param fragt. – dotnetdev

7

Meiner Meinung nach ist die Zeit, sich über Leistungsprobleme Sorgen zu machen, nachdem Sie ein Leistungsproblem haben. Bis dahin müssen Sie sich darum sorgen, dass der Code funktioniert und wartbar ist. Sie werden ansonsten feststellen, dass Sie nur geringfügige Leistungssteigerungen verfolgen oder möglicherweise das falsche Leistungsproblem lösen.