gpt4 book ai didi

c# - 为什么 resharper 仍然为此代码提供空引用警告

转载 作者:太空宇宙 更新时间:2023-11-03 18:41:45 25 4
gpt4 key购买 nike

此方法是 aspx GridView 控件中 OnRowCommand 的事件处理程序。 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
}
}
}

最佳答案

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

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

关于c# - 为什么 resharper 仍然为此代码提供空引用警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8054050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com