2012-07-04 13 views
11

Duplicar posible:
Extension Methods vs Static Utility Classvs. clase auxiliar

Estoy construyendo un API de funciones generales que realizan acciones basadas en objetos en .NET. Por ejemplo; Creé una función que verifica una cadena para ver si es una dirección de correo electrónico.

Yo tampoco podía tener:

static bool IsEmailAddress(string text) 
{ 
    return IsMail(text); 
} 

o podría crear un método de extensión que sería utilizada de esta manera:

string text = "[email protected]"; 
if (text.IsEmailAddress()) 
{ 
} 

que es más adecuado, o cree que ya que esta es una biblioteca de propósito general, técnicamente podría implementarlo en ambos sentidos y permitir que el desarrollador decida cuál es el mejor para ellos?

+7

** BTW: ** use 'return IsMail (text)' en lugar de la instrucción if. –

+0

Iría con los métodos de extensión Y la refactorización sugerida por Mahmoud. –

+3

Creo que no es responsabilidad de 'string' saber qué es una dirección de correo electrónico. Entonces, no creo que esto deba ser un método de extensión. – CodesInChaos

Respuesta

12

La creación de un método de extensión significa que se mostrará automáticamente durante intellisense cuando un usuario use ese tipo. Debe tener cuidado de no agregar mucho ruido a la lista de métodos que buscan los desarrolladores (especialmente al crear un marco reutilizable). Por ejemplo, cuando esos métodos solo son utilizables en un contexto determinado, probablemente sea mejor utilizar métodos estáticos "normales". Especialmente cuando se implementan métodos de extensión para tipos generales como string.

Tome por ejemplo un método de extensión ToXml(this string), o un ToInt(this string) métodos de extensión. Aunque parece bastante conveniente tener estos métodos de extensión, convertir texto a XML no es algo que va a hacer en toda la aplicación y sería tan fácil de hacer hacer XmlHelper.ToXml(someString).

Solo hay una cosa peor, y eso es agregar un método de extensión en object.

Si está escribiendo un marco reutilizable, the book Framework-Design-Guidelines by Krzysztof Cwalina es una lectura obligada.

+1

No olvide que la extensión está vinculada al espacio de nombres, por lo tanto, hasta que no especifique un espacio de nombres de extensión en su clase de cliente, no aparecerá Intellisense para los métodos de su extensión. Otra cosa, ¿qué extensión es realmente? - después de la compilación - es una clase estática con método estático - así que prefiero usar extensiones como azúcar sintáctico y tener una buena estructura de mis espacios de nombres en lugar de crear StaticHelpers. –

2

Prefiero el método de extensión, porque su código es elegante, y puede definir un método de extensión en una clase sellada del marco.

0

Un método de extensión forma automáticamente parte de una clase estática. Esto significa que el consumidor puede usar los métodos de extensión o llamar al método estático de la clase si lo desea. Utilizo métodos de extensión tanto como puedo, son más fáciles de descubrir si se colocan en el espacio de nombres adecuado.

0

Los métodos de extensión permiten a los desarrolladores no ser conscientes exactamente de cómo se llama la clase auxiliar y dónde se encuentra, sin mencionar el hecho mismo de su existencia. Tenga en cuenta que aún necesita poner su espacio de nombres en la cláusula using, tal vez colocarlos en algún espacio de nombre común de nivel superior para su aplicación.

2

La pregunta es ¿A qué Framework de .NET se dirigirá? Si < 3.5, los métodos de extensión no están disponibles. De lo contrario, ¿por qué crearías una nueva clase?