2010-06-03 5 views
8

Eventuali duplicati:
“const correctness” in C#Perché C# non è stato progettato con 'const' per variabili e metodi?

ho il sospetto const è stata semplificata per il C# spec per semplicità linguaggio generale. C'è una ragione specifica per cui non possiamo dichiarare riferimenti o metodi variabili come const come possiamo fare con C++? ad esempio:

const MyObject o = new MyObject(); // Want const cast referenece of MyObject 
o.SomeMethod(); // Theoretically legal because SomeMethod is const 
o.ChangeStuff(); // Theoretically illegal because ChangeStuff is not const 

class MyObject 
{ 
    public int val = 0; 

    public void SomeMethod() const 
    { 
     // Do stuff, but can't mutate due to const declaration. 
    } 

    public void ChangeStuff() 
    { 
     // Code mutates this instance. Can't call with const reference. 
     val++; 
    } 
} 
+1

Si intende, inoltre, "Perché C++ - stile' const'ness ha implicazioni di vasta portata che sono davvero difficili da fare correttamente (sia dal punto di vista della progettazione e dell'implementazione POV) che per il quale non esiste il supporto di runtime "? È una funzionalità utile, ma davvero costosa. FWIW, F # ha l'approccio opposto: * Nulla * è modificabile a meno che non sia dichiarato come tale. Le interazioni con il framework possono essere non ovvi, però. –

+0

Non sono d'accordo che si tratti di un duplicato esatto. La vecchia domanda chiede come implementarlo nel codice. @spoulson chiede perché non è nel compilatore. –

+1

La correttezza di Const deve essere applicata per essere significativa. Questo diventa difficile quando qualsiasi linguaggio abilitato .NET può consumare i tipi creati da un'altra lingua. Probabilmente ce ne sono quasi un centinaio. La sintassi di tutti questi linguaggi dovrebbe essere modificata per consentire la dichiarazione degli attributi const e dei relativi compilatori ottimizzati per verificarli. In altre parole, la correttezza const è drasticamente non conforme a CLS. –

risposta

0

Sospetto che la prima frase della tua domanda lo risponda.

1

Un const esegui una sostituzione fase di compilazione del valore ovunque sia utilizzato e pertanto non ha significato runtime. In generale ciò che si propone per gli oggetti const sarebbe molto difficile da determinare per il compilatore (se un metodo modificasse l'oggetto o meno). La tua proposta di usare una parola chiave const come modificatore di accesso mette poi un peso sullo scrittore e ti rimane ancora un problema di verifica di qualcosa che fa o non modifica l'oggetto. Inoltre stai imponendo qualcosa sull'oggetto che non ha significato in tutti i contesti. Cosa significa se il metodo è const ma non lo si utilizza come oggetto const? La funzionalità che si desidera è in genere realizzata implementando un'interfaccia e esponendo solo le parti "di sola lettura" della classe.

Problemi correlati