DUVIDA SOBRE USING E REFERENCIA

LUIS.HERRERA 04/04/2012 08:14:34
#399067
Bom dia.
Estava reparando que em alguns projetos, há casos em que se incluem declarativas using no início do form ou dll e em outros é preciso além do using também incluir a referência ao mesmo item na Solution, porque isso?

Quando é necessário incluir nas referências da solucion ou projeto e quando só é necessário usar no código do form?

Nota: Alguns itens que ví quando usados só na declaração do formulário, não havia nenhuma referência prévia feita na solução pela IDE, então só era usado mesmo das declarativas.

Se realmente há diferente ao usar certos recuros, onde uns exigem inclusão também nas referências, como saber os que devem ser incluídos lá?
KERPLUNK 04/04/2012 09:16:58
#399071
Resposta escolhida
A diretiva using, é um [Ô]Atalho[Ô] para incluir um namespace na classe em que ela está sendo usada.
Por exemplo, suponha que você está querendo declarar uma variável do tipo List<T>. Se incluir a diretiva using no início da classe você pode declarar assim:

List<string> minhaLista = new List<string>();

Se você não incluir a diretiva using, teria que ser:
System.Collections.Generics.List<string> = new System.Collections.Generics.List<string>();

Ou seja, as diretivas using [Ô]trazem[Ô] os namespaces para a classe, encurtando em muito o caminho para se acessar métodos, propriedades e tipos da(s) classe(s) que estão dentro do namespace declarado. Outro exemplo é suponha que você queira usar o método ReadAllText() da classe File. Veja as diferenças:

//com a diretiva System.IO
string arquivoRaw= File.ReadAllText([Ô]c:\\pasta\\arquivo.txt[Ô]), Encoding.Default);

//SEM a diretiva System.IO
string arquivoRaw= System.IO.File.ReadAllText([Ô]c:\\pasta\\arquivo.txt[Ô]), Encoding.Default);

Concluindo, as diretivas using, não são obrigatórias, mas elas ajudam a encurtar as chamadas, principalmente se o caminho do namespace até chegar no tipo/propriedade/método/classe que se queira seja meio longo. Usar essas diretivas, pode deixar o código muito mais simples de ser lido. Imagine que você criou uma DLL para seu controle de estoque que para se chegar na classe [Ô]Produto[Ô] você tenha algo assim:

MeuProjeto.Modulos.Personalizado.Estoque.Entidades.Principais.Produto meuProduto = new MeuProjeto.Modulos.Personalizado.Estoque.Entidades.Principais.Produto();
Isso sem usar a diretiva using.

Agora, se você colocar a diretiva na classe:

using MeuProjeto.Modulos.Personalizado.Estoque.Entidades.Principais;
public void Metodo()
{
Produto x = new Produto();
}

Para comparar:
//using MeuProjeto.Modulos.Personalizado.Estoque.Entidades.Principais;
public void Metodo()
{
MeuProjeto.Modulos.Personalizado.Estoque.Entidades.PrincipaisProduto x = new MeuProjeto.Modulos.Personalizado.Estoque.Entidades.PrincipaisProduto();
}

Veja bem a diferença de legibilidade do código...


Dica:
Diretivas using podem conter alias; Suponha que você tenha duas classe de mesmo nome mas com funcionalidades diferentes(digamos uma é uma classe entidade e outra é um DAL que você quis usar o mesmo nome). Você pode incluir diretivas using para elas usando alias e acessar os tipos dessas classes pelos alias:
using Entidades = MeuProjeto.Entidades;
using DAL = MeuProjeto.DAL;
public void Metodo()
{
Entidades.Produto x = new Entidades.Produto(); //Entidades aqui é a representação do alias, declarado na diretiva using acima
bool incluido = DAL.Produtos.Incluir(x); //aqui, no namespace DAL também existe uma classe Produto, mas foi usada um alias para diferenciar
}

é mais ou menos isso...
JONATHANSTECKER 04/04/2012 09:37:50
#399073
Muito bom KERPLUNK.
Eu tava escrevendo uma resposta aqui, mas sua resposta já deixou bem explicativo e exemplificado.

Parabéns pela sua dedicação ao fórum, muitas respostas profissionais.
LUIS.HERRERA 04/04/2012 10:03:07
#399075
Kerplunk muito didático, mas não é isso que perguntei. Isso eu até já tinha entendido, só não sabia do alias.

O que perguntei é porque alguns namespaces são incluídos no using (declarativas) mas não precisam ser incluídas também nas referências do projeto onde são usadas?

Ex:
Vi um projeto onde se mandava incluir:

using System.Data.SQLCliente;
using System.Configuration;
using System.Threading;

No nas referências do Solution, disse para incluir a referência ao System.Configuration.

Porque teve de incluir essa referência lá e a Threading não?
Será que essa Threading já é incluída automaticamente e derivada de alguma outra por isso não houve necessidade?
KERPLUNK 04/04/2012 10:35:01
#399078
Primeiramente obrigado! Eu gosto muito de ajudar e vou continuar na medida do (im)possível ajudando aqui!
As referências que são incluídas por padrão em um projeto .NET dependem da versão do Visual Studio(e algumas configurações do mesmo) e do tipo de projeto que se está criando.
Só é possível incluir uma diretiva using, de namespaces que estejam disponíveis em alguma referência incluída no projeto. Se você olhar bem, System.Data.SqlClient, é um namespace que está na referência System.Data que é uma referência padrão adicionada a novos projetos. Os projetos feralmente vem com as seguintes referências:
- System
- Microsoft.CSharp
- System.Core
- System.Data
- System.Data.DataSetExtensions(depende da versão do Framework)
- System.Xml
- System.Xml.Linq

Por essas referências serem incluídas por padrão, todo e qualquer namespace dentro de qualquer uma delas pode ser usado no seu projeto sem precisar referenciar mais nada. O namespace System.Threading, está dentro da referência System e por isso pode ser usado dentro do projeto em que esteja referenciado System.
Já System.Configuration, é um namespace que está na referência System.Configuration e não é incluída por padrão nas referências de projeto. Por isso, você precisa adicionar a referência no projeto para poder usar as funcionalidades dela.

Para entender melhor o que está dentro do que, utilize o Object Browser, pressionando F2 em qualquer lugar ou no menu View/Object Brwoser do Visual Studio. Dentro dele, digite o nome do tipo/método que está procurando, por exemplo [Ô]Sleep[Ô], que é um método de System.Threadin.Thread. Incluí uma imagem aqui para mostrar o Object Browser
LUIS.HERRERA 04/04/2012 11:31:28
#399088
Excelente Kerplunk, muito obrigado, melhor que isso só [Ô]Dois Disso![Ô].

Tópico encerrado , respostas não são mais permitidas