2011-10-13 14 views
14

Czy można używać klasy podobnej do tej (projekt/wytyczne)? Używam wzoru MVVM.Ciąg stałych publicznych?

public static class Pages 
{ 
    public const string Home = "Home.xaml"; 
    public const string View2 = "View2.xaml"; 
    /* a few more... */ 
} 
+2

Dla publicznej widoczności wolałbym 'statyczny readonly' na' const', ponieważ wtedy jesteś w stanie zmienić wartość później bez potrzeby ponownej kompilacji. – mgronber

+3

@mgronber: To zależy od kontekstu. W większości kontekstów, w których się rozwinąłem, jeśli zmienisz jeden zestaw, w końcu przekompilujesz klientów tego zestawu, zanim użyjesz nowej wersji. –

Odpowiedz

24

Istnieją znaczne różnice między const i public static readonly i należy rozważyć, które do korzystania z opieki:

(przez „klient” tutaj, mam na myśli „kodu w inny zespół odnosi się do członka.)

  • w przypadku zmiany wartości, ale nie skompilować klientów, będą jeśli używasz const nadal używać oryginalnej wartości. z public static readonly, ujrzą zaktualizowaną wartość. Jeśli rekompilacji wszyscy klienci sposób, to nie jest problem.
  • tylko forma const jest kompilacji czas na stałym poziomie, co oznacza, że ​​może on być stosowany w:
    • Atrybut arguments
    • oświadczenia przełącznik
    • opcjonalne deklaracje parametrów

Jeśli” z przyjemnością przekompilujesz wszystkich klientów, jeśli kiedykolwiek zmienisz wartość, korzyści z drugiego punktu punktowego w kierunku używania const.

Oczywiście, zastanawiam się, czy Pagesnaprawdę musi być publiczny i tak ... to brzmi jak coś, co mogłoby być internal z internal członków - w tym momencie downsides z const odejść całkowicie.

2

Ogólna instrukcja korzystania z const do definiowania stałych wartości. Czy te stałe mają być dostępne poza złożeniem? Jeśli nie, to zadeklarować ją jako

internal static class Pages 
{ 
    public const string Home = "Home.xaml"; 
    public const string View2 = "View2.xaml"; 
    /* a few more... */ 
} 
+0

Zdecydowanie warto zrozumieć zalety i wady przed udzieleniem powszechnej porady "używaj statycznego readonly zamiast const". Zastanów się nad kontekstem, w którym, jeśli montaż X ulegnie zmianie, wszyscy klienci i tak zostaną odbudowani - dość często spotykany kontekst w firmach. Czy to zmienia twoją radę? –

+0

@JonSkeet To nie było coś, co musisz użyć tylko do odczytu! Już zadałem pytanie z odpowiedzią. Tak naprawdę nie myślę w tym przypadku, że klasa publiczna jest konieczna, więc zasugerowałem użycie klasy wewnętrznej. Pomyślałem również, że warto wiedzieć o tym, jak działa const i readonly; dlatego link do przedmiotu. W każdym razie, powinienem zgodzić się z tym, co tutaj zasugerowałeś. :-) – AksharRoop

+2

Cóż, w zasadzie powiedziałeś "jeśli musi być publiczny, używaj publicznych statycznych tylko do odczytu". Jeśli ktoś czytający tę stronę nie ma Efektywnego C#, nie osiągnie o wiele większego oświecenia w przypadkach, w których w rzeczywistości jest to * nie * dotyczy porady, nawet jeśli powinna być publiczna. –

2

Wygląda na to, że z perspektywy projektowej pytanie może stać się niechlujne, ponieważ pojedynczy obiekt statyczny zawiera wszystkie odwołania do stron. Czy nie możesz po prostu zapisać go w rzeczywistym obiekcie strony?

class view2 { 
    public const string PageName = "View2.xaml"; 

    ... other stuff ... 
} 

następnie wywołać ją wzdłuż linii ...

goTo(view2.PageName); 
0

Myślę, że to jedna z najlepszych rzeczy, które możesz zrobić. Kilka innych sugestii: ze stringami idealnie nadaje się do używania const s. Jeśli chcesz używać różnych typów, użyj static readonly, a następnie zainicjuj w konstruktorze static.

Aby uzyskać inne podejście, używając przeliczeń, zobacz this thread. Ponieważ to, co próbujesz zrobić, wygląda jak wyliczenie ciągu, to może być dla ciebie sposób.

Pamiętaj, że dopóki podajesz swoje strony w kodzie, wprowadzanie zmian (np. Zmiana nazwy lub przenoszenie strony) będzie uciążliwe. Zastanów się, używając czegoś w rodzaju zasobów lub map witryn. (W przypadku tylko użyć klasy do listy stron, pójdę z użyciem C# 's silnie wpisane zasobów - będą zachowywać się w taki sam sposób, jak swojej klasie i nie będzie trzeba je kodować ręcznie.)