2009-09-24 19 views
6

Me vi obligado a eliminar la primera línea de una cadena con bastante frecuencia mientras trabajaba en un analizador de texto en C#. Junté una función simple para hacer eso por mí, pero viniendo de un fondo de PHP, no tengo idea de dónde ponerlo ya que no puedo definir una función fuera de una clase. ¿Cuál es una forma habitual de hacerlo en .NET? ¿Creo una clase estática para almacenar mi función?¿Dónde debo poner funciones misceláneas en un proyecto .NET?

+1

¿Qué tipo de proyecto .NET? ASP.NET? ASP.NET MVC? WinForms? Silverlight? Las convenciones para "dónde ponerlo" difieren según el tipo de proyecto. – Portman

+0

Eso sería WinForms. –

Respuesta

18

Sí, clases de ayuda estáticas son por lo general la forma de hacerlo.

Además, en C# 3 se puede declarar el método como este:

public static string RemoveFirstLine(this string s) { 
    ... 
} 

para que sea un método de extensión. Luego puede llamarlo en cualquier cadena como si el método se hubiera declarado en el tipo de cadena.

+0

Por lo que Butterfly está describiendo, los métodos de extensión definitivamente son el camino a seguir. – Bomlin

+0

¡Guau, los métodos de extensión están limpios! Eso es lo que terminé usando. Gracias por mencionarlos. –

20

Generalmente hago una clase estática Helper o Utility y luego pongo las funciones auxiliares correspondientes allí.

Además, trato de mantener las clases de Ayuda y Utilidad agrupadas lógicamente; poner las funciones de análisis de texto junto con las funciones de conversión de objetos es absurdo. La confusión se aclara con una clase TextUtils y una clase ConversionUtils.

+0

+1 me ganó. –

+6

Probablemente también se beneficie al hacer tales métodos de extensión de funciones. –

2

Normalmente creo una clase de Utilidades y defino métodos estáticos de ayuda.

4

No creo que haya un estándar para esto. Tiendo a hacer una clase estática llamada BlahUtil. Para su ejemplo, lo convertiría en un método estático en StringUtil. Esto me ayuda a agrupar los métodos relacionados en unidades sensatas, lo que hace que sea más fácil descubrirlos y compartirlos entre equipos.

También puede entonces elegir cuál de estos métodos están expuestos como los métodos de extensión (desde C# 3.0):

public static class StringUtil 
{ 
    public static string RemoveFirstLine(this string multiLineString) 
    { 
     // ... 
    } 
} 
0

Crearía una clase de trabajador estático para tales funciones. Quizás no sea la forma más agradable, sino el que mantiene las cosas simples ...;)

K

0

Utilice un extension method para una cadena. Para eso son.

+0

¡Maldita sea añadido mientras escribía mi respuesta! –

1

He hecho las clases estáticas de "ayuda" pero después de algunos análisis; este tipo de función auxiliar siempre termina como una implementación de clase distinta. En su caso, tendría una clase de "analizador de texto básico" y una clase derivada que anula el método de "análisis sintáctico".

0

Puede usar una clase con métodos estáticos. Algo así como ParserUtils.RemoveFirstLine(). En .NET 3.5 y superior, a veces puede usar métodos de extensión cuando las funciones de su utilidad están relacionadas con una clase que no puede modificar, como la clase String. Intellisense mostrará el método de extensión en cualquier objeto de cadena en el proyecto.

6

¡Cuidado!

  • Las funciones genéricas de utilidad que son transversales deberían residir en un espacio de nombres de utilidad superior. Análisis de cadenas, manipulación de archivos, etc.

  • Los objetos de extensión deben residir en su propio espacio de nombres.

  • Las funciones de la utilidad que se aplican a un conjunto específico de objetos comerciales o métodos deben residir dentro del espacio de nombres de esos objetos. A menudo con un sufijo Helper, es decir, BusinessObjectHelper. Naming es importante aquí. ¿Está creando un contenedor para métodos diversos, o tendría más sentido agruparlos en objetos especializados, es decir, un analizador?

3

Si está utilizando C# 3.0, ¡podría considerar usar un método de extensión!

public static class StringExtensions 
{ 
    public static string RemoveFirstLine(this string myString) 
    { 
     return myString.Remove("line..!"); 
    } 
} 

Luego, en código que puede hacer esto:

string myString = "Hello World etc"; 

string removedLineString = myString.RemoveFirstLine(); 
+1

Generalmente odio los métodos de extensión. Rompen la encapsulación de funcionalidad de la clase y la biblioteca. ¿Quién soy yo para "arreglar" la biblioteca .net? Ahora alguien corre a través de algún método en mi código myString.Whargarble(). ¿Dónde encuentran ese método? Creo que myString = MyCompany.StringUtils.Whargarble (myString) es una declaración más clara de lo que está sucediendo. –

+0

Eso es un punto justo, depende de usted cómo implementar su código :). No estoy seguro si una extensión se considera una solución, ¡es más una ampliación de la misma! Lo encuentran haciendo clic en él y seleccionando F12, e identifica su método de extensión mediante el pequeño icono en intellisense. Es poco probable que lo encuentren si los agrega en un espacio de nombres de extensiones; a continuación, explicity "opt-in" para usarlo. No tengo problemas con esto personalmente. ¿Cómo "rompería la encapsulación de la funcionalidad"? ¡Está encapsulado dentro de una clase de extensiones! –

0

Las extensiones son el camino a seguir en los casos. Literalmente agrega tu función a la ocurrencia. Lo único es que no es posible hacer un método estático en 2008.

Cuestiones relacionadas