Arquitectura del espacio de nombres de .NET

 

Fecha: 02/Sep/2005 (24/08/2005)
Autor: Arbis Percy Reyes Paredes 
Email: bigpercynet@hotmail.com
http://percyreyes.blogspot.com 

Joven desarrollador de aplicaciones Web y Servicios Web XML en Visual Basic .NET y Visual C# .NET con bases de datos SQL Server 2000 - 2005.
¡ Los peruanos Sí podemos !

Aún recuerdo aquellos días en los que estaba aprendiendo a escribir mis primeras líneas de código, donde por cierto, mis maestros me explicaban y recontra explicaban los conceptos orientados a objetos. En esos tiempos no concebía la idea de manejar objetos y clases, y mucho peor agruparlos para una mejor organización dentro de namespaces. "neimspeis"..? que es significa eso..??, solía preguntarme a cada rato, ¿para qué existen los namespace? ¿cuál es el sentido de su existencia?.. por unos momentos llegué hacerme un lío con estos conceptos... hasta que por fín alguien me dijo: los namespaces se usan para agrupar nombres, es decir, clases, estructuras...y otros... y esto se hace para evitar ambigüedades al momento de usarlos...  es así que logré entender hasta ahora que un namespace es un set de nombres en que todos los nombres son únicos. Por ejemplo, los nombres de un grupo de personas podrían pensarse como un namespace, también los nombres de corporaciones de Trujillo, los nombres de tipo Visual Basic, o los nombres de dominios de Internet. Es decir, un espacio de nombres es cualquier conjunto lógicamente relacionado de nombres en que cada nombre debe ser único.

Los namespaces le hacen más fácil para proponer los únicos nombres. Imagina cuan difícil sería nombrar a su próximo hijo si el nombre tendría que ser único de acuerdo a la cara de éste? je, je, je... La singularidad restringida a un contexto más limitado, como mi conjunto de hijos, simplifica las cosas tremendamente. Cuando yo nombre a mi próximo niño, mi única consideración es que yo no use el mismo nombre que usé para uno de mis otros niños. Debe tenerse en cuenta que, otro puesto de padres puede escoger el mismo nombre que yo escojí para uno de mis hijos, pero esos nombres serán parte de namespaces distinto y, por consiguiente, puede distinguirse fácilmente.

Antes de que un nuevo nombre se agregue a un namespace, una autoridad del namespace debe asegurar que el nuevo nombre ya no existe en el namespace. Los nombres dobles adulterarán el namespace en el futuro, haciéndolo imposible de referirse a dichos nombres sin la ambigüedad. Un namespace debe asegurar la singularidad de sus miembros...!!!

Una vez que un namespace tiene un nombre, es posible referirse a sus miembros. Por ejemplo, considere los namespaces mostrados en las dos cajas de la Figura1. Los nombres de estos namespaces de la muestra son Namespace1 y  Namespace2, respectivamente. Note que aunque dos de estos namespaces contienen algunos de los mismos nombres locales, es posible referirse a ellos sin la ambigüedad a través de los nombres namespace-calificados.

 Figura 1: Espacios de nombres no ambiguos.

Debe asegurase también que los nombres de los namespace sean diferentes, de esta manera eliminaremos toda ambigüedad.

Los espacios de nombres de Visual Studio .NET resuelven un problema que a veces se denomina contaminación de espacios de nombres, y que consiste en los obstáculos con que tropieza el programador de una biblioteca de clases por utilizar nombres similares en otra biblioteca. Estos conflictos con componentes existentes a veces se denominan colisiones de nombres.

Los espacios de nombres representan el método mediante el cual el entorno de trabajo .NET labra y facilita su funcionalidad básica. Los espacios de nombres se corresponden con los tipos. Por ejm: Class_1 del namespace Namespace1 era un tipo. El entorno de .NET incluye su propia arquitectura integrada de espacios de nombres. Esta arquitectura incluye dos categorías generales de tipos.

