Arquivo de dezembro \29\-03:00 2009

Namespaces em C#

Namespaces são a forma lógica de organizar o código-fonte em .NET. Toda a biblioteca de classes da .NET está estruturada em uma hierarquia de namespaces que tem como base o namespace System, onde se encontram as classes básicas da .NET. Fisicamente, os namespaces são armazenados em assemblies, que, por sua vez, são armazenados no sistema de arquivos como DLLs (bibliotecas de ligação dinâmica) ou como arquivos executáveis (.exe) que correspondem a aplicações propriamente ditas no ambiente .NET.

Quando uma aplicação é organizada logicamente usando namespaces, este deve possuir pelo menos uma classe que implemente o método Main( ), para aplicações console, ou WinMain( ), para aplicações Windows. Por sua vez, uma biblioteca de classes é implementada usando namespaces, mas nenhuma das suas classes membros implementa o método Main( ) ou WinMain( ), e elas são usadas para implementar código reutilizável.

Assim como as classes contêm membros, os namespaces também, os quais podem ser dos seguintes tipos:

  • Outro namespace: namespaces aninhados
  • Classes: tipo class
  • Estruturas: tipo struct
  • Enumerados: tipo enum
  • Interfaces: tipo interface
  • Delegados: tipo delegates
  • Para usar um namespace a partir de uma aplicação ou de uma biblioteca, usamos a cláusula using seguida do nome do namespace, conforme temos feito em todos os exemplos neste livro. A inclusão de um namespace através de using é útil para evitar ter que digitar o nome completo do namespace para referenciar qualquer um dos seus membros.
     
    Exemplo:
     
    using System;
    static void Main(string[ ] args)
    {
      Console.WriteLine( );
      // chamada equivalente: System.Console.WriteLine( )
    }
     

    Ainda podemos usar a cláusula using para criar um alias de um namespace quando, ao incluirmos dois namespaces diferentes, a referência a um dos membros cujo identificador existe em ambos namespaces se torna ambígua pelo fato de que os nomes são idênticos. No exemplo a seguir, vamos assumir que o namespace1 e namespace2 contêm ambos uma classe chamada clA. Vejamos o código para entendermos melhor o problema:

    using namespace1;
    using namespace2;
    clA ClasseA1 = new A( );
    clA ClasseA2 = new A( );

    Mas o problema é que o compilador não sabe a partir de qual classe desejamos criar uma instância, se a pertencente ao namespace1 ou ao namespace2. Podemos resolver esse problema de duas formas, vejamos:

    Solução 1:

    using namespace1;
    using namespace2;
    namespace1.clA ClasseA1 = new A( );
    namespace2.clA ClasseA2 = new A( );

    Resolvemos o problema qualificando completamente o nome da classe, ao incluirmos o nome do namespace ao qual pertence. O problema desta solução é que se o nome do namespace for muito grande, por exemplo System.Collections. Specialized, e a classe clA tiver muitos membros estáticos, teremos que digitar o nome do namespace a cada vez que quisermos referenciar a classe.

    Solução 2:

    using NA1 = namespace1;
    using NA2 = namespace2 ;
    NA1.clA ClasseA1 = new A( );
    NA2.clA ClasseA2 = new A( );

    Na solução 2 usamos um alias para o namespace e dessa forma resolvemos a chamada ambígua da classe clA.

    ,

    Deixe um comentário

    Meu primeiro post

      Realmente a simplicidade de postagem do Posterous é impressionante!

    Deixe um comentário