Desafio da Semana #3


DESAFIO DA SEMANA #3

Por: Roberto Alexis Farah

Oi pessoal!

Dessa vez o desafio ilustra uma situação que pode ocorrer quando projetos são migrados de VB.NET para C# ou vice-versa.

CENÁRIO

Um cliente por uma razão qualquer decidiu parar o desenvolvimento de uma aplicação em C# e usar VB.NET. Entretanto, após converter a aplicação de C# para VB.NET ele notou que, embora simples, o comportamento da aplicação era diferente nas duas linguagens de programação.

Ele checou o código fonte e concluiu que a lógica era a mesma, portanto, ele pede seu auxílio para identificar o PROBLEMA e propor uma SOLUÇÃO.

Para você poder reproduzir o problema ele criou uma aplicação muito simples que reproduz o mesmo sintoma encontrado na aplicação.

SINTOMAS

Aplicação C# retorna 100 e -60 como resultado. Esse é o resultado esperado.

Aplicação VB.NET retorna 150 e -5 como resultado. Esse resultado é incorreto.

PROBLEMA

Identifique e explique porque há essa diferença de comportamento.

SOLUÇÃO

Proponha uma solução simples que resolva o problema.

INSTRUÇÕES

Crie uma aplicação C# console com o seguinte código:

using System;

using System.Collections.Generic;

using System.Text;

namespace CSharp

{

           

    class Program

    {

                        static int sum = 50;

                        static int subtraction = 100;

                       

        static void Main(string[] args)

        {

           if((DoSubtraction() > 0) || (DoSum() > 0))

           {

                                    Console.WriteLine("Valor da soma das variaveis = {0:d}\n", sum + subtraction);

           }

 

         sum = -5;

           

          if((DoSubtraction() < 0) && (DoSum() < 0))

          {

                                    Console.WriteLine("Valor da soma das variaveis = {0:d}\n", sum + subtraction);

          }

          else

         {

                                    Console.WriteLine("Valor da subtracao das variaveis = {0:d}\n", sum - subtraction);

         }

            

       } // Main

       static int DoSubtraction()

       {

            return subtraction -= sum;

       }

       static int DoSum()

    {

            return sum += subtraction;

       }

              

    } // namespace.

}

E crie uma aplicação VB.NET console com o seguinte código:

Module Module1

            Dim sum As Integer = 50

            Dim subtraction As Integer = 100

    Sub Main()

                        If (DoSubtraction() > 0) Or (DoSum() > 0) Then

                                    Console.WriteLine("Valor da soma das variaveis = {0:d}", sum + subtraction)

                        End If

                        sum = -5

                        If (DoSubtraction() < 0) And (DoSum() < 0) Then

                        Console.WriteLine("Valor da soma das variaveis = {0:d}", sum + subtraction)

                        Else

                        Console.WriteLine("Valor da subtracao das variaveis = {0:d}", sum - subtraction)

                        End If

    End Sub

            Function DoSubtraction() As Integer

                        subtraction -= sum

                        DoSubtraction = subtraction

                        Exit Function

            End Function

            Function DoSum() As Integer

                        sum += subtraction

                        DoSum = sum

                        Exit Function

            End Function

End Module

Agora é possível reproduzir os sintomas e depurar.

Boa sorte!