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 (2)

  1. Marcelo Cortes says:

    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.

  2. Roberto Farah says:

    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