.NET

24 set, 2012

Melhorando desempenho de aplicativos .NET – Parte 15

Publicidade

Neste artigo da nossa série vamos discutir Reflexão e Late Binding. A reflexão fornece a capacidade de analisar e comparar os tipos, enumerar métodos e campos e criar e executar dinamicamente tipos no tempo de processamento. Normalmente, todos os custos de reflexão são altos, algumas operações de reflexão custam muito mais do que outras. Comparar os tipos é o menos dispendioso, enquanto criar e executar dinamicamente são o mais. A técnica de Late Binding usa reflexão interna e é uma operação cara que deve ser evitada em código de desempenho crítico.

Prefira Early Binding e tipos explícitos ao invés de Reflexão

O Visual Basic .NET usa a reflexão implicitamente quando você declara o tipo de objeto. Em C#, você utiliza a reflexão explicitamente. Evite a reflexão sempre que possível, utilizando o Early Binding e declararando tipos explicitamente.

Segue alguns exemplos de onde você usa a reflexão explicitamente em C#:

  • Comparações de tipo usando TypeOf, GetType, e IsInstanceOfType;
  • Enumeração de Late Binding usando Type.GetFields;
  • Execução de Late Binding usando Type.InvokeMember.

Evite Late Binding

O Early binding permite que o compilador identifique o tipo específico necessário e execute as otimizações que são usadas no tempo de execução. Já o Late Binding adia o processo de identificação de tipo até o tempo de execução e requer instruções de processamento extra para permitir a identificação do tipo e a inicialização. O código a seguir carrega um tipo em tempo de execução:

Assembly asm = System.Reflection.Assembly.LoadFrom(“C:\\myAssembly.dll”);

Type myType = asm.GetType(“myAssembly.MyTypeName”);

Object myinstance = Activator.CreateInstance(myType);

This is the equivalent of the following.

MyTypeName myinstance = new MyTypeName();

Em alguns casos, você precisa da execução dinâmica de tipos, mas quando o desempenho for fundamental, evite a ligação tardia.

Evite usar System.Object em códigos de desempenho crítico

O tipo de dado System.Object pode representar qualquer valor ou tipo de referência, mas requer chamadas tardias vinculadas para executar métodos e propriedades de acesso. Evite usar o tipo de objeto quando o desempenho do seu código for crítico.

O compilador Visual Basic .NET usa implicitamente a reflexão se você declarar o tipo de objeto:

‘VB.NET

Dim obj As Object

Set Obj = new CustomType()

Obj.CallSomeMethod()

C # não possui esse problema.

Ative as opções Explicit e a Strict em Visual Basic.NET

Por padrão, o Visual Basic. permite códigos late bound. Defina as propriedades Strict e Explicit como verdadeiras para forçar o Visual Basic .NET a não permitir código late bound. No Visual Studio .NET, você pode acessar essas propriedades por meio da caixa de diálogo “Propriedades do projeto”. Se você usar o compilador de linha de comando Vbc.exe para compilar seu código, use /optionexplicit e /optionstrict.

Em nosso próximo artigo vamos discutir as diretrizes do código de segurança Acces.