La primera de estas categorías son los tipos de valores. Estos tipos contienen valores así como la descripción del valor. Por ejemplo: una cadena es un tipo por valor. El valor String es una secuencia de caracteres Unicode para representar los caracteres que componen la cadena. El contenido de un cuadro de texto se representa como un valor de tipo de String. Un valor de tipo Double es un número de 64-bits en punto flotante. Existe un conjunto central de estos tipos de valor en el entorno de trabajo .NET. Visual Basic .NET tienen tipos de datos que se corresponden con la mayoría de los tipos de datos del entorno de trabajo .NET.

La segunda categoría general de tipos son los tipos por referencia, por ejemplo: una clase personalizada  como Namespace2.Class_2 o cualquiera de las integradas en el espacio de nombres del entorno de trabajo .NET. El espacio de nombres System contiene aproximadamente cien clases que proporcionan la funcionalidad fundamental del entorno de trabajo .NET, como el  colector de basura y el manejo de excepciones. El espacio de nombres System contiene muchos espacios de nombres de segundo y tercer nivel que manejan ciertas funcionalidades importantes. Por ejemplo System.Windows.Forms es un espacio de nombres de tercer nivel que admite la creación y manipulación de la clases de formulario dentro de una aplicación Windows.

El espacio de nombres System.Web habilita la infraestructura ASP .NET. mientras que System.Data realiza las funciones correspondientes de ADO .NET. A continuación se muestra la lista de los principales tipos por valor del espacio de nombres System, el correspondiente tipo de datos Visual Basic .NET cuando existe y una breve descripción del tipo de valor.

Tipo de Visual Basic Estructura de tipo Common Language Runtime Asignación de almacenamiento nominal Intervalo de valores
Boolean System.Boolean 2 bytes True o False
Byte System.Byte 1 byte 0 a 255 (sin signo)
Char System.Char 2 bytes 0 a 65535 (sin signo)
Date System.DateTime 8 bytes 0:00:00 del 1 de enero de 0001 a 11:59:59 p.m. del 31 de diciembre de 9999.
Decimal System.Decimal 16 bytes 0 a +/-79.228.162.514.264.337.593.543.950.335 sin separador decimal;
0 a +/-7,9228162514264337593543950335 con 28 posiciones a la derecha del signo decimal; el número más pequeño distinto de cero es
+/-0,0000000000000000000000000001 (+/-1E-28).
Double
(punto flotante con precisión doble)
System.Double 8 bytes -1,79769313486231570E+308 a
-4,94065645841246544E-324 para valores negativos;
4,94065645841246544E-324 a
1,79769313486231570E+308 para valores positivos.
Integer System.Int32 4 bytes -2.147.483.648 a 2.147.483.647
Long
(entero largo)
System.Int64 8 bytes -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807.
Object System.Object (clase) 4 bytes Cualquier tipo puede almacenarse en una variable de tipo Object.
Short System.Int16 2 bytes -32.768 a 32.767.
Single
(punto flotante con precisión simple)
System.Single 4 bytes -3,4028235E+38 a –1,401298E-45 para valores negativos; 1,401298E-45 a 3,4028235E+38 para valores positivos.
String
(cadena de longitud variable)
System.String (clase) En función de la plataforma de implementación De 0 a 2.000 millones de caracteres Unicode aprox.
Tipo de datos definido por el usuario
(estructura)
(hereda de System.ValueType) En función de la plataforma de implementación Cada miembro de la estructura tiene un intervalo de valores determinado por su tipo de datos e independiente de los intervalos de valores correspondientes a los demás miembros.
Fuente original: Este cuadro comparativo fue extraída de MSDN Library - Visual Studio .NET 2003

Una diferencia importante entre los tipos de valores y los tipos de referencia es que los tipos de valor retienen valores en su interior, pero los tipos por referencia apuntan a los valores. Una sentencia de asignación entre dos variables que apuntan a tipos de valor asigna los mismos valores de la variables. Si posteriormente se agina un nuevo valor a cualquiera de estas variables, dejará de ser igual a la otra variable. Con los tipos de referencia, las reglas son diferentes. Cuando se asignan dos variables de tipo de referencia una a la otra, se asignan sus referencias a objeto al mismo objeto. Posteriormente si se asigna una cantidad a una variable se asigna esa cantidad a ambas variables, dado que las variables apuntan al mismo objeto.

