Почему resharper по-прежнему выдает пустые ссылки на предупреждения для этого кода - PullRequest
1 голос
/ 08 ноября 2011

Этот метод является обработчиком события для OnRowCommand в элементе управления aspx GridView. Решарпер предупреждает, что gvUnits, gvUnit.DataKeys и gvUnits.DataKeys[index] могут быть нулевыми, и предлагает добавить проверки во 2-й оператор 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
        }
    }
}

Ответы [ 2 ]

6 голосов
/ 08 ноября 2011

Если предположить, что DataKeys - это свойство, то gvUnits.DataKeys - это, по сути, вызов метода (вызов геттера). Таким образом, если вы вызываете его дважды, нет гарантии, что он не вернет ноль при втором вызове.,Аналогично, если DataKeys[index] является вызовом индексатора (не доступом к массиву), это также вызов метода, который, как и выше, может возвращать ноль при втором вызове.Единственный способ обеспечить гарантированное утверждение - сохранить результат каждого вызова в локальной переменной, а затем утверждать, что локальное значение не равно нулю.Поскольку локальное значение не может меняться между использованиями, ReSharper знает, что это безопасно.

Это один из тех случаев, когда вы делаете неявное предположение, даже не осознавая его (что возвращаемое значение свойства не будет мутироватьмежду вызовами.) Вы можете подавить предупреждение с комментарием, если хотите, вместо того, чтобы создавать локальную копию для утверждения, которое в основном выдвигает предположение на реализацию свойства (чтобы гарантировать неизменяемость между последовательными вызовами.)

1 голос
/ 08 ноября 2011

отметьте это: int.Parse и (int) потерпит неудачу, если null попытается ввести Convert.ToInt32

if (e.CommandName == "EditUnit")
{
    int index = Convert.ToInt32(e.CommandArgument);
    DataKey key = GridView1.DataKeys[index];
    if (key!=null)
    {
        int id = Convert.ToInt32(key.Value);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...