2010-11-11 11 views

Respuesta

25

En primer lugar, no es necesario proporcionar un motivo para y no para implementar una función. Las características son extremadamente costosas; tiene que haber una justificación para que implementa una característica, no es una justificación para que no es que implementa una característica.

En segundo lugar, C# no es un clon de C++ o C. El hecho de que una característica esté en otro idioma no es razón para ponerlo en C#.

En tercer lugar, "const" se rompe profundamente, trágicamente en C y C++. "const" no te garantiza que realmente puedas confiar. Si usted es el que llama de un método que toma una referencia constante entonces usted tiene ninguna garantía que el método respete la constness; el método tiene muchas formas de mutar una referencia constante. Si usted es el consumidor de una referencia constante, entonces no tiene garantía de que el objeto subyacente en realidad no muteará arbitrariamente. Dado que el contrato no se aplica a la persona que llama o al que llama, es mucho más débil que cualquier otra garantía que nos gustaría hacer en el sistema de tipos. No querríamos replicar un sistema tan roto.

En cuarto lugar, poniendo constness en el sistema de tipo CLR significa que cada lenguaje tendría que utilizar la misma implementación de constness; dado que diferentes idiomas tienen diferentes significados para constness, eso haría que sea más difícil para traer más idiomas al CLR, no más fácil.

Hay muchas razones para no hacer esta característica extremadamente costosa, y muy pocas razones para hacerlo. Las características costosas e injustificadas no se implementan.

+16

Tiene razón en que el consumidor de una referencia 'const' no puede esperar que el referente no se modifique en otro lugar. 'const' (como un calificador en los punteros y las referencias) tiene que ver con compartir una vista de solo lectura de un objeto, sin hacer que los objetos sean inmutables. Pero no estoy de acuerdo con que sea inútil. Si una función acepta una referencia const (o puntero-a-const), ** es mejor que no intente modificar el objeto referenciado, excepto como lo permita el modificador 'mutable', porque podría haber pasado en un objeto realmente constante almacenado en la memoria de solo lectura **. –

+11

(continúa) C++ 'const_cast' (y mecanismos equivalentes para stripping' const') están prohibidos a menos que la función pueda garantizar que el objeto no estaba 'const' en el punto de definición, lo que efectivamente limita su uso a funciones privadas de ayuda interna.Para una API pública en C++ tratar de modificar un objeto pasado a través de 'const' referencia (o puntero) viola el estándar e invoca * comportamiento indefinido *. –

+0

@Ben Voigt: Si hago algo que está prohibido, quiero que la aplicación se niegue a compilar. Si no es posible detectar el comportamiento prohibido en el tiempo de ejecución, quiero que tenga un método de falla definido en el tiempo de ejecución (por ejemplo, lanzar una excepción). – Brian

7

C# no lo tiene porque .NET no lo tiene. .NET no lo hace porque el equipo de desarrollo de CLR decidió que no valía la pena el esfuerzo.

Puede leer en blogs de MS como "The Old New Thing" de Raymond Chen o "Fabulous Adventures in Coding" de Eric Lippert, how Microsoft prioritizes features.

2

Hay un artículo decente here por Stan Lippman.

+0

Esa es * mi * pregunta citada en el enlace. :-) –

+0

La fecha para esa pregunta/respuesta es 2004-01-22. –

Cuestiones relacionadas