LOS TIPOS DE VALOR INCLUYEN

LOS TIPOS DE REFERENCIA INCLUYEN 

Puede asignar indistintamente un tipo de referencia o un tipo de valores a una variable del tipo de datos Object. Una variable Object siempre contiene un puntero a los datos, nunca los propios datos. Sin embargo, si se asigna un tipo de valor a una variable Object, ésta se comporta como si contuviera sus propios datos.Puede saber si una variable Object está actuando como un tipo de referencia o como un tipo de valores si la pasa al método IsReference de la clase Information en el espacio de nombres Microsoft.VisualBasic. Microsoft.VisualBasic.Information.IsReference devuelve True si el contenido de la variable Object representa un tipo de referencia.

LOS ESPACIOS DE NOMBRES DE .NET FRAMEWORKPara la gente curiosa, aquí os dejo una lista de namespaces, las cuales exponen funcionalidades muy importantes para el entorno .net. Si desea saber más acerca de ellos, pues visite MSDN online, allí existe información abundante al respecto. 

ESPACIOS DE NOMBRES DE .NET FRAMEWORK
  • System
  • System.CodeDom
  • System.CodeDom.Compiler
  • System.Collections
  • System.Collections.Specialized
  • System.ComponentModel
  • System.ComponentModel.Design
  • System.ComponentModel.Design.Serialization
  • System.Configuration
  • System.Configuration.Assemblies
  • System.Data
  • System.Data.Common
  • System.Data.Odbc
  • System.Data.OleDb
  • System.Data.SqlClient
  • System.Data.SqlTypes
  • System.Design
  • System.Diagnostics
  • System.Diagnostics.Design
  • System.Diagnostics.SymbolStore
  • System.Drawing
  • System.Drawing.Design
  • System.Drawing.Drawing2D
  • System.Drawing.Imaging
  • System.Drawing.Internal
  • System.Drawing.Printing
  • System.Drawing.Text
  • System.Globalization
  • System.IO
  • System.IO.IsolatedStorage
  • System.Messaging.Design
  • System.Net
  • System.Net.Configuration
  • System.Net.Sockets
  • System.Reflection
  • System.Reflection.Cache
  • System.Reflection.Emit
  • System.Resources
  • System.Runtime.CompilerServices
  • System.Runtime.InteropServices
  • System.Runtime.InteropServices.Expando
  • System.Runtime.InteropServices.TCEAdapterGen
  • System.Runtime.Remoting
  • System.Runtime.Remoting.Activation
  • System.Runtime.Remoting.Channels
  • System.Runtime.Remoting.Contexts
  • System.Runtime.Remoting.Lifetime
  • System.Runtime.Remoting.Messaging
  • System.Runtime.Remoting.Metadata
  • System.Runtime.Remoting.Metadata.W3cXsd2001
  • System.Runtime.Remoting.Proxies
  • System.Runtime.Remoting.Services
  • System.Runtime.Serialization
  • System.Runtime.Serialization.Formatters
  • System.Runtime.Serialization.Formatters.Binary
  • System.Security

 

  • System.Security.Cryptography
  • System.Security.Cryptography.X509Certificates
  • System.Security.Cryptography.Xml
  • System.Security.Permissions
  • System.Security.Policy
  • System.Security.Principal
  • System.Security.Util
  • System.ServiceProcess.Design
  • System.Text
  • System.Text.RegularExpressions
  • System.Threading
  • System.Timers
  • System.Web
  • System.Web.Caching
  • System.Web.Compilation
  • System.Web.Configuration
  • System.Web.Handlers
  • System.Web.Hosting
  • System.Web.Mail
  • System.Web.Mobile
  • System.Web.Security
  • System.Web.Services
  • System.Web.Services.Configuration
  • System.Web.Services.Description
  • System.Web.Services.Discovery
  • System.Web.Services.Interop
  • System.Web.Services.Protocols
  • System.Web.SessionState
  • System.Web.UI
  • System.Web.UI.Design
  • System.Web.UI.Design.DataBindingUI
  • System.Web.UI.Design.MobileControls
  • System.Web.UI.Design.MobileControls.Adapters
  • System.Web.UI.Design.MobileControls.Converters
  • System.Web.UI.Design.MobileControls.Util
  • System.Web.UI.Design.Util
  • System.Web.UI.Design.WebControls
  • System.Web.UI.Design.WebControls.ListControls
  • System.Web.UI.HtmlControls
  • System.Web.UI.MobileControls
  • System.Web.UI.MobileControls.Adapters
  • System.Web.UI.WebControls
  • System.Web.Util
  • System.Windows.Forms
  • System.Windows.Forms.ComponentModel.Com2Interop
  • System.Windows.Forms.Design
  • System.Windows.Forms.PropertyGridInternal
  • System.Xml
  • System.Xml.Schema
  • System.Xml.Serialization
  • System.Xml.XPath
  • System.Xml.Xsl
  • System.Xml.Xsl.Debugger
  • Microsoft.CSharp
  • Microsoft.VisualBasic
  • Microsoft.Win32

