C # Visual Studio, кажется, следует неверный путь кода - PullRequest
1 голос
/ 19 июня 2011

Ниже приведен небольшой фрагмент, взятый из довольно большого приложения, чтобы упростить мой вопрос. Я задавал этот вопрос раньше, но моя плохая формулировка привела к его закрытию, прежде чем я смог отредактировать свой вопрос.

Это текущий фрагмент, к которому я добавил несколько строк журнала.

int i = 0; 
Console.WriteLine("Before brackets");
if (i < 0) 
{ 
      Console.WriteLine("Inside brackets");
      return MyArray[i]; 
} 

Когда я отлаживаю с VS, я вижу:

i set to 0
if evaluates as false (when I hover over it in VS) 
In Output: Before brackets

Затем шаги отладчика в заключаются в скобки, и return MyArray[i] выполняется, однако я не вижу Inside brackets в выходных данных к тому времени, как я прошел к строке return MyArray[i].

Такое поведение явно (для меня) неверно, и я подумал, не сталкивался ли кто-нибудь еще с чем-то подобным.

Я на 64-битной машине с Windows XP, с VS10 и .Net4.0.

Луна

ADDITIONAL1

Хенк попросил меня предоставить "консольное приложение", которое я сделал ниже. ОДНАКО, как я подозреваю, это НЕ ПОКАЗЫВАЕТ проблему. Я верю, что есть что-то еще (темы?), Вызывающее у меня проблему в моем реальном приложении - и я, очевидно, могу опубликовать это. Я понимаю, что я не даю вам четко определенную проблему - если бы я мог, я бы. Вот почему я задаю этот вопрос - если он поражает кого-то подобным. Для хорошего заказа, вот консольная версия, которая НЕ представляет проблему. Я чувствую, что надев это здесь, добавит путаницы ...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace ConsoleApplication2
{
    class Program
    {
        static string[] Mods = new string[] { "Cat", "Dog", "Geek" };

        static void Main(string[] args)
        {
            string t = "Geek";
            Console.WriteLine("Answer: " + FindD(t));

        }

        public static string FindD(string ModelFullName)
        {
            int ix = Array.IndexOf<string>(Mods, ModelFullName);

            Console.WriteLine("ix: " + ix + " = " + (ix < 0).ToString());
            if (ix < 0)
            {
                Console.WriteLine("2ix: " + ix + " = " + (ix < 0).ToString());
                Error.Process(ErrorLevel.Critical, "ModelName not found: " + ModelFullName);
            }
            try
            {

                return Mods[ix];
            }
            catch (Exception)
            {
                Error.Process(ErrorLevel.Critical, "Could not point to Mod for: " + ModelFullName);
            }

            return null;
        }

        enum ErrorLevel { Note, Critical };
        class Error
        {
            public static void Process(ErrorLevel EL, string message)
            {
                if (EL == ErrorLevel.Critical)
                {
                    throw new Exception("Critical error: " + GetStackTrace() + message);
                }
            }

            public static string GetStackTrace()
            {
                StackTrace stackTrace = new StackTrace();           // get call stack
                StackFrame[] stackFrames = stackTrace.GetFrames();  // get method calls (frames)

                string st = "";
                // write call stack method names
                for (int i = 6; i > 1; i--)
                {
                    StackFrame stackFrame = stackFrames[i];
                    st = st + stackFrame.GetMethod().Name + "/";
                }

                return st;
            }
        }
    }
}

ДОПОЛНИТЕЛЬНО 2

Похоже, моя проблема не в том, что путь выполнения идет по неверному маршруту ТОЛЬКО против отладчика. то есть кажется, что я иду в скобках, потому что отладчик выполняет последний оператор, но результаты, которые я на самом деле получаю, кажутся правильными.

Ответы [ 4 ]

3 голосов
/ 20 июня 2011

Мне удалось решить проблему после подсказки, которую я нашел из веб-поиска Google. Кажется, я запускал отладчик в режиме "Optmise Code". Это то, что я проверил на ранних этапах, НО я не заметил, что, хотя я не выбрал эту опцию для режима отладки - я выбрал «Release» на стандартной панели инструментов. Когда я переключился на "Debug", проблема исчезла.

1 голос
/ 19 июня 2011

Я должен что-то упустить, но это вполне логично?

  • я установлен на ноль.
    • я не меньше чем нуль.
    • Внутренние скобки НЕ выводимый.

Это логично, не правда ли? Шаг через код с помощью отладчика. Вы увидите, что это имеет смысл.

1 голос
/ 19 июня 2011

Вы уверены, что ваше утверждение if не выглядит следующим образом:

if (i < 0)
    Console.WriteLine(...);
    return MyArray(i);

Обратите внимание на вводящие в заблуждение отступы и отсутствие скобок.

0 голосов
/ 19 июня 2011

Если i = 0, то i < 0 ложно.Если вы установите ваше условие на i <= 0, то оно выполнит условие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...