2009-02-02 14 views
75

que han estado tratando de aprender más sobre el lenguaje C#, pero no he sido capaz de ver una situación en la que se podría usar espacio de nombres de alias comoAlias ​​del espacio de nombres de C#: ¿cuál es el punto?

using someOtherName = System.Timers.Timer; 

Me parece que sería simplemente añadir más confusión para entender el lenguaje. ¿Podría alguien explicar por favor?

Gracias

+4

¿Qué tal un sistema de ancho 'using int = System.Int32' en C#? Útil, ¿no? Es el mismo uso que se puede aprovechar en otros lugares. – nawfal

+0

@nawfal Creo que los alias de tipo no son exportables. Lo que significa que no puede definir algo como 'using int = System.Int32', y usarlo en lugares que no sean el archivo de declaración. Por lo tanto, este alias 'int' a' Int32' puede lograrse de alguna otra manera o es algo especial en el compilador/tiempo de ejecución. – KFL

+0

@KFL eso es cierto, pero el beneficio que ofrecen es de la misma naturaleza. – nawfal

Respuesta

121

Eso es un alias de tipo, no un alias de espacio de nombres; es útil para eliminar la ambigüedad - por ejemplo, contra:

using WinformTimer = System.Windows.Forms.Timer; 
using ThreadingTimer = System.Threading.Timer; 

(ps: gracias por la elección de Timer ;-P)

De lo contrario, si se utiliza tanto System.Windows.Forms.Timer y System.Timers.Timer en el mismo archivo que' Debería seguir dando los nombres completos (ya que Timer podría ser confuso).

También forma parte de los alias extern para el uso de tipos con el mismo nombre de tipo completo de diferentes ensamblajes, raros pero útiles para ser compatibles.


En realidad, puedo ver otro uso: cuando se desea un acceso rápido a un tipo, pero no quiero utilizar un habitual using porque no se puede importar algunos métodos de extensión en conflicto ... un poco complicado , pero ... he aquí un ejemplo ...

namespace RealCode { 
    //using Foo; // can't use this - it breaks DoSomething 
    using Handy = Foo.Handy; 
    using Bar; 
    static class Program { 
     static void Main() { 
      Handy h = new Handy(); // prove available 
      string test = "abc";    
      test.DoSomething(); // prove available 
     } 
    } 
} 
namespace Foo { 
    static class TypeOne { 
     public static void DoSomething(this string value) { } 
    } 
    class Handy {} 
} 
namespace Bar { 
    static class TypeTwo { 
     public static void DoSomething(this string value) { } 
    } 
} 
+8

Se puede usar para aliar espacios de nombres o nombres de tipos. –

+1

@Sean: sí, pero el ejemplo dado fue para un tipo –

+0

@lupefiasco: conveniente del OP para elegir 'System.Timers.Timer' ;-p –

3

es muy útil cuando se tienen múltiples clases con el mismo nombre en múltiples espacios de nombres incluido. Por ejemplo ...

namespace Something.From.SomeCompanyA { 
    public class Foo { 
     /* ... */ 
    } 
} 

namespace CompanyB.Makes.ThisOne { 
    public class Foo { 
     /* ... */ 
    } 
} 

Puede utilizar alias para hacer feliz el compilador y para hacer las cosas más claras para usted y otros miembros de su equipo:

using CompanyA = Something.From.CompanyA; 
using CompanyB = CompanyB.Makes.ThisOne; 

/* ... */ 

CompanyA.Foo f = new CompanyA.Foo(); 
CompanyB.Foo x = new CompanyB.Foo(); 
6

Siempre utilice en situaciones como esta

using Utility = MyBaseNamespace.MySubNamsepace.Utility; 

donde Utility de otra manera tendrían un contexto diferente (como MyBaseNamespace.MySubNamespace.MySubSubNamespace.Utility), pero espero/Utility preferir siempre a punto para que una p clase articular.

6

Brevity.

Existen beneficios complementarios para proporcionar claridad entre espacios de nombres que comparten nombres de tipos, pero básicamente es solo azúcar.

+0

Muestra claramente el símbolo que está utilizando. No es solo azúcar, sino un poco detallado (si no quiere definir un nuevo nombre). –

21

lo uso cuando tengo varios espacios de nombres con los espacios de nombres sub conflictivos y/o nombres de objeto que acaba podría hacer algo como [como ejemplo]:

using src = Namespace1.Subspace.DataAccessObjects; 
using dst = Namespace2.Subspace.DataAccessObjects; 

