No estoy de acuerdo con todos.
Creo que en un subconjunto limitado de casos (principalmente con métodos de extensión) es perfectamente razonable colocar el código en un espacio de nombres del sistema.
Aquí es mi lado de la discusión de una cadena de correos electrónicos que habíamos debatir métodos de extensión en el espacio de nombres System encima en EPS:
Ok, así que aquí está mi lado de la discusión:
Me gusta mucho minimizar el código. Eso incluye usings.
Sí, ReSharper recoge los métodos de extensión y agrega los usos para usted, pero algunas personas no tienen ReSharper, y además, prefiero Coderush que hasta el momento no (hasta donde yo sé) recoger la extensión espacios de nombres
Existen al menos dos tipos diferentes de métodos de extensión; los que son métodos auxiliares para nuestra aplicación, incluidos los asistentes de dominio y específicos de la aplicación, y los que encapsulan características y sintaxis que creemos que el lenguaje debería haber tenido para comenzar.
Un buen ejemplo de esto último es la capacidad de hacer "a {0} {1}".Format("b", "c")
o someListOfStrings.Join(", ")
lugar de tener que hacer String.Join(someStringList.ToArray(), ", ")
. Otros ejemplos más debatibles son IEnumerable<T>.ForEach
y la extensión IsNull()
para tomar el lugar de la sintaxis object.ReferenceEquals(null, someVar)
torpe.
Mi argumento es que hay muchas razones para ubicar esta última clasificación -su equipo generalmente acepta que debe estar en el idioma pero no está- en el espacio de nombres apropiado (System, System.IO, System.Linq, etc.)Queremos que esas funciones estén disponibles en todas partes, al igual que preferimos el foreach y ceder palabras clave para que siempre estén visibles. Sin embargo, si es específico de la aplicación, debe ir en su propio espacio de nombres. El 90% de las veces las extensiones de ayuda específicas de la aplicación probablemente no sean extensiones y ni siquiera sean estáticas. Excluyo de esta declaración el uso de métodos de extensión para proporcionar alias para nombres de funciones.
Puede obtener algunos problemas con esto, por supuesto, al llamar a los ensamblados que contienen extensiones de todo el sistema. Supongamos que estaba haciendo referencia al ensamblaje que contiene mi método void IEnumerable<T>.ForEach
y quería crear mi propio ruby-like R IEnumerable<T, R>.ForEach
(que en realidad es solo un Select, pero no lo sé). ¡Esto sería un problema! Lo que me gusta hacer para mitigar el problema es definir mis clases de extensión como internas para que puedan usarse solo en mi proyecto. Esto resuelve el problema muy bien.
Tenía la intención de crear un espacio de nombres hijo de 'System.InteropServices' para evitar eso, pero veo que probablemente todavía no sea una buena idea. –