A diferencia de C++, no hay ningún método miembro y parámetros const en C#. ¿Cual es la razon?¿Por qué no hay un método de miembro constante en C# y parámetro const?
Respuesta
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.
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 **. –
(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 *. –
@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
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.
Hay un artículo decente here por Stan Lippman.
Esa es * mi * pregunta citada en el enlace. :-) –
La fecha para esa pregunta/respuesta es 2004-01-22. –
- 1. Modificación miembro de referencia del método constante en C++
- 2. C++ función de miembro const que devuelve un puntero const .. Pero, ¿qué tipo de const es el puntero devuelto?
- 3. ¿Por qué el soporte de C# no es const en un nivel de clase/método?
- 4. Llamar a una función de miembro no const desde una función de miembro constante
- 5. const char * como un parámetro de la función en C++
- 6. Parámetro pasado por referencia const devuelto por const referencia
- 7. Inicialización en C++ de variable de miembro estático no constante?
- 8. ¿Por qué no hay un método Convert.toFloat()?
- 9. Funciones de miembro constante
- 10. Problemas con const resolución/no constante sobrecarga
- 11. objeto constante y constructor const
- 12. const y no const methods in C++?
- 13. C++ función: transmitir argumento que no es const al parámetro de referencia constante
- 14. ¿Por qué C# no permite un typeof como parámetro predeterminado?
- 15. C++ Inicialización de miembro de estructura constante
- 16. ¿Por qué el parámetro argv para execvp no es const?
- 17. ¿Cuál es la diferencia entre una función de miembro const y una función de miembro no const?
- 18. const y no const en contenedores STL
- 19. operador de fundición - const vs no constante
- 20. por qué no hay un método de eliminación en HttpWebResponse
- 21. En C++, ¿por qué el compilador elige la función no const cuando la const también funciona?
- 22. ¿Por qué no puedo convertir 'char **' a 'const char * const *' en C?
- 23. ¿Qué significa el operador const cuando se usa con un método en C++?
- 24. Modificación de un const través de un puntero no constante
- 25. Distinguir entre const y el método no constante con el mismo nombre en boost :: bind
- 26. const int vs const int como parámetro de la función en C++ y C
- 27. ¿Por qué no hay método Service.onStop?
- 28. variable const como parámetro de plantilla sin tipo (VARIABLE no puede aparecer en una expresión constante)
- 29. ¿Sobrescribe un método virtual no const ocultar una sobrecarga const?
- 30. ¿Por qué el puntero no const se trata como un const cuando se usa typedef?
Consulte estas preguntas duplicadas: http://stackoverflow.com/questions/3263001/why-const-parameters-are-not-allowed-in-c http://stackoverflow.com/questions/114149/const-correctness -in-c – Yoshi
+1 para la pregunta analítica – CloudyMarble