2010-01-12 13 views
7

Jaki jest najlepszy sposób utworzenia właściwości klasy "Napisz raz, czytaj wiele", aby można było ustawić tę właściwość tylko raz?Jak utworzyć właściwość "Write Once Read Many" w VB.NET?

Wiem, że mógłbym przekazać wszystkie właściwości w konstruktorze i uczynić je ReadOnly, ale w przypadkach z wieloma właściwościami nie chcę konstruktora, który ma ponad 20 argumentów.

Ponadto zdaję sobie sprawę, że mogę "toczyć własne" setery, ale konieczność zrobienia tego dla każdej nieruchomości wydaje się być wiązką zbędnego kodowania.

Czy jest to czysty sposób w VB 2008 .NET 3.5?

+2

związane: http://stackoverflow.com/questions/1079292/should-i-use-set- once-variables/1079316 – peterchen

Odpowiedz

2

Pisz raz właściwość nigdy nie jest "czysta".

Zalecam utworzenie konstruktora/klasy fabrycznej, aby uniknąć 20-punktowej kalibracji. (Tak, wiem, że jest sporo typowania)

Podobny dyskusja tutaj: Should I use set once variables?

[edit] Co więcej, nawet jeśli nalegać nie widzę innej opcji niż walcowanie własnych ustawiające, które jest dużo pisania też.

+0

Dzięki. Powiązany przeze mnie post wyjaśnia wiele, a ja zgadzam się z zasadą "Najlżejsze niespodzianki". Korzystanie z programu budującego może być najlepszym rozwiązaniem. –

+0

Właściwości jednokrotnego zapisu z wyeksponowanymi seterami nie są czyste, ale takie właściwości w połączeniu z metodą "TrySet", która używa 'PorównajExchange' może mieć użyteczną charakterystykę bezpieczeństwa gwintów. Na przykład w implementacji kolejki z listą odsyłaczy "następny" wskaźnik danego elementu będzie miał wartość "null" (dla ostatniego elementu) lub wskazuje inny element. Kod, który chce dołączyć do kolejki, może próbować pisać do "następnego" wskaźnika ostatniego elementu; jeśli się nie powiedzie, musi podążać za następnymi wskazówkami, aż znajdzie ostatni nowy element i spróbować ponownie. – supercat

+0

@supercat: uzgodniono, ale wtedy seter powinien być osobną metodą (jak TrySet), a nie nastawcą proeprty. Tak więc twierdzę, że "nie jest to tak naprawdę własność typu" pisz raz ". – peterchen

0

"Najczystszym" sposobem byłoby nie robić tego w ogóle i używać właściwości auto. Nie widzę też potrzeby. Czy to naprawdę tak ważne, że można je zapisać tylko raz? Jeśli tak, zdecydowanie skorzystam z konstruktora, który przyjmuje wartości dla wszystkich właściwości jako parametry.

+0

Przykładem właściwości, której użyłbym, jest własność "ID", która jest unikalnym identyfikatorem dla klasy. To nie jest życie ani śmierć, ale zapewniłoby to, że "ID" nie zostanie zmieniony przez inny kod. Nie jestem zaznajomiony z Auto Properties, poza tym, że nie są one obsługiwane w wersji VB, której używam. Czy można je zapisać po przeczytaniu wielu? –

2

wiem, że to już prawie 3 lata, ale tutaj jest moje rozwiązanie, które moim zdaniem jest lepsze:

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

Witamy w StackOverflow! Powinieneś spróbować wyjaśnić, dlaczego uważasz, że twoje rozwiązanie jest lepsze. – nalply