Como é que a diretiva using fica após a compilação?
sobes.tech IA
Resposta da IA
A diretiva using por si só não gera código executável. Ela é processada pelo compilador na fase de compilação e é usada para vários fins:
-
Indicação dos espaços de nomes utilizados (usings for namespaces): Permite usar tipos dos espaços de nomes indicados sem o nome completo qualificado. Após a compilação, as referências aos tipos no código IL conterão os nomes completos qualificados (espaço de nomes + nome do tipo).
// Antes da compilação: using System; // usar a classe Console sem qualificação Console.WriteLine("Hello"); // Após a compilação (no código IL): // chamada ao método System.Console::WriteLine(string) -
Aliases para espaços de nomes ou tipos (using aliases): Cria um nome mais curto para um espaço de nomes ou tipo. No código IL, usam-se os nomes completos originais, não os aliases.
// Antes da compilação: using MyCustomType = MyProject.MyNamespace.SomeVeryLongTypeName; MyCustomType instance = new MyCustomType(); // Após a compilação (no código IL): // criação de uma instância de MyProject.MyNamespace.SomeVeryLongTypeName -
Using estático (using static): Permite chamar diretamente membros estáticos do tipo sem indicar o nome do tipo. No código IL, a chamada conterá o nome completo do tipo e do método estático.
// Antes da compilação: using static System.Math; double result = Sqrt(16.0); // usar Math.Sqrt // Após a compilação (no código IL): // chamada ao método estático System.Math::Sqrt(double) -
Diretiva
using(bloco de declaração): Garante a liberação correta de recursos que implementam a interfaceIDisposable. O compilador gera um blocotry...finallyque chama o métodoDispose()do objeto.// Antes da compilação: using (var stream = new System.IO.FileStream("file.txt", System.IO.FileMode.Open)) { // trabalho com o fluxo } // Dispose() é chamado aqui // Após a compilação (exemplo em código IL): /* .try { // criação do objeto stream // trabalho com o fluxo } finally { // verificação de null e chamada a stream.Dispose() } */
Assim, as diretivas using não permanecem no código compilado como tais. Elas influenciam como o compilador resolve os nomes de tipos e membros (para os três primeiros casos) e na geração de código para gerenciamento de recursos (para o último caso).