InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosContratacionEmail
Tutorial C#
Introduccion a C#
Programacion con C#
Fundamentos de C#
Operadores
Instrucciones
Estrcuturas de control.
Definición de clases
Creación de objetos
Herencia y métodos virtuales
Polimorfismo
Ocultación de miembros
Miembros de tipo
Encapsulación
Espacios de nombres
Importación de espacios de nombres
Espacio de nombres distribuidos
Variables y tipos de datos
Tablas unidimensionales
Tablas multidimensionales
La clase System.Array
Cadenas de texto
Constantes
Orden de inicialización de variables
Métodos
Métodos externos
Constructores
Destructores
Propiedades
Indizadores
Redefinición de operadores
Delegados y eventos
La clase MulticastDelegate
Llamadas asíncronas
Implementación interna de los delegados
Eventos
Estructuras
Boxing y unboxing
Constructores de estructuras
Enumeraciones
Interfaces
Excepciones
Otras instrucciones
Atributos
Definición de nuevos atributos
Lectura de atributos en tiempo de ejecución
Atributos de compilación
Pseudoatributos
Código inseguro
Definición de punteros
Manipulación de punteros
Operadores relacionados con código inseguro
Fijación de variables apuntadas
Novedades de C# 2.0
Genéricos
Tipos parciales
Iteradores
Mejoras en la manipulación de delegados
Tipos anulables
Modificadores de visibilidad de bloques get y set
Clases estáticas
Referencias a espacios de nombres
Supresión temporal de avisos
Atributos condicionales
Incrustación de tablas en estructuras
Modificaciones en el compilador
También puedes ver ...
Creando cadenas de conexión ConnectionStrings en .net 3.5 o visual Studio 2008 usando SqlConnectionStringBuilder
Migración de WSE a WCF (Web Services de 2005 a 2008)
Generar archivos PDF con C#
TransactionScope - Simplificando el trabajo con transacciones.
LinQ To SQL - Un ejemplo sencillo
Cómo activar Intelisense (autocompletado) en el Web.config
Leer un campo XML de SQL Server 2005 con C#
TripleDES - Un ejemplo practico en C#
Mostrar un GridView dentro de un DataList
String.Format

Afiliados
La Web del programador
MundoProgramacion


 

Importación de espacios de nombres

Sentencia using

    En principio, si desde código perteneciente a una clase definida en un cierto espacio de nombres se desea hacer referencia a tipos definidos en otros espacios de nombres, se ha de referir a los mismos usando su nombre completamente calificado. Por ejemplo:


namespace EspacioEjemplo.EspacioEjemplo2
{
 class ClaseEjemplo
 {}
}
class Principal  // Pertenece al espacio de nombres global
{
 public static void Main()
 {
  EspacioEjemplo.EspacioEjemplo2.ClaseEjemplo c =
new EspacioEjemplo.EspacioEjemplo2.ClaseEjemplo();
 }
}       
 

    Como puede resultar muy pesado tener que escribir nombres tan largos cada vez que se referencie a tipos así definidos, C# incluye un mecanismo de importación de espacios de nombres que simplifica la tarea y se basa en una sentencia que usa la siguiente sintaxis:


using
<espacioNombres>;

 

    Estas sentencias siempre han de aparecer en la definición de espacio de nombres antes que cualquier definición de miembros de la misma. Permiten indicar cuáles serán los espacios de nombres que se usarán implícitamente dentro de ese espacio de nombres. A los miembros de los espacios de nombres así importados se les podrá referenciar sin usar calificación completa. Así, aplicando esto al ejemplo anterior quedaría:


using EspacioEjemplo.EspacioEjemplo2;
namespace EspacioEjemplo.EspacioEjemplo2
{
 class ClaseEjemplo
 {}
}
// (1)
class Principal    // Pertenece al espacio de nombres global
{
 public static void Main()
 {
  // EspacioEjemplo.EspacioEjemplo2. está implícito
  ClaseEjemplo c  = new ClaseEjemplo();
 }
}

    Nótese que la sentencia using no podría haberse incluido en la zona marcada en el código como (1) porque entonces se violaría la regla de que todo using ha aparecer en un espacio de nombres antes que cualquier definición de miembro (la definición del espacio de nombres EspacioEjemplo.EspacioEjemplo2 es un miembro del espacio de nombres global) Sin embargo, el siguiente código sí que sería válido:


