• Sign in
 

LATAM Team blog

Search Blogs
Tags
  • Cloud
  • Cluster
  • Crash
  • Desarrollo
  • Desenvolvimento
  • Directory Services
  • DST
  • Español
  • Exchange/Outlook
  • Hang
  • High Availability
  • IIS
  • Networking
  • Office
  • People
  • Performance
  • Português
  • PowerShell Scripts
  • Security
  • Setup
  • Sharepoint
  • SQL
  • Virtualization
  • Windbg Scripts
  • Windows
Blog - News

Where Are You Coming From Today?

Where are you now?

Follow us on:

Options
  • Blog Home
  • About
  • Share this
  • RSS for posts
  • Atom
  • RSS for comments
Archive
Archives
  • May 2013 (4)
  • April 2013 (5)
  • March 2013 (6)
  • February 2013 (3)
  • January 2013 (3)
  • December 2012 (2)
  • November 2012 (1)
  • October 2012 (4)
  • September 2012 (5)
  • August 2012 (2)
  • July 2012 (2)
  • June 2012 (3)
  • May 2012 (13)
  • April 2012 (6)
  • March 2012 (6)
  • February 2012 (4)
  • January 2012 (7)
  • December 2011 (11)
  • October 2011 (6)
  • September 2011 (1)
  • August 2011 (3)
  • July 2011 (7)
  • June 2011 (6)
  • May 2011 (5)
  • April 2011 (2)
  • March 2011 (13)
  • February 2011 (1)
  • January 2011 (5)
  • December 2010 (6)
  • November 2010 (1)
  • October 2010 (6)
  • September 2010 (2)
  • August 2010 (3)
  • July 2010 (3)
  • June 2010 (5)
  • May 2010 (1)
  • April 2010 (10)
  • March 2010 (21)
  • February 2010 (8)
  • January 2010 (3)
  • December 2009 (5)
  • November 2009 (5)
  • October 2009 (6)
  • September 2009 (8)
  • August 2009 (9)
  • July 2009 (1)
  • June 2009 (3)
  • May 2009 (2)
  • April 2009 (7)
  • March 2009 (4)
  • February 2009 (7)
  • January 2009 (7)
  • December 2008 (8)
  • November 2008 (7)
  • October 2008 (22)
  • September 2008 (17)
  • August 2008 (13)
  • July 2008 (11)
  • June 2008 (7)
  • May 2008 (3)
  • April 2008 (2)
  • March 2008 (6)
  • January 2008 (4)
  • December 2007 (9)
  • November 2007 (4)
  • October 2007 (3)
  • September 2007 (8)
  • August 2007 (4)
  • July 2007 (2)
  • June 2007 (5)
  • May 2007 (7)
  • April 2007 (9)
  • March 2007 (7)
  • February 2007 (6)
  • January 2007 (4)
  • December 2006 (14)
  • November 2006 (10)
  • October 2006 (10)
  • September 2006 (11)
  • August 2006 (15)
  • July 2006 (7)
  • June 2006 (14)
  • May 2006 (22)
  • April 2006 (16)
  • March 2006 (20)
  • January 2006 (1)

Desafio da Semana #3

TechNet Blogs > LATAM Team blog > Desafio da Semana #3

Desafio da Semana #3

LatamBlog
5 May 2006 5:37 PM
  • Comments 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!

 

 

  • 3 Comments
