Desafio da Semana #12


Por: Roberto Alexis Farah

Olá pessoal!

Tenho demorado para publicar novos artigos porque tenho usado meu tempo livre no desenvolvimento de duas ferramentas, uma delas pública que, em breve, vocês tomarão conhecimento através desse blog. ;)

No desafio de hoje abordarei dois problemas que estão entre os mais comuns que encontro em códigos VB.NET, C# e ASP.NET.

Embora ambos são abordados juntos aqui, na prática são problemas independentes.

CENÁRIO

Eis o código fonte. Pode ser traduzido para VB.NET, optei por fazer em C# simplesmente porque conheço mais:

namespace Demo

{

          class Program

          {

                   static void Main(string[] args)

                   {

                             string str = "Abcd";

                            

                             DoSomething(str);

                            

                   }

                  

                   static bool DoSomething(string str)

                   {

                             // Checa se string é nula/vazia.

                             if(0 == str.Length)

                             {

                                      return false;

                             }

                            

                             str = str.ToUpper();

                                     

                             Microsoft.Office.Interop.Word.Application msWord = null;

                                                                            

                             try

                             {

                                      msWord = new Microsoft.Office.Interop.Word.Application();

                                      object saveChanges = false;

                                      object missing = null;

                            

                                      msWord.Quit(ref saveChanges, ref missing, ref missing);

                             }

                             catch(OutOfMemoryException ex)

                             {

                                      Console.WriteLine("Não há memória disponível...");

                             }

                             finally

                             {

                                      // Como liberar o objeto COM?

                             }

                            

                             return true;

                   }

          }

}

SINTOMA

Temos dois problemas e dois sintomas no código acima.

Primeiro Sintoma:

Algumas vezes o código acima pode sofrer um crash por NullReferenceException quando o parâmetro ‘str’ é utilizado, como na comparação com str.Length.

Caso real: Em incidentes que trabalhei esse tipo de exceção costuma surpreender os desenvolvedores que assumem erroneamente que os parâmetros de métodos estão sendo testados antes do uso.

Segundo Sintoma:

Sempre que o componente Word é utilizado ele nunca é liberado da memória.

Caso real: Em incidentes que trabalhei esse foi o problema número um relacionado a contador de instância de componentes no COM+ usados via .NET nunca decrementarem quando supostamente liberados da memória!

OBJETIVO

Identifique ambos PROBLEMAS e proponha uma SOLUÇÃO para cada um deles.

Até semana que vem!