¿Puedo ignorar la advertencia CodeAnalysis: sustituir cadena == “” con String.IsNullOrEmpty?

StackOverflow https://stackoverflow.com/questions/1661024

  •  12-09-2019
  •  | 
  •  

Pregunta

Tengo un código similar al siguiente:

string s = CreateString();
if (s == "") foo(s);

Si s es igual a "", foo debe ser llamado. Si la cadena es nula, que nunca debe suceder, entonces un NullReferenceException está muy bien (ya que esto es, después de todo, una situación excepcional).

CodeAnalysis me dice que la prueba de s.IsNullOrEmpty. Esto alteraría la funcionalidad de una manera nunintended.

El rendimiento no es un problema.

¿Es seguro suprimir la advertencia CA1820 asociado?

Editar:. Actualización ejemplo de código y el texto para reflejar mejor mi caso

Editar: Este es el (ligeramente alterada) código real (que está en una aplicación IXmlSerializable estándar):

public void ReadXml (XmlReader reader)
    // ...
    string img = reader.ReadElementString ("Image");
    if (img != "") {
        Image = Image.FromFile(img);
    }
    // ...
¿Fue útil?

Solución

Se comportan de manera diferente con respecto a los nulos, por lo que depende de lo que desea que suceda; usted menciona que NullReferenceException estaría bien, pero no hay nada en el código citó que elevaría esto, por lo tanto, por lo que podría causar errores inesperados aguas abajo.

Nunca Tienes , pero siempre me siento tentado a añadir:

static bool IsNullOrEmpty(this string value) {
    return string.IsNullOrEmpty(value);
}

para que pueda utilizar:

if (s.IsNullOrEmpty()) foo();

Otros consejos

Especificaciones:

  

Si s es igual a "", foo debe ser llamado.   Si la cadena es nula, que nunca debe   pasar, a continuación, un NullReferenceException   está muy bien.

probar la cadena de longitud como aconsejó en la regla CodeAnalysis :

if (s.Length == 0) foo(s);

Su pregunta:

  

¿Es seguro para suprimir el asociado   advertencia CA1820?

Puede ignorarlo, el código funciona, pero yo no aconsejaría que, sigue las directrices como todo lo que pueda. Incluso si el tema (rendimiento) no es un problema, su código será más consistente y que se acostumbre a escribir código estándar.

Cada advertencia de análisis de código ha asociado la documentación que se puede acceder por highligting la advertencia y pulsar F1 . También puede hacer clic en el elemento para obtener ayuda.

En cualquier caso, aquí está el href="http://msdn.microsoft.com/en-us/library/ms182279.aspx" rel="nofollow documentación que explica que en particular la advertencia .

De acuerdo con la documentación que, es "seguro para suprimir una advertencia de esta regla si el rendimiento no es un problema".

Sería mejor escribir la prueba como:

if(s != null && s == "")

A continuación, puede procesar un valor nulo en otra sentencia if

Usted no está realmente haciendo caso omiso de la advertencia, que has mirado el código y decidió que la advertencia no se aplica. Esta es una condición perfectamente razonable bajo las que suprimir la advertencia.

La especulación pura

Me gustaría saber un poco más sobre lo que estaba tratando de hacer, sin embargo. Sospecho que puede haber una mejor manera de manejar la situación. El modelo me recuerda de devolver un mensaje de error o vacío para indicar el éxito de un método. Si ese es el caso, yo consideraría regresar ya sea nulo y lanzar una excepción en caso de fallo o regresar bool y sólo lanzar excepciones cuando el mensaje es crítico y devolver verdadero / falso en caso contrario.

Si bien es nula, podrás bien de cualquier manera.

Sí.

Pero estoy de acuerdo con CodeAnalysis con String.IsNullOrEmpty es una opción segura.

No manejo de excepciones, mientras que puedas es gennerally una mala idea por lo que CA está justo en que sea necesario para el tratamiento nulo como vacío o controlar la excepción. A excepción de referencia nula causada por el uso de un valor de retorno es una cosa muy mala. Por lo menos poner en un Debug.Assert (s! = Null) y compare con String.Empty

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