LOS NAMESPACES EN LOS LENGUAJES DE PROGRAMACIÓN, como Visual Basic .NET y Visual C# .NET.

Para usar namespace en un lenguaje de programción, primero debemos familiarizarnos con la sintaxis por definir un namespace y referirse a algo dentro de un namespace. En C# o VB .NET, un namespace se define a través de un bloque del namespace, como mostrado debajo.

Visual C# .NET
namespace Autos1
{
    public class Mustang 
    {  
    

         //···
         //···
    }
    
    public class VW_Escarabajo  
    {   
      
        //···
        //···
    }
}
    

namespace Autos2
{ 

    public class Mustang
    {
         
    
        //···
         //···
    }
    
    public class VW_Escarabajo  
    {
            
    
         //···
         //···
    }
}
Visual Basic .NET
Namespace Autos1
    Public Class Mustang
        '....
        '....
    End Class
    Public Class VW_Escarabajo
        '....
        '....
    End Class
End Namespace

Namespace Autos2
    Public Class Mustang
        '....
        '....
    End Class
    Public Class VW_Escarabajo
        '....
        '....
    End Class
End Namespace

Este ejemplo define dos namespaces, Autos1 y Autos2, cada uno contiene dos nombres.

Dim ObjAuto1 As Autos1.VW_Escarabajo = New Autos1.VW_Escarabajo   'referencia a  la clase VW_Escarabajo en Autos1.
Dim ObjAuto2 As Autos2.VW_Escarabajo = New Autos2.VW_Escarabajo    'referencia a la clase VW_Escarabajo en Autos2.

Para referirse a la clase VW_Escarabajo de una namespace particular, debe usarse nombres namespace-calificados.También es posible que usted esté usando un namespace particular en una parte del código fuente dado para la conveniencia. Esto hace al namespace especificado un  namespaces predefinido esencialmente para el archivo de la fuente. Entonces no hay ningún requisito adicional para calificar a los miembros del namespace particular, es decir no será necesario especificarlo totalmente haciendo uso del identificador del namespace, a menos que claro se exija para evitar la ambigüedad. A continuación un ejemplo:



Imports Autos1
'...
'...

Sub Main()
Dim ObjAuto1 As Mustang = New Mustang
'...
End Sub
 

Como usted puede ver, la sintaxis para definir y usar el namespaces en Visual Basic es simple y fácil. La sintaxis para los namespaces en C# es algo diferente, pero el concepto es el mismo. No olvides de darme tu voto en PanoramaBox.

Web Developer PERCY REYES PAREDES           

Saludos desde Trujillo - PERU 


ir al índice