NRE только во время отладки - PullRequest
0 голосов
/ 14 марта 2019

Недавно мы столкнулись со странной проблемой в нашем коде продукта.При отладке мы получили NullReferenceException, где мы ничего не ожидали.

Таким образом, мы сузили его до следующего значения MCVE:

using System.Collections.Generic;
using System.Linq;

namespace VSReproCase
{
    class Program
    {
        static void Main(string[] args)
        {
            ReproCase reproCase = new ReproCase { ExecuteCheck = args.Length > 0 && args[0] == "true" };
            reproCase.CheckLaufendeNummer();
        }
    }

    class TestObject
    {
        public TestObject(string currentNumber)
        {
            CurrentNumber = currentNumber;
        }
        public string CurrentNumber { get; set; }
    }

    class ReproCase
    {
        public bool ExecuteCheck { get; set; }

        public bool CheckLaufendeNummer()
        {
            bool success = true;
            if (ExecuteCheck)
            {
                string tempCurrentNumberPrefix = "TestObject";
                List<TestObject> objectList = new List<TestObject>
                {
                    new TestObject("TestObject1"), new TestObject("TestObject2"),
                    new TestObject("TestObject3"), new TestObject("TestObject4"),
                };
                foreach (var testObject in objectList.OfType<TestObject>().Where(x => x.CurrentNumber != null && x.CurrentNumber.StartsWith(tempCurrentNumberPrefix)))
                {
                    success = false;
                }
            }

            return success;
        }
    }
}

, которое запускается, если ExecuteCheck возвращает true и когда это false.Однако он не работает, когда он false, и мы перешагнем if(Execute), чтобы пропустить эту проверку.Странно то, что в строковом присваивании возникает исключение, что, очевидно, бессмысленно, но даже после повторной компиляции оно остается прежним.

enter image description here

Я проверил это с VS2017 и VS 2010 в DEBUG-build.

Конечно, мы можем просто избежать этого, объявив tempCurrentNumberPrefix перед проверкой.Однако я не понимаю, почему это необходимо.

РЕДАКТИРОВАТЬ: кажется, что значение Execute не имеет смысла, даже если оно равно true, и мы перешагиваем через проверку, мы получаем точно такое же поведение.

...