2016-09-08 2 views
-5

См ссылке:Почему это ложное утверждение if? (С #)

http://i.imgur.com/gFcamd8.png

Примечание окно Автомобили в нижней части показывает, что toParse = "". Однако toParse! = "" В любом случае оценивается как истинное, что приводит к сбою приложения.

Вот полный метод:

public void parseString(string toParse) 
    { 
     while (toParse != "") 
     { 
      string nextLine = readLine(ref toParse); 

      if (nextLine.IndexOf("//") == 0) 
      { 
       comments.Add(nextLine); 
       continue; 
      } 

      if (nextLine.IndexOf(".") == 0) 
      { 
       string[] declarationParts = nextLine.Split(' '); 
       string declarationString = declarationParts[0].Substring(1, declarationParts[0].Length - 1); 
       declarationString = char.ToUpper(declarationString[0]) + declarationString.Substring(1); 
       DirectiveEnum type = (DirectiveEnum)Enum.Parse(typeof(DirectiveEnum), declarationString); 
       string[] attributes = declarationParts.Skip(1).ToArray(); 
       MSILNode newNode = new MSILNode(type); 
       newNode.addAttributes(attributes); 
       toParse = toParse.Trim(); 
       if (toParse != "") 
       { 
        while (toParse[0] != '{' && toParse[0] != '.' && toParse.IndexOf("//") != 0) 
        { 
         nextLine = readLine(ref toParse); 
         attributes = nextLine.Split(' '); 
         newNode.addAttributes(attributes); 
        } 

        if (toParse[0] == '{') 
        { 
         readLine(ref toParse); 
         string inside = separate(ref toParse, "}"); 

         newNode.parseString(inside); 
        } 
       } 
       subNodes.Add(newNode); 
       continue; 
      } 

      Console.WriteLine(nextLine); 
     } 
    } 
+0

Какова была ценность toParse? –

+0

Какова длина 'toParse'? – siride

+0

См. Op: toParse = "" –

ответ

0

В изображении, эта линия newNode.parseString(inside) подсвечивается означает, что он находится в CallStack и был вызван, прежде чем врезаться. Эта строка, вероятно, мутирует toParse как "".

+0

Я изменил свой OP, чтобы показать весь метод. Первое, что я проверяю при вызове parseString(), - это то, является ли переданная строка == "". –

2

Сложно видеть все, что происходит во время сеанса отладки, когда предоставляется только один снимок. Однако, поскольку toParse передается по ссылке на функцию readline() (строка 57), ее значение может быть изменено в теле этой функции.

Из изображения PNG, представленной в оригинальный вопрос:

53 if (toParse != "") 
54 { 
55  while (toParse[0] != '{' && toParse[0] != '.' && toParse.IndexOf("//") != 0) 
56  { 
57   nextLine = readLine(ref toParse); 
58   ... 

В строке 53, toParse не пусто. Затем во время одной из итераций цикла while оно обновляется до пустого значения. Это приведет к любому доступу к индексам массива (т. Е. toParse[0] в состоянии while), чтобы вызвать исключение.

Дополнительную информацию о ключевом слове ref в C# см. this StackOverflow issue или this official Microsoft documentation.

Надеюсь, это поможет!

Смежные вопросы