Pregunta

Me ha picado un par de veces por las declaraciones en VB.NET (no sé si existe este efecto en C #) que parecen ser auto-referencia, pero cuando son ejecutadas, que en realidad no hacen nada debido a que requieren un objetivo y no se proporciona. Por ejemplo:

Dim MyString as string = "String to test"

' Neither of these lines do anything '
MyString.Replace(" ", "-")
MyString.Substring(0,5)

' This will return the original string, because neither statement did anything '
Messagebox.Show(MyString)

En ambos casos, no parece molestar a .NET que la declaración necesita un objetivo de asignar el resultado a, y no me importa que uno. ¿Hay una razón por la que el IDE / compilador no me advierten de este efecto, o que una excepción "StatementDoesntDoAnything" no se tira? Dado que el código está formado de tal manera que nunca va a cambiar nada, está claro que es introducida por error.

¿Fue útil?

Solución

Puede ser difícil decir que ignorar el valor de retorno no es la intención, ya que algunas funciones hacen algunos efectos secundarios y devolver un valor.

Las funciones que "simplemente" valores de retorno tendría que ser marcado como tal para que el compilador de los revise, y que no ha sido una prioridad o considera que tienen suficiente retorno de la inversión (obviamente, de lo contrario habrían hecho que:.)

Otros consejos

Sí, sería genial si los métodos que no tienen efectos secundarios podrían estar marcados con algún tipo de [NoSideEffectsAttribute ()] para que herramientas como compiladores pueden advertirle, pero en la actualidad no hay tal cosa me es conocida.

Sin embargo, usted podría intentar FxCop, se puede detectar una gran cantidad de errores de programación sutiles en NET.

Hay muchos casos en los métodos devuelven valores que están opcionalmente manejado por el programador. No hay manera para que el compilador sabe que este método en particular no hace nada. Que podría tener un efecto secundario y el hecho de que elige no hacer nada con el valor devuelto por el método ha de ser una decisión consciente de su parte.

Si el compilador elegir para advertirle de todos los casos que esto sucedió por lo que recibirá demasiados avisos falsos.

A menudo es difícil para el compilador para determinar si las funciones de "hacer algo". A menos que el compilador hace rigurosos href="http://en.wikipedia.org/wiki/Interprocedural_optimization" Análisis Inter-Procedimiento (IPA), que no puede determinar si la función llamada tiene un efecto secundario.

IPA es un proceso lento que aumenta significativamente los requisitos de memoria compiladores lo que por defecto la mayoría de los compiladores no realizan esta.

Este comportamiento se hereda de C, C ++, y fue hecho orioginally para que pueda elegir si desea o no utilizar el valor de retorno de una función / método ... Cuando se escribe una función / método que hace un montón de cosas y luego devuelve algún valor, cuando se llama a él, usted tiene la opción de escribir

variableName = functionName([parameterlist]);  

Si desea utilizar el valor returnb en algo, o simplemente

functionName([parameterlist]);  

si no lo hace.

Para los métodos de funciones que tienen efectos secundarios (como los que mencionas) como se ha señalado, esto no acaba de tener sentido, pero cambiándolo de nuevos lenguajes iría en contra de la larga historia de muchos otros lenguajes que conforman a esta norma ...

No estoy seguro de que tiene otra palabra clave para forzar o no el valor de retorno para ser puesto en una variable sería una buena idea por diversas razones

1) Supongamos que se agrega una palabra clave cuando el valor de retorno es optinal (por lo tanto dando a entender por lo general es obligatoria) causaría una gran cantidad de código para detener la compilación o toneladas emitidas de advertencia

2) Supongamos que se hace a la inversa, la adición de una palabra clave cuando el valor de retorno es forzado, algunas personas simplemente utilizar variables ficticias para almacenarlos y seguir usando el camino allí para acostumbrarse.

3) No creo que mucha gente se fija el tiempo para reflexionar sobre si o no el valor de retorno es opcional o no. En algún caso, tengo que admitir que se le da, pero no siempre.

Considere el método Dictionary<TKey, TValue>.TryGetValue(TKey key, out TValue value): comprueba si la clave está en el diccionario, y si lo es, se pone el valor en el parámetro out. El valor de retorno es un bool que indica si la operación fue un éxito. A veces se preocupa; a veces no lo hace. Creo que este es un enfoque muy aceptado para métodos como éste; si el compilador se ve obligado a asignar el valor devuelto a una variable, la gente tiene una gran cantidad de código como el siguiente:

int someValue = 0;
bool discard = IntDictionary.TryGetValue("key", out someValue);

// I don't even care if discard is true or false;
// someValue will be 0 if it wasn't in IntDictionary
  

Me ha picado un par de veces por

saltar a conclusiones, no por

  

declaraciones en VB.NET ... ... que en realidad no hacer nada

pero que en realidad están muy bien documentados.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top