namespace EspacioEjemplo.EspacioEjemplo2
{
 class ClaseEjemplo
 {}
}
namespace Principal
{
 using EspacioEjemplo.EspacioEjemplo2; 
 class Principal    // Pertenece al espacio de nombres global
 {
  public static void Main()
  {
   ClaseEjemplo c  = new ClaseEjemplo();
  }
 }
}

    En este caso el using aparece antes que cualquier otra definición de tipos dentro del espacio de nombres en que se incluye (Principal) Sin embargo, ahora la importación hecha con el using sólo será válida dentro de código incluido en ese mismo espacio de nombres, mientras que en el caso anterior era válida en todo el fichero al estar incluida en el espacio de nombres global.

    Debe tenerse en cuenta que si una sentencia using importa miembros de igual nombre que miembros definidos en el espacio de nombres en que se incluye, no se produce error alguno pero se dará preferencia a los miembros no importados. Un ejemplo:


namespace N1.N2
{
 class A {}
 class B {}
}
namespace N3
{
 using N1.N2;
 class A {}
 class C: A {}       
}   

    Aquí C deriva de N3.A en vez de N1.N2.A. Si queremos lo contrario tendremos que referenciar a N1.N2.A por su nombre completo al definir C o, como se explica a continuación, usar un alias.

Especificación de alias

    Aún en el caso de que usemos espacios de nombres distintos para diferenciar clases con igual nombre pero procedentes de distintos fabricantes, podrían darse conflictos si usamos sentencias using para importar los espacios de nombres de dichos fabricantes ya que entonces al hacerse referencia a una de las clases comunes con tan solo su nombre simple el compilador no podrá determinar a cual de ellas en concreto nos referimos.

    Por ejemplo, si tenemos una clase de nombre completamente calificado A.Clase, otra de nombre B.Clase, y hacemos:


using A;
using B;
class EjemploConflicto: Clase {}

    ¿Cómo sabrá el compilador si lo que queremos es derivar de A.Clase o de B.Clase? Pues en realidad no podrá determinarlo y producirá un error informando de que existe una referencia ambigua a Clase en el código.

    Para resolver ambigüedades de este tipo podría hacerse referencia a los tipos en conflicto usando siempre sus nombres completamente calificados, pero ello puede llegar a ser muy fatigoso sobre todo si sus nombres son muy largos. Para solucionarlo sin escribir tanto, C# permite definir alias para cualquier tipo de dato, que son sinónimos que se les definen utilizando la siguiente sintaxis:


using
<alias> = <nombreCompletoTipo>;

    Como cualquier otro using, las definiciones de alias sólo pueden incluirse al principio de las definiciones de espacios de nombres y sólo tienen validez dentro de las mismas.

    Definiendo alias distintos para los tipos en conflictos se resuelven los problemas de ambigüedades. Por ejemplo, el problema del ejemplo anterior podría resolverse así:


using A;
using B;
using ClaseA = A.Clase;
class EjemploConflicto: ClaseA 
{} // Heredamos de A.Clase

    Los alias no tienen porqué ser sólo referentes a tipos, sino que también es posible escribir alias de espacios de nombres. Por ejemplo:


namespace N1.N2
{
 class A {}
}
namespace N3
{
 using R1 = N1;
 using R2 = N1.N2;
 class B
 {
  N1.N2.A a;  // Campo de nombre completamente calificado N1.N2.A
  R1.N2.A b;  // Campo de nombre completamente calificado N1.N2.A
  R2.A c;     // Campo de nombre completamente calificado N1.N2.A
 }
}

    Al definir alias hay que tener cuidado con no definir en un mismo espacio de nombres varios con igual nombre o cuyos nombres coincidan con los de miembros de dicho espacio de nombres. También hay que tener en cuenta que no se pueden definir unos alias en función de otro, por lo que códigos como el siguiente son incorrectos:


namespace N1.N2 {}
namespace N3
{
 using R1 = N1;        
 using R2 = N1.N2;     
 using R3 = R1.N2; // ERROR: No se puede definir R3 en función de R1
}

 


Inicio | Tutorial C# Espacios de nombresTutorial C#Espacio de nombres distribuidos Versión para imprimir Foros de consulta


Añadir comentario ... Para preguntar utiliza los foros
Autor:

Título:


Para preguntar utiliza los foros.



