仅在调试时使用NRE

时间:2019-03-14 14:12:17

标签: c# visual-studio-2017

我们最近在产品代码中遇到了一个奇怪的问题。调试时,我们得到了一个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

我在DEBUG-build中使用VS2017和VS 2010对其进行了检查。

我们当然可以通过在检查之前声明tempCurrentNumberPrefix来避免这种情况。但是我不明白为什么这样做是必要的。

编辑:Execute的值似乎是没有意义的,即使它是true,我们也通过检查来获得完全相同的行为。

0 个答案:

没有答案