... 

src.DataObject source = new src.DataObject(); 
dst.DataObject destination = new dst.DataObject(); 

que de otro modo tendría que haber escrito:

Namespace1.Subspace.DataAccessObjects.DataObject source = 
    new Namespace1.Subspace.DataAccessObjects.DataObject(); 

Namespace2.Subspace.DataAccessObjects.DataObject dstination = 
    new Namespace2.Subspace.DataAccessObjects.DataObject(); 

Se ahorra una tonelada de tipeo y se puede utilizar para hacer que el código sea mucho más fácil de leer.

3

Hemos definido alias de espacio de nombres para todos nuestros espacios de nombres. Esto hace que sea muy fácil de ver donde una clase proviene de, por ejemplo:

using System.Web.WebControls; 
// lots of other using statements 

// contains the domain model for project X 
using dom = Company.ProjectX.DomainModel; 
// contains common web functionality 
using web = Company.Web; 
// etc. 

y

// User from the domain model 
dom.User user = new dom.User(); 
// Data transfer object 
dto.User user = new dto.User(); 
// a global helper class 
utl.SomeHelper.StaticMethod(); 
// a hyperlink with custom functionality 
// (as opposed to System.Web.Controls.HyperLink) 
web.HyperLink link = new web.HyperLink(); 

Hemos definido algunas pautas de cómo los alias debe ser nombrado y todo el mundo los está utilizando.

+1

¿No encuentra que, a menudo, el alias tiene más que ver con el contexto en el que se está utilizando que con la ubicación física del objeto? – BenAlabaster

13

Además de los ejemplos mencionados, alias de tipo (en lugar de los alias de espacio de nombres) puede ser útil cuando se hace referencia en varias ocasiones a los tipos genéricos:

Dictionary<string, SomeClassWithALongName> foo = new Dictionary<string, SomeClassWithALongName>(); 

private void DoStuff(Dictionary<string, SomeClassWithALongName> dict) {} 

Versus:

using FooDict = Dictionary<string, SomeClassWithALongName>; 

FooDict foo = new FooDict(); 

private void DoStuff(FooDict dict) {} 
1

encuentro los alias muy útil en pruebas unitarias Cuando está escribiendo pruebas unitarias, es una práctica común para declarar el objeto de probar como

MyClass myClassUT; 

siendo myClassUT el tema T nder T est. Pero lo que si desea escribir pruebas unitarias para una clase estática con métodos estáticos? A continuación, puede crear un alias de esta manera:

using MyStaticClassUT = Namespace.MyStaticClass; 

entonces usted puede escribir las pruebas unitarias como esto:

public void Test() 
{ 
    var actual = MyStaticClassUT.Method(); 
    var expected = ... 
} 

y nunca perder de vista lo que es el tema que se está probando.

2

De una manera, es muy útil mientras se codifica en Visual Studio.

Caso de uso: Digamos que debo usar solo algunas clases, p. Ej. SqlConnection desde un espacio de nombres System.Data. En curso normal Voy a importar el espacio de nombres System.Data.SqlClient en la parte superior del archivo * .cs como se muestra a continuación:

using System.Data; 

Ahora mira mi IntelliSense. Está muy proliferado con muchas clases para elegir al escribir en el editor de código. No voy a utilizar manojo entero de clases en todo:

enter image description here

Así que prefieren utilizar un alias en la parte superior del archivo de mi * .cs y obtener una visión clara de IntelliSense:

using SqlDataCon = System.Data.SqlClient.SqlConnection 

Ahora mira mi vista intellisense. Es súper claro y súper limpio.

enter image description here

0

Una de las razones que sé; Le permite usar nombres más cortos cuando tiene colisiones de nombres de espacios de nombres importados. Ejemplo:

Si declaró using System.Windows.Forms; y using System.Windows.Input; en el mismo archivo cuando se va a acceder ModifierKeys puede encontrarse con que el nombre ModifierKeys es tanto en el System.Windows.Forms.Control y System.Windows.Input espacios de nombres. Entonces, al declarar using Input = System.Windows.Input;, puede obtener System.Windows.Input.ModifierKeys a través de Input.ModifierKeys.

No soy un fanático de C#, pero el espacio de nombre de alias parece ser una "mejor práctica" para mí. De esa forma sabrá lo que está recibiendo y, sin embargo, no tendrá que escribir mucho más.

Cuestiones relacionadas