2011-10-13 12 views
14

Va bene usare una classe come questa (design/linee guida specifiche)? Sto usando MVVM Pattern.Stringa const pubblica?

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

Per la visibilità pubblica preferisco 'static readonly' a' const' perché in seguito è possibile modificare il valore in seguito senza dover ricompilare. – mgronber

+3

@mgronber: dipende dal contesto. Nella maggior parte dei contesti in cui mi sono sviluppato, se si modifica un assembly si finisce comunque per ricompilare i client di quell'assembly prima di utilizzare la nuova versione. –

risposta

24

Ci sono differenze significative tra const e public static readonly, e si dovrebbe prendere in considerazione che da utilizzare con attenzione:

(da "client" qui, voglio dire "Codice in un diverso il montaggio riferendosi al membro.)

  • Se si modifica il valore, ma non ricompilare i clienti, avranno ancora utilizzare il valore originale se si utilizza const. Con public static readonly, vedranno il valore aggiornato. Se si ricompila tutti i clienti modo, questo non è un problema.
  • Solo la forma const è un momento della compilazione costante, che significa che può essere utilizzato in:
    • Attributo argomenti
    • istruzioni switch
    • dichiarazioni di parametri opzionali

Se si' sono felice di ricompilare tutti i tuoi clienti se cambi mai il valore, i benefici del secondo punto puntato verso l'uso di const.

Naturalmente, mi chiedo se Pagesdavvero deve essere pubblico comunque ... che suona come qualcosa che potrebbe essere internal, con internal membri - a quel punto gli aspetti negativi di const andare via del tutto.

2

guida generale quando utilizza const per definire valori costanti. Se è necessario accedere a queste costanti al di fuori dell'assemblaggio? Se poi non dichiararla come

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

Vale sicuramente la pena di comprendere i pro e i contro prima di dare il consiglio universale di "usare statico readonly invece di const". Considera il contesto in cui, se l'assembly X cambia, tutti i client verranno comunque ricostruiti - un contesto abbastanza comune nelle busines. Questo cambia il consiglio che daresti? –

+0

@JonSkeet Non era qualcosa che devi usare in sola lettura! Ho già fatto una domanda con una risposta. Non penso davvero che in questo caso la classe pubblica sia necessaria, quindi ho suggerito di utilizzare la classe interna. Inoltre, ho pensato che fosse utile sapere come funziona const e readonly; quindi, il link per l'articolo. Ad ogni modo, dovrei essere d'accordo con quello che hai suggerito qui. :-) – AksharRoop

+2

Bene, hai praticamente detto "Se deve essere pubblico, usa public statico in sola lettura". Se qualcuno che legge questo sito non ha C# efficace, non otterrà molta illuminazione immediata nei casi in cui effettivamente questo * non * consiglio applicabile anche se dovrebbe essere pubblico. –

2

Dal punto di vista della progettazione della domanda, sembra che potrebbe diventare fastidioso utilizzando un singolo oggetto statico per contenere tutti i riferimenti di pagina. Non puoi semplicemente memorizzarlo nell'oggetto di pagina vero?

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

    ... other stuff ... 
} 

poi chiamano lungo le linee di ...

goTo(view2.PageName); 
0

credo che questo sia uno dei migliori cose che puoi fare. Altri suggerimenti: con le stringhe è perfettamente adatto per usare const s. Nel caso in cui si desideri utilizzare tipi diversi, utilizzare static readonly e quindi inizializzarsi in un costruttore static.

Per un approccio diverso tramite l'enumerazione, vedere this thread. Dal momento che ciò che stai cercando di fare assomiglia molto a un enum stringa, quella potrebbe essere la strada giusta per te.

E non dimenticare che finché si specificano le pagine nel codice, apportare modifiche (ad esempio rinominare o spostare una pagina) sarà un problema. Prendi in considerazione l'utilizzo di qualcosa come risorse o sitemap. (Nel caso in cui solo utilizzare la classe di un elenco di pagine, mi piacerebbe andare con l'utilizzo di C# 's digitati fortemente risorse - si comporteranno nello stesso modo in cui la classe e non dovranno codificarle a mano.)

Problemi correlati