2010-06-03 5 views
8

Mögliche Duplizieren:
“const correctness” in C#Warum wurde C# nicht mit 'const' für Variablen und Methoden entworfen?

Ich vermute const wurde für die allgemeine Sprache Einfachheit für den C# spec vereinfacht. Gab es einen bestimmten Grund, warum wir keine Variablenreferenzen oder Methoden wie const deklarieren können, wie wir es mit C++ können? Beispiel:

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

Du meint, außer „Weil C++ - Stil' const'ness hat weitreichende Folgen, die wirklich schwer zu Recht zu tun (sowohl in Design und Implementierung POV) und für die es keine Laufzeitunterstützung“? Es ist eine nützliche, aber sehr teure Funktion. FWIW, F # nimmt den umgekehrten Weg: * Nichts * ist änderbar, wenn es nicht als solches deklariert wird. Interaktionen mit dem Framework können jedoch nicht offensichtlich sein. –

+0

Ich stimme nicht zu, dass dies ein exaktes Duplikat ist. Die alte Frage fragt, wie dies im Code implementiert werden kann. @spoulson fragt, warum es nicht im Compiler ist. –

+1

Const Korrektheit muss durchgesetzt werden, um sinnvoll zu sein. Das wird schwierig, wenn eine .NET-fähige Sprache die von einer anderen Sprache erstellten Typen konsumieren kann. Es sind wahrscheinlich fast hundert von ihnen. Die Syntax all dieser Sprachen müsste geändert werden, um const-Attribute zu deklarieren und ihre Compiler zu optimieren, um sie zu verifizieren. Mit anderen Worten, const Korrektheit ist drastisch Nicht-CLS-konform. –

Antwort

0

Ich vermute, der erste Satz Ihrer Frage beantwortet es.

1

A const führt eine Kompilierung Substitution des Wertes überall dort, wo es verwendet wird und daher keine Laufzeit Bedeutung hat. Im Allgemeinen ist es für den Compiler sehr schwierig, was Sie für konstante Objekte vorschlagen (wenn eine Methode das Objekt ändert oder nicht). Ihr Vorschlag, ein const-Schlüsselwort als Zugriffsmodifizierer zu verwenden, belastet den Writer ebenfalls, und Sie haben immer noch ein Problem mit der Überprüfung, ob etwas das Objekt ändert oder nicht. Außerdem drückst du etwas auf das Objekt, das in allen Kontexten keine Bedeutung hat. Was bedeutet es, wenn die Methode const ist, aber Sie verwenden es nicht als const-Objekt? Die gewünschte Funktionalität wird in der Regel durch Implementieren einer Schnittstelle und Aussetzen der "schreibgeschützten" Teile der Klasse erreicht.

Verwandte Themen