Freigeben über


Desafio da Semana #4


DESAFIO DA SEMANA #4

Por: Roberto Alexis Farah

Oi pessoal! Essa semana um amigo me enviou um código em C# e questionou o comportamento do código, pois ele achou o comportamento incorreto. Achei o problema bem interessante e resolvi publicá-lo para vocês.

Eis o código:

using System;

using System.Collections.Generic;

using System.Text;

namespace Test

{

        public class StrangeStuff

        {

                private static String a = "";

                public static String makeStrangeStuff()

                {

                        a = "Anomaly";

                        try

                        {

                                return a;

                        }

                        finally

                        {

                        a = "Greater Anomaly";

                        }

                }

        }

       

       

        class Program

        {

                static void Main(string[] args)

                {

                        Console.WriteLine("{0}", StrangeStuff.makeStrangeStuff());

                }

        }

}

SINTOMA

O valor de “a” não é alterado quando makeStrangeStuff() retorna. Ou seja, StrangeStuff.makeStrangeStuff() retorna “Anomaly”.

PROBLEMA

Identifique o que faz com que esse sintoma ocorra, explique o comportamento, se é de fato algo esperado ou se a aplicação deveria proceder de modo diferente.

Particularmente o interessante desse problema é o entendimento do comportamento do código acima.

Na semana que vem colocarei a resposta.

Boa sorte!

Comments

  • Anonymous
    May 15, 2006
    Sintoma:

    Na verdade o valor de "a" eh alterado como esperado. Mas a funcao makeStrangeStuff() retorna "a" antes do seu valor ser alterado pelo bloco finally.

    O problema, na verdade, eh que a funcao retorna dentro do bloco Try. Como dentro do bloco try, nenhuma excessao ocorre, o retorno da funcao eh "a". Apos o retorno, o bloco try eh finalizado e o bloco finally eh executado e o valor do membro estatico "a" eh finalmente alterado.

    Para resolver esse problema basta usar single-return point funcations.

    public static String makeStrangeStuff()
    {
      string ret = a;

      a = "Anomaly";
      try
      {
         ret = a;    
      }
      finally
      {
         a = "Greater Anomaly";
         ret = a;
      }
      return ret;
    }

    Nesse caso nao faz muito sentido, mas se a funcao fosse mais complicada e o valor de "a" fosse alterado varias vezes dentro da funcao onde excessoes pudessem ocorrer, faria sentido.
  • Anonymous
    May 19, 2006
    Marcelo, parabéns pela resposta! Adorei! E sua explicação foi bem didática.
    Estou publicando o artigo de resposta.
    Continue postando e compartilhando conhecimento com os demais! :)

    Obrigado