2011-11-18 15 views
6

¿Es una buena práctica comparar cadenas con ==? ¿Hay un equivalente a s1 == s2 en términos de Compare y Equals métodos en string. Si uno usa esos métodos, sin especificar CultureInfo FxCop dará una advertencia, ¿es eso un problema real?¿Es una buena práctica comparar la cadena C# con '=='?

+0

¿Qué tipo de comparación quieres hacer? –

+1

Depende de lo que esté comparando: el msdn es perfecto para este http://msdn.microsoft.com/en-us/library/cc165449.aspx – JonH

+1

Esta página tiene una buena explicación: http://www.dotnetperls.com/string-equals – keyboardP

Respuesta

14

El operador == es una comparación ordinal, sin conocimiento cultural. Está utilizando la misma llamada interna como .Equals, y está bien para la cadena "habitual" comparar cosas.

Si necesita comparings Cultura-Aware (por ejemplo. Para los propósitos GUI), como el alemán doble-s o ß, utilice

CultureInfo ci = new CultureInfo("de-DE"); 
String.Compare("Strasse", "Straße", true, ci) 
1

Sí, esa práctica está bien. También puede usar String.Compare, y la mejor comparación se encuentra en Best Pratices for Using Strings in the .NET Framework.

Sí, FxCop, dará advertencias, pero las advertencias son advertencias. Si no te importa la cultura, es seguro ignorarlos. Pero, al igual que las advertencias de la vida real, a veces vale la pena prestarles atención.

2

Cuando se comparan cadenas, debe utilizar los métodos que especifican explícitamente qué tipo de comparación que tiene la intención de realizar. Esto hace que su código sea mucho más fácil de mantener y legible. Siempre que sea posible, use las sobrecargas de los métodos de las clases System.String y System.Array que toman un parámetro de enumeración StringComparison, de modo que pueda especificar qué tipo de comparación realizar. Lo mejor es evitar el uso de los operadores == y! = Al comparar cadenas. Además, evite utilizar los métodos de instancia String.CompareTo porque ninguna de las sobrecargas toma un StringComparison.

Dependiendo de sus necesidades, se puede utilizar en los siguientes métodos:

bool result = root.Equals(root2, StringComparison.Ordinal); 
result = root.Equals(root2, StringComparison.OrdinalIgnoreCase); 
bool areEqual = String.Equals(root, root2, StringComparison.Ordinal); 

Fuente para esta respuesta: http://msdn.microsoft.com/en-us/library/cc165449.aspx

2

No es extensivedocumentation en MSDN que habla de ordinal y cultura -sensible comparaciones de cadenas. Las comparaciones Ordinal no se preocupan por la lingüística y, de forma predeterminada, se ocuparán del caso. Las comparaciones sensibles a la cultura se preocupan por la lingüística (casos, punctación, etc.).

Este article en dotnetperls se clava en las implicaciones de rendimiento e incluso muestra IL y puntos de referencia para los dos métodos de comparación de cadenas (== y equals).

Y, por último, esto muestra que question== es estrictamente una comparación de cadenas ordinal y no es apropiado para localizadas cuerdas.

1

Si una cadena puede ser nula o está vacía (también conocido como ""), desea utilizar una cadena.IsNullOrEmpty (...);

De lo contrario, está bien en mi libro o la mayoría de las cosas. Depende de lo que hagas.

Cuestiones relacionadas