String [] .Count()给出奇怪的结果

时间:2014-09-18 08:46:16

标签: c# visual-studio debugging visual-studio-2013

我正在调试一些代码,并遇到了这种奇怪的情况。方法采用String[]变量,它首先检查变量是否为 null ...

protected override CommandResult OnExecute(DateTime closeOfBusinessDate, 
                                                                string[] verbs)
        {
            if (verbs == null)
            {
                throw new ArgumentNullException("verbs");
            }

我们通过这一行,然后检查它以确保变量只有一个值......

 if (verbs.Count() > 1)
     {
        throw new ArgumentException("Only single verb supported.", "verbs");
     }

这是非常基本的东西,但在调试过程中,我看到了这个结果...... enter image description here

正如您所看到的,Count() 1 ,但if (verbs.Count() > 1)的检查仍然评估为真,有人可以解释一下吗?也许我错过了一些明显的东西。

编辑:添加了输出

您可以在输出窗口中看到值 1

enter image description here

4 个答案:

答案 0 :(得分:0)

请考虑以下代码:

    static void Example()
    {
        var verbs = new string[] { null, null };
        checkBerbs(verbs);
    }

    static void checkVerbs(string[] verbs)
    {
        if (verbs.Count() > 1)
        {
            mutateArray(ref verbs); //this would run another thread --> race condition
            throw new ArgumentException();
        }
    }

    private static void mutateArray(ref string[] verbs)
    {
        verbs = new string[] { null };
    }

这是一种可能的情况。不知道你的代码的全部范围,我不确定这是否可行。显然mutateArray将在另一个线程上运行,你会遇到竞争条件。也许锁定verbs可以让你知道这是一些并发问题。

答案 1 :(得分:0)

如果代码实际上正在调用Enumerable.Count扩展方法并且没有任何技巧,那么问题是您假设要执行的下一个语句是throw语句。

这两种情况最有可能导致调试器出现位于一个位置,即使它不是:

  1. 在启用优化的情况下进行编译(非常常见; 发布配置中的默认值)。
  2. 使用未正确更新调试信息的IL重写工具(不常见)。
  3. 使用调试配置重新编译或运行代码可能会显示实际未达到throw语句。

答案 2 :(得分:-1)

伯爵并没有这样的工作。请改用verbs.Length

答案 3 :(得分:-4)

我不确定我能告诉你为什么会看到这个结果,但我可以建议修复:使用verbs.Length而不是verbs.Count()。在这种情况下,Count()是一个LINQ方法,而Length是一个数组属性,它将告诉你数组中的项目数。