2009-12-30 17 views
6

Duplicar posible:
string.IsNullOrEmpty() vs string.NotNullOrEmpty()¿Por qué String.IsNullOrEmpty (str) y no str.IsNullOrEmpty()?

Puede alguien explicarme por qué en .NET que iba a escribir en lugar de String.IsNullOrEmpty(str)str.IsNullOrEmpty()? Debe haber una razón lógica pero yo no lo sé.

Parece que ustedes están diciendo

  1. No se puede llamar a los métodos de los objetos que son nulas en C# /. NET (lo hago en C++, que el acceso apenas no cualquier miembro VARs)
  2. los métodos de extensión no existían en .NET 2.0
  3. Microsoft no se molestó en actualizar las normas y probablemente sintió que era insignificante
+3

sidenote diversión: en realidad se puede hacer esto en Smalltalk, porque también es nula un objeto (es la instancia única de UndefinedObject). –

+0

Usar un método de extensión para este propósito es simplemente incorrecto ya que aprovecha un detalle de implementación de los métodos de extensión. De hecho, permitiría que 'null.IsNullOrEmpty()' fuera una declaración legal, aunque no se haya compilado de esa manera. –

+0

Duplicado exacto de: http://stackoverflow.com/questions/734372 –

Respuesta

25

Si IsNullOrEmpty fuera un método de instancia, invocarlo en una instancia nula arrojaría una NullReferenceException, no devolvería false como desearía.

Podría ser un método de extensión, pero luego sería potencialmente confuso: se vería como un método de instancia, pero no actuaría como tal.

+8

No podría ser un método de extensión; existía antes de C# 3.0. – jason

+1

@Jason, creo que lo que él está diciendo es que podrías hacer un método de extensión para manejar eso. – kemiller2002

+3

Además, ¿no quieres que 'IsNullOrEmpty' devuelva' true' al recibir una instancia 'null' de' string'? – jason

9

Si str es nulo, no tendrá ningún métodos accessable, porque no hay una instancia de un objeto. Obtendrá una excepción de referencia nula para intentar llamar a un método en un objeto nulo.

String.IsNullOrEmpty es estático, por lo que siempre estará disponible para probar objetos de cadenas.

Supongo que podría argumentar que podría ser útil tener str.IsEmpty (como dijo Jonathan, podría hacer un extenion method para el objeto de cadena para manejar esto), pero realmente es tan fácil llamar a String.IsNullOrEmpty (str) y cubre ambas situaciones. A pesar de que no son lo mismo, la mayoría de las personas equiparan a ser así (en términos de lógica de negocio y verificar que existe un valor para una cadena que quiero decir) cuando se manejan los valores de las cadenas.

4

IsNullOrEmpty es un método estático en la clase string; no es un método de instancia. Esto es porque si str es null, no tiene sentido invocar un método de instancia, ya que obtendría un NullReferenceException. Por lo tanto, IsNullOrEmpty debe ser un método estático.

5

String.IsNullOrEmpty es un método de clase.

Si str fue Nothing (nulo), entonces no se pudo llamar a un método en él. Solo puede llamar a un método de instancia en un objeto.

+0

Es útil mencionar que es un método estático de la clase de instancia, no solo un método de clase. Si fuera un método de clase, entonces lo que publicó habría sido cierto, es decir: string someobject; someobject.isnullorempty(); – JonH

0

En algunos casos sería agradable si se pudieran definir comportamientos predeterminados para las referencias nulas de tipo estático. Usando métodos de extensión, uno puede efectivamente lograr eso en muchos casos. Sin embargo, hay algunas trampas. Por ejemplo, enviar un objeto a un tipo no relacionado generalmente está prohibido en los lenguajes de .NET, ya que no hay casos en que dicho comportamiento sea legítimo en el tiempo de ejecución. Por otro lado, si un objeto era nulo, podría ser lanzado a un objeto y luego el Object null podría ser lanzado a otro tipo. Si el resultado de un lanzamiento de este tipo se puede considerar como una instancia predeterminada del último tipo, el efecto sería hacer que el reparto sea semi-legítimo.

3

He estado usando un método de extensión desde hace un tiempo. Funciona genial.

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

Es obvio que hace lo mismo que String.IsNullOrEmpty (cadena), pero es más fácil de hacer algo como

if(mystring.IsNullOrEmpty()) 
{ 
    //... do something 
} 
Cuestiones relacionadas