2009-05-09 3 views
21

Perché C# non consente const e static sulla stessa riga? In Java, devi dichiarare un campo come "statico" e "finale" per agire come una costante. Perché C# non ti permette di dichiarare const come definitivo?Perché C# non consente const e static sulla stessa riga?

Faccio inoltre l'ulteriore distinzione che in Java ogni interfaccia sia pubblica e astratta, indipendentemente dal fatto che sia dichiarata o meno esplicitamente. Non sono davvero di natura statica? Perchè C# si ferma a questo?

+0

Pensavo avessi detto di aver scambiato di nuovo a Jave. Quindi, perché dovrebbe importare! ;) –

+0

B/c ora sono curioso =) Davvero non capisco perché si tratta di un errore di compilazione se si tratta solo di affermare esplicitamente ciò che è intrinsecamente vero. – Cuga

+0

Mmm forse perché Java non supporta le costanti direttamente, ecco perché devi usare const statico per ottenere una costante .. mentre const in C# sono statiche per natura come Greg citato e sono impostate in fase di compilazione. Alcune persone confondono statico readonly in C# che può avere il valore impostato in fase di esecuzione. – jasonco

risposta

37

const e statico significano davvero cose diverse, meccanismo di memorizzazione diverso, inizializzazione diversa. statico è di lettura/scrittura, pertanto deve disporre di memoria allocata per la memorizzazione e deve essere inizializzata in fase di runtime. A statico può essere inizializzato con un valore letterale o un'espressione. Al contrario, un const è immutabile e deve essere inizializzato con una costante di tempo di compilazione (in genere un valore letterale o un'espressione che può essere completamente valutata in fase di compilazione). Il valore è noto al momento della compilazione in modo che possa essere incorporato direttamente nel codice generato, quindi non richiede alcuna memoria da allocare in fase di runtime.

+0

Vero, costante e statico significano cose diverse. Ma 'const' e 'statico finale' ... qual è la differenza lì? – Cuga

+0

La domanda si riferisce a C# - non esiste una parola chiave 'finale' in C#. –

+0

Mentre la domanda originale era 'const' vs 'static final' (non solo statica e quindi a entrambi viene negato il permesso 'write'), mi hai convinto che l'allocazione di memoria o qualcosa del genere deve essere la ragione. – Cuga

22

Le costanti per loro natura sono statiche, quindi sarebbe ridondante.

+0

Giusto, ma come ho detto ... Java ti consente di dichiarare un'interfaccia come "pubblica" e "astratta". È inerente, quindi non è un errore. Quindi, perché è un errore in C# se si specifica in modo esplicito ciò che è inerente? – Cuga

+9

Ridurre la scelta non necessaria è una buona idea in generale, IMO. – Sake

+1

Ti darò questo. Considero il tuo commento come la migliore risposta finora. – Cuga

1

Perché consentire e non richiedere modificatori intrinseci può causare confusione. Se vedi

static const int A = 3 
const int B = 5 

potresti credere che siano 2 diversi tipi di costanti.
Anche VB 2008 (che può essere molto prolisso se lo si desidera) non lo consente.

+0

Questa non è la ragione (anche se potresti avere ragione a causa della confusione). Ad esempio, se dichiaro un campo e non gli do alcun modificatore di accesso, è pubblico, privato, statico, interno, cosa? Il valore predefinito è privato, ma non devi dichiararlo esplicitamente. La ragione per cui static e const non possono essere usati insieme è perché implicano meccanismi di memorizzazione differenti e sono quindi mutuamente esclusivi. –

3

E 'vero che un C# const implies static MA, C# ha un equivalente di finale parola chiave di Java la parola readonly.

Così, infatti, C# permette un const finale, è sola lettura statica in C#.

+1

"static readonly" non è uguale a "const". Una costante verrà compilata così com'è. la lettura statica sarà referenziata dalla posizione originale. Se il valore potrebbe cambiare in futuro o anche all'istante, dovresti usare readonly. Se sarà veramente costante e non cambierà mai (come Natural Log, Pi, ecc.) Allora const è una buona scelta. Altrimenti puoi star meglio con "public static readonly" –

+0

Mi dispiace, mi riferivo a "static final" in Java equivale a "static readonly" in C# (approssimativamente). – LWoodyiii

9

Come detto prima, statica finale in Java è lo stesso di sola lettura statica in C#. In realtà, stai dicendo che questo membro è statico e il suo contenuto non può essere modificato. Inoltre è possibile specificare in entrambi i casi il valore dal costruttore statico.

Ma const in C# è una cosa completamente diversa. È più lungo le linee delle costanti in C (direttive DEFINE) ma con OOP in mente. È statico perché è costante: ogni istanza ha questa costante con lo stesso valore, nessun costruttore può impostarla. Inoltre, è possibile che a qualcuno piacerebbe accedere alla costante senza dover creare un'istanza. Quando ci pensi, la costante non statica non ha senso. Si può quasi dire che le costanti non fanno parte di un oggetto: lo usano solo per fornire un contesto, un nome forte.

Java non ha un valore equivalente a const. È possibile leggere da qualche parte che statico finale equivale a DEFINE ma è solo così vago.Meccanismo completamente diverso, niente in comune ma alla fine il risultato è il codice stesso - migliore manutenibilità e leggibilità del codice.

Devi solo smettere di pensare alle costanti in C# come membri statici perché non lo sono. Considerali come la versione OOP di DEFINE. Quando si considera l'incapsulamento, il solo motivo per i campi finale e a lettura singola è quello di evitare che il proprio codice modifichi accidentalmente il suo valore. E questo non mi sembra costante.

Sumary:

  • finale = sola lettura
  • static final = statica in sola lettura
  • N/A = cost