Desenvolvimento
Comments
Comments
  • Danilo Pimentel
    11 May 2006 1:06 PM
    Olá amigos,

    Após analisar o resultado gerado pela execução dos aplicativos nas duas linguagens podemos constatar a diferença... Os valores retornados realmente são muito diferentes.

    Analisando superficialmente os códigos acreditamos que a lógica na "tradução" de uma linguagem para outra está correta. No entanto, se formos mais criteriosos, observaremos que há um erro clássico ocorrendo aí...

    O erro está apenas na diferença para as condições definidas por:

    =========================================
    C#
    =========================================

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

    e

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


    =========================================
    VB
    =========================================

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

    e

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


    ***********************************
    C#


    É de nosso conhecimento que, logicamente, a operação OR é avaliada como sendo verdade quando qualquer um dos termos é verdadeiro (Sendo assim não é necessário testar o segundo termo caso o primeiro seja verdadeiro).

    Também é de nosso conhecimento que, logicamente, a operação AND é avaliada como sendo verdade quando os dois termos são verdadeiro (Sendo assim não é necessário testar o segundo termo caso o primeiro seja falso, pois isso já invalida a operação).

    No exemplo em C# podemos notar esses dois simples conceitos aplicados de forma extremamente eficiente:

    Na primeira condição, após avaliar o resultado de DoSubtraction(), a condição já tem sua avaliação lógica montada e definida como TRUE, pois o primeiro termo é TRUE e a operação lógica que está sendo realizada é um OR, então o segundo termo DoSum() não é avaliado e, portanto, a função não é executada.

    Na segunda condição, após avaliar o resultado de DoSubtraction(), a condição já tem sua avaliação lógica montada e definida como FALSE, pois o primeiro termo é FALSE e a operação lógica que está sendo realizada é um AND, então o segundo termo DoSum() não é avaliado e, portanto, a função não é executada.


    ***********************************
    VB


    Na execução do Visual Basic, para se realizar o teste da condição, seja ela "OR" ou "AND", todos os termos são testados para encontrar-se a condição lógica final. Portanto as funções DoSubtraction() e DoSum() são executadas em ambas condições.

    Devido a forma como o programa está implementado, a execução de cada uma dessa funções interfere no resultado final visto que ambas alteram o valor de variáveis globais que são utilizadas para o resultado final.


    +++++++++++++++++++++++++++++++++++
    SOLUÇÃO


    Para que o resultado do programa em Visual Basic seja o mesmo que o resultado em C# é necessário fazer uma adequação no código. Precisamos testar de forma separada cada um dos termos, condicionando a necessidade de se avaliar o segundo termo nas condições.

    Uma adequação possível pode ser expressa por:



    '=======================

           Dim bOk As Boolean
           bOk = (DoSubtraction() > 0)                'Avalia o primeiro termo
           If Not bOk Then bOk = (DoSum() > 0)        'Se o for FALSE, precisamos avaliar o segundo...
           If (bOk) Then
               Console.WriteLine("Valor da soma das variaveis = {0:d}", sum + subtraction)
           End If

           sum = -5

           bOk = (DoSubtraction() < 0)                'Avalia o segundo termo
           If bOk Then bOk = (DoSum() < 0)            'Se for TRUE, precisamos avaliar o segundo...
           If (bOk) 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

    '=======================

    É isso aí pessoal, até a próxima.

    Abraços,

    Danilo Pimentel
  • Roberto A. Farah
    12 May 2006 3:35 PM
    Olá Danilo!
    Obrigado pela sua participação constante nos desafios!
    Novamente você mandou muito bem! :)
    Sua explicação sobre o problema está correta e a solução proposta também. Entretanto, há um modo de resolver o problema com uma solução que não envolve mudar a lógica do if explicitamente, e sim, usando comandos do próprio Visual Basic .NET, tornando a solução mais simples e menos trabalhosa.
    Estou publicando a resposta agora.

  • Danilo Pimentel
    23 May 2006 8:33 AM
    Nossa Roberto! Que legal! Realmente não sabia da existência desses outros operadores que forçavam a mudança do fluxo de execução.

    Muito obrigado, acho que essa informação é útil para todos nós.

    Parabéns pelo blog!
Page 1 of 1 (3 items)
  • © 2013 Microsoft Corporation.
  • Terms of Use
  • Trademarks
  • Privacy & Cookies
  • 5.6.426.415
  • TechNet
  • Products
  • IT Resources
  • Downloads
  • Training
  • Support
Products
  • Windows
  • Windows
    Server
  • System
    Center
  • Internet
    Explorer
 
  • Office
  • Office 365
  • Exchange
    Server
 
  • SQL Server
  • SharePoint
    Products
  • Lync
  • See all products »
Resources
  • Evaluation Center
  • Learning Resources
  • Microsoft IT Camps
  • Microsoft Technical Communities
  • Microsoft Virtual Academy
  • Script Center
  • Server and Tools Blogs
  • Solution Accelerators
  • TechNet Blogs
 
  • TechNet Flash Newsletter
  • TechNet Gallery
  • TechNet Library
  • TechNet Magazine
  • TechNet Subscriptions
  • TechNet Video
  • TechNet Wiki
  • Windows Sysinternals
  • Virtual Labs
Solutions
  • Networking
  • Cloud and Datacenter
  • Security
  • Virtualization
Updates
  • Service Packs
  • Security Bulletins
  • Microsoft Update
Trials
  • Windows Server 2012
  • System Center 2012 SP1
  • Microsoft SQL Server 2012 SP1
  • Windows 8 Enterprise
  • See all trials »
Related Sites
  • Microsoft Download Center
  • TechNet Evaluation Center
  • Drivers
  • Compatability & Converters
  • Windows Sysinternals
  • TechNet Gallery
Training
  • Training Catalog
  • Class Locator
  • Microsoft Virtual Academy
  • Free Windows Server 2012 courses
  • Free Windows 8 courses
  • SQL Server training
  • e-Learning overview
Certifications
  • Certification overview
  • MCSA: Windows 8
  • Windows Server Certification (MCSE)
  • Private Cloud Certification (MCSE)
  • SQL Server Certification (MCSE)
Other resources
  • TechNet Events
  • Second shot for certification
  • Born To Learn blog
  • IT Camps
Support by product
  • Exchange Server
  • Forefront Server
  • Forefront Edge Security
  • Forefront Server Security
  • Internet Explorer
  • Office
  • SharePoint
 
  • SQL Server
  • System Center
  • Windows Server
  • Windows XP
  • Windows Vista
  • Windows 7
  • Windows 8
Other support links
  • Microsoft Premier Online
  • Microsoft Fix It Center
  • TechNet Forums
  • MSDN Forums
  • Security Bulletins & Advisories
  • International support solutions
  • Log a support ticket
  • Look up event IDs and error codes
Not an IT pro?
  • Microsoft Customer Support
  • Microsoft Community Forums