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