Dan*_*ely 1 c# asp.net resharper
此方法是OnRowCommandaspx GridView控件中的事件处理程序.ReSharper的警告gvUnits,gvUnit.DataKeys以及gvUnits.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
}
}
}
Run Code Online (Sandbox Code Playgroud)
假设这DataKeys是一个属性,那么gvUnits.DataKeys本质上是一个方法调用(调用一个getter.)因此,如果你调用它两次,就不能保证它不会在第二次调用时返回null.同样,如果DataKeys[index]是索引器调用(不是数组访问),这也是一个方法调用,如上所述,它可以在第二次调用时返回null.提供保证断言的唯一方法是将每个调用的结果存储在局部变量中,然后断言本地值不为空.由于本地值不能在用法之间改变,ReSharper知道它是安全的.
这是你在没有意识到的情况下进行隐式假设的情况之一(属性的返回值不会在调用之间发生变化.)如果你愿意,你可以用注释来抑制警告,而不是创建一个断言的本地副本,它基本上将假设推送到属性实现者(以保证连续调用之间的不可变性.)