【问题标题】:Why is resharper still giving null reference warnings for this code为什么 resharper 仍然为此代码提供空引用警告
【发布时间】:2011-11-09 01:26:44
【问题描述】:

此方法是 OnRowCommand 在 aspx GridView 控件中的事件处理程序。 Resharper 警告 gvUnitsgvUnit.DataKeysgvUnits.DataKeys[index] 可能为空,并建议在第二个 if 语句中添加检查。添加它们后,它会创建一个额外的警告,即gvUnits.DataKeys != null 始终为真。既没有按照它的建议添加这些检查,也没有手动添加断言抑制了警告。

我不明白这里发生了什么:gvUnits 是否易失,如果是,为什么,这是 resharper 5.1 中的错误,还是发生了其他事情?

protected void GvUnitsRowCommand(object sender, System.Web.UI.WebControls.GridViewCommandEventArgs e)
{
    if (e.CommandName == "EditUnit")
    {
        int index = int.Parse(e.CommandArgument.ToString());
        if (gvUnits != null && gvUnits.DataKeys != null && gvUnits.DataKeys.Count > index)
        {
            Debug.Assert(gvUnits != null);
            Debug.Assert(gvUnits.DataKeys != null);
            Debug.Assert(gvUnits.DataKeys[index] != null);

            int unitID = (int)gvUnits.DataKeys[index].Value;
            //do stuff with unitID
        }
    }
}

【问题讨论】:

    标签: c# asp.net resharper


    【解决方案1】:

    假设DataKeys是一个属性,那么gvUnits.DataKeys本质上是一个方法调用(调用一个getter。)因此,如果你调用它两次,不能保证它不会在第二次调用时返回null .同样,如果DataKeys[index] 是一个索引器调用(不是数组访问),这也是一个方法调用,如上所述,它可以在第二次调用时返回 null。提供保证断言的唯一方法是将每次调用的结果存储在局部变量中,然后断言局部值不为空。由于本地值不能在使用之间改变,ReSharper 知道它是安全的。

    这是您在没有意识到的情况下做出隐含假设的情况之一(属性的返回值不会在调用之间发生变化。)如果您愿意,可以使用注释来抑制警告,而不是而不是为断言创建本地副本,这基本上将假设推到属性实现者身上(以保证连续调用之间的不可变性。)

    【讨论】:

    • 我检查过,DataKeys 是通过索引器方法访问的属性。现在说得通了; resharper 可能会更聪明一点,不建议生成一个不起作用的“修复”(v6 在这里更好吗?)。
    【解决方案2】:

    检查这个: 如果null 输入尝试使用Convert.ToInt32int.Parse(int) 将失败

    if (e.CommandName == "EditUnit")
    {
        int index = Convert.ToInt32(e.CommandArgument);
        DataKey key = GridView1.DataKeys[index];
        if (key!=null)
        {
            int id = Convert.ToInt32(key.Value);
        }
    }
    

    【讨论】:

    • Resharper 不喜欢你的代码比喜欢我的代码要好。我认为丹·布莱恩特对发生的事情有正确的解释。
    猜你喜欢
    • 2020-05-21
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 2011-08-05
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多