Inicio | Tutorial C# Espacios de nombresTutorial C#Espacio de nombres distribuidos Versión para imprimir

Importación de espacios de nombres
Autor: José Antonio González Seco
Visitas: 7798 Fecha de publicación: 06/10/2006
José Antonio es experto en tecnologias Microsoft. Imparte cursos y conferencias en congresos sobre C# y .NET en Universidades de toda España (Sevilla, Barcelona, San Sebastián, Valencia, Oviedo, etc.) en representación de grandes empresas como Microsoft.




Visitas: 304 | Comentarios: 0 | Archivo: Articulos
Categorias: ASP.NET|CSS|ASP.NET
Visitas: 137 | Comentarios: 0 | Archivo: Articulos
Categorias: TFS
Visitas: 101 | Comentarios: 5 | Archivo: Articulos
Categorias: TFS
Visitas: 430 | Comentarios: 4 | Archivo: Articulos
Categorias: Transact-SQL|LinQ
Visitas: 1448 | Comentarios: 6 | Archivo: Articulos
Categorias: Visual Basic .NET|C#|ASP.NET|ASP.NET|Programación|ADO.NET
27/09/2008 Navegando ....
Visitas: 238 | Comentarios: 0 | Archivo: Articulos
Categorias: Humor
Visitas: 611 | Comentarios: 0 | Archivo: Articulos
Categorias: Visual Basic .NET|C#|ASP.NET|ASP.NET|Programación|WCF
Visitas: 2575 | Comentarios: 4 | Archivo: Articulos
Categorias: C#
Visitas: 464 | Comentarios: 0 | Archivo: Articulos
Categorias: JavaScript|ASP.NET
Visitas: 1072 | Comentarios: 0 | Archivo: Articulos
Categorias: Windows XP|Linux|Windows Vista

Útimos temas recibidos en los foros ...
Enviar un email con C# utilizando .Net FrameWork 2.0 con logo... por Moises ... [ASP.NET] 1 21/11/2008
Crystal reports XI Release 2 y asp.net por mvargas ... [ASP.NET] 0 21/11/2008
Enviar un email con C# utilizando .Net FrameWork 2.0 por Moises ... [C#] 0 21/11/2008
Cuestión de BFILE. por Megatron ... [ORACLE] 0 21/11/2008
Enviar email por Dol ... [ASP.NET] 5 21/08/2007
*******PREGUNTA********: por T.S.U.En Informatíca ... [Visual Basic 6.0] 5 17/03/2008
Programar tareas en oracle. por Rodrigo ... [ORACLE] 0 21/11/2008
fechas con datatimepicker por peyin ... [Visual Basic .NET] 3 20/11/2008
agregar datos de un gridview a un textbox por jhors ... [ASP.NET] 3 19/09/2007
Select de sql en c# por Stuart ... [C#] 1 20/11/2008
Manual en Español de SQL Navigator for Oracle por Maira ... [ORACLE] 12 30/03/2008
Como mandar mensaje a Celular por Pako ... [C#] 40 13/03/2007

Access CGI JSP ORACLE UNIX
Actualidad HTML/DHTML/XHTML LINUX PHP Visual Basic .NET
ASP ISAPI MS DOS Power Builder Visual Basic 6.0
ASP.NET Java mySQL SQL WIN 98/NT/2000/XP
C# JavaScript Opinion SQL Server

devjoker  Te recomendamos además ...
18/10/2005 Enviar emails a través de un servidor SMTP autenticado con Java
25/10/2006 Implementación interna de los delegados    forma parte de...Tutorial C#
12/01/2006 Introducción a PLSQL    forma parte de...Tutorial PL/SQL
06/05/2007 Introducción a Transact SQL    forma parte de...Tutorial de Transact SQL
28/06/2006 Propagacion de excepciones en PL/SQL    forma parte de...Tutorial PL/SQL
04/07/2007 ¿Cómo crear RSS?    forma parte de...Tutorial RSS
04/07/2007 ¿Cómo se usa el RSS?    forma parte de...Tutorial RSS
03/04/2008 LINQ con métodos Extensores y expresiones lambda    forma parte de...Linq y Métodos extensores
01/01/2005 Conceptos básicos.    forma parte de...Iniciación a las bases de datos
01/01/2005 Introducción a las bases de datos    forma parte de...Iniciación a las bases de datos

 

Encuesta
¿A que perfil te adaptas mejor?
[Ver] [Votar]