c# - polimorfizm - ¿Por qué es útil acceder a los miembros estáticos "a través" de los tipos heredados?
inherited method c# (2)
Me alegro de que C # no te permita acceder a miembros estáticos "como si" fueran miembros de instancia. Esto evita un error común en Java:
Thread t = new Thread(..);
t.sleep(..); //Probably doesn''t do what the programmer intended.
Por otro lado, le permite acceder a tipos estáticos de miembros derivados. Aparte de los operadores (en los que le impide escribir castes), no puedo pensar en ningún caso en que esto sea realmente útil. De hecho, alienta activamente errores como:
// Nasty surprises ahead - won''t throw; does something unintended:
// Creates a HttpWebRequest instead.
var ftpRequest = FtpWebRequest.Create(@"http://www.stackoverflow.com");
// Something seriously wrong here.
var areRefEqual = Dictionary<string, int>.ReferenceEquals(dict1, dict2);
Personalmente, sigo cometiendo errores similares una y otra vez cuando busco a través de API desconocidas (recuerdo haber comenzado con árboles de expresiones; BinaryExpression.
en el editor y me preguntaba por qué demonios IntelliSense me ofrecía MakeUnary
como opción).
En mi opinión (miope), esta característica:
- No reduce la verbosidad; el programador debe especificar un nombre de tipo de una manera u otra (excluyendo operadores y casos cuando uno está accediendo a miembros estáticos heredados del tipo actual).
- Alienta a los errores / código engañoso como el anterior.
- Puede sugerir al programador que los métodos estáticos en C # exhiban algún tipo de ''polimorfismo'', cuando no lo hacen.
- (Menor) Presenta "silencioso", posiblemente posibilidades de recauchutado involuntarias en la recompilación.
(OMI, los operadores son un caso especial que justifica su propia discusión).
Dado que C # es normalmente un lenguaje "de éxito", ¿por qué existe esta función? No puedo ver sus beneficios (aparte de la ''capacidad de detección'', que siempre podría resolverse en el IDE), pero veo muchos problemas.
Esto es útil en WinForms.
En cualquier control o forma, puede escribir MousePosition
, MouseButtons
o ModifierKeys
para usar los miembros static
heredados de Control
.
Todavía es discutible si fue una buena decisión.
Estoy de acuerdo en que esto es un error. No sé con qué frecuencia alguien en ha publicado el código de:
ASCIIEncoding.ASCII
etc ... que, si bien es inofensivo en términos de ejecución, es engañoso en términos de lectura del código.
Obviamente, es demasiado tarde para eliminar esta "característica" ahora, aunque supongo que el equipo de C # podría introducir un modo de advertencia súper detallado para este y otros problemas de estilo.
Tal vez el sucesor de C # mejore las cosas ...