2010-11-11 5 views

Antwort

25

Zunächst einmal gibt es keine Anforderung, dass wir einen Grund für nicht eine Funktion implementieren. Features sind extrem teuer; Es muss eine Begründung für für die Implementierung einer Funktion, nicht eine Begründung für nicht eine Funktion implementieren.

Zweitens ist C# nicht ein Klon von C++ oder C Nur weil ein Merkmal in einer anderen Sprache ist kein Grund, ist es in C# zu setzen.

Drittens "const" tief ist, gebrochen auf tragische Weise in C und C++. "const" gibt dir keine Garantie, auf die du dich wirklich verlassen kannst. Wenn Sie der Aufrufer einer Methode sind, die eine const-Referenz verwendet, dann haben Sie keine Garantie, dass die Methode die Constness ehrt; Die Methode hat viele Möglichkeiten, eine Konstante const zu mutieren. Wenn Sie der Consumer einer Const-Referenz sind, dann haben Sie keine Garantie, dass das zugrundeliegende Objekt tatsächlich nicht beliebig mutieren wird. Da der Vertrag weder auf der Anrufer noch auf der Angerufenen Seite durchgesetzt wird, ist es weit schwächer als jede andere Garantie, die wir im Typsystem machen möchten. Wir würden solch ein kaputtes System nicht replizieren wollen.

Viertens Konstantheit in dem CLR-Typsystem setzen bedeutet, dass jede Sprache die gleiche Implementierung von Konstantheit verwenden, müßte; da verschiedene Sprachen verschiedene Bedeutungen für Konstantheit haben, was das wäre es härter mehr Sprachen auf die CLR zu bringen, nicht einfacher.

Es gibt viele Gründe für die nicht diese extrem teuer Funktion tun, und nur sehr wenige Gründe, es zu tun. Teure, ungerechtfertigte Features werden nicht implementiert.

+16

Sie haben Recht, dass der Konsument einer "const" -Referenz nicht erwarten kann, dass der Referent an keiner anderen Stelle geändert wird. 'const' (als ein Qualifikationsmerkmal für Zeiger und Referenzen) handelt davon, eine schreibgeschützte Ansicht eines Objekts zu teilen und Objekte nicht unveränderbar zu machen. Aber ich stimme nicht zu, dass es nutzlos ist. Wenn eine Funktion eine const-Referenz (oder pointer-to-const) akzeptiert, ** sollte sie besser nicht versuchen, das referenzierte Objekt zu modifizieren, außer wie durch den Modifier "mutable" erlaubt, da ich möglicherweise ein wirklich konstantes Objekt übergeben habe im Nur-Lese-Speicher **. –

+11

(Fortsetzung) C++ 'const_cast' (und äquivalente Mechanismen zum Entfernen von' const') sind verboten, es sei denn, die Funktion kann garantieren, dass das Objekt zum Zeitpunkt der Definition nicht "const" war, was ihre Verwendung auf private interne Hilfsfunktionen einschränkt.Für eine öffentliche API in C++, die versucht, ein über 'const' übergebenes Objekt zu modifizieren, verletzt die Referenz (oder der Zeiger) den Standard und ruft * undefiniertes Verhalten * auf. –

+0

@Ben Voigt: Wenn ich etwas mache, das verboten ist, möchte ich, dass die Anwendung die Kompilierung verweigert. Wenn das Erkennen des verbotenen Verhaltens zur Laufzeit nicht möglich ist, möchte ich, dass es zur Laufzeit eine definierte Fehlermethode hat (z. B. eine Ausnahme auslöst). – Brian

7

C# hat es nicht, weil .NET nicht. .NET nicht, weil das CLR-Entwicklerteam entschieden hat, dass es sich nicht lohnt.

Sie können auf MS-Blogs wie Raymond Chens "The Old New Thing" oder Eric Lipperts "Fabulous Adventures in Coding", how Microsoft prioritizes features lesen.

2

Es gibt einen guten Artikel here von Stan Lippman.

+0

Das ist * meine * Frage, die in dem Link zitiert wird. :-) –

+0

Das Datum für diese Frage/Antwort ist 2004-01-22. –

Verwandte Themen