DUVIDA SOBRE USING E REFERENCIA
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á?
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á?
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...
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...
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.
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.
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?
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?
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
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
Excelente Kerplunk, muito obrigado, melhor que isso só [Ô]Dois Disso![Ô].
Tópico encerrado , respostas não são mais permitidas