2010-01-12 10 views
7

Was ist der beste Weg, um eine Klasseneigenschaft "Einmal schreiben, viele lesen" zu erstellen, sodass Sie die Eigenschaft nur einmal festlegen können?Wie kann ich eine Eigenschaft "Write Once Read Many" in VB.NET machen?

Ich weiß, dass ich alle Eigenschaften im Konstruktor übergeben und sie ReadOnly, aber in Fällen mit vielen Eigenschaften, die ich möchte nicht einen Konstruktor, der mehr als 20 Argumente hat.

Auch ich weiß, ich kann "meine eigenen" Setter rollen, aber das für jede Eigenschaft zu tun scheint wie ein Haufen redundante Codierung.

Gibt es eine saubere Möglichkeit, dies in VB 2008 .NET 3.5 zu tun?

+2

bezogen werden: http://stackoverflow.com/questions/1079292/should-i-use-set- once-variables/1079316 – peterchen

Antwort

2

Eine einmal beschreibbare Eigenschaft ist niemals "sauber".

Ich würde empfehlen, eine Builder/Factory-Klasse zu erstellen, um die 20 Param CTor zu vermeiden. (Ja, ich weiß, es ist ganz etwas Typisierung)

ähnliche Diskussion hier: Should I use set once variables?

[Bearbeiten], Außerdem, selbst wenn Sie darauf bestehen, ich nicht ein andere Möglichkeit sehen, als Sie Ihre eigenen Setzer rollend ist viel tippen auch.

+0

Danke. Der Beitrag, den Sie verlinkt haben, erklärt viel, und ich stimme Ihrem Grundsatz "Wenig Überraschungen" zu. Die Verwendung eines Builders ist möglicherweise die beste Lösung. –

+0

Einmal beschreibbare Eigenschaften mit einem exposed Setter sind nicht sauber, aber solche Eigenschaften kombiniert mit einer 'TrySet' Methode, die' CompareExchange' verwendet, können nützliche Thread-Sicherheitsmerkmale haben. In einer Implementierung einer Linked-List-Queue beispielsweise ist der "Nächste" -Zeiger eines gegebenen Objekts entweder "Null" (für das letzte Objekt) oder verweist auf ein anderes Objekt. Code, der an die Warteschlange angehängt werden soll, kann versuchen, auf den "nächsten" Zeiger des letzten Elements zu schreiben; Wenn es fehlschlägt, muss es den "nächsten" Zeigern folgen, bis es den neuen letzten Eintrag findet, und es erneut versuchen. – supercat

+0

@supercat: einverstanden, aber dann sollte der Setter eine separate Methode sein (wie TrySet), kein Proeprty Setter. Also würde ich argumentieren, "das ist nicht wirklich eine einmal beschreibbare Eigenschaft". – peterchen

0

Der "sauberste" Weg wäre, es überhaupt nicht zu tun und Auto-Eigenschaften zu verwenden. Ich sehe auch nicht die Notwendigkeit dafür. Ist es wirklich so wichtig, dass sie nur einmal geschrieben werden können? Wenn ja, würde ich definitiv mit einem Konstruktor gehen, der Werte für alle Eigenschaften als Parameter akzeptiert.

+0

Ein Beispiel für eine Eigenschaft, für die ich dies verwenden würde, ist eine "ID" -Eigenschaft, dh ein eindeutiger Bezeichner für die Klasse. Es ist nicht Leben oder Tod, aber es würde sicherstellen, dass die "ID" nicht von anderem Code verändert wird. Ich bin nicht so vertraut mit Auto-Eigenschaften, außer zu wissen, dass sie nicht in der VB-Version, die ich verwende, unterstützt werden. Ist es möglich, sie einmal schreiben zu lassen? –

2

Ich weiß, es ist schon fast 3 Jahre, aber hier ist meine Lösung, die ich denke, ist besser:

public class Site 
{ 
    private int miID; 

    public Site(int iNewID, string sName) 
    { 
     miID = iNewID; 
     Name = sName; 
    } 
    // The ID property can only be set once in the constructor 
    public int ID 
    { 
     get { return miID; } 
    } 
    public string Name { get; set; } 
} 
+3

Willkommen bei StackOverflow! Sie sollten versuchen zu erklären, warum Sie denken, dass Ihre Lösung besser ist. – nalply