2011-11-08 2 views
1

이 메서드는 aspx GridView 컨트롤에서 OnRowCommand에 대한 이벤트 처리기입니다. Resharper는 gvUnits, gvUnit.DataKeysgvUnits.DataKeys[index]이 null 일 수 있으며 2 차 if 문에 검사를 추가 할 것을 제안합니다. 추가 된 후에는 gvUnits.DataKeys != null이 항상 참이라는 추가 경고가 생성됩니다. 제안 된대로 이러한 검사를 추가하거나 수동으로 어설 션을 추가하면 경고가 표시되지 않습니다.resharper가이 코드에 대해 여전히 null 참조 경고를 제공하는 이유

여기에 무슨 일이 일어나고 있는지 이해할 수 없습니다. gvUnits volatile이며, 그렇다면 왜 resharper 5.1의 버그입니까? 아니면 계속 진행되고 있습니까? DataKeys는 속성이라고 가정

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 
     } 
    } 
} 

답변

6

는 다음 gvUnits.DataKeys은 당신이 두 번째 호출에 null을 반환하지 않을 것이라는 보장은 없습니다, 두 번 호출하는 경우, 기본적으로 메소드 호출 (게터를 호출.) 따라서이다 . 마찬가지로 DataKeys[index]이 인덱서 호출 (배열 액세스가 아님) 인 경우이 메서드 호출도 위와 같이 두 번째 호출에서 null을 반환 할 수 있습니다. 보장 된 단정을 제공하는 유일한 방법은 각 호출의 결과를 로컬 변수에 저장 한 다음 로컬 값이 널이 아님을 가정합니다. ReSharper는 로컬 값이 사용법간에 변경 될 수 없으므로 안전하다는 것을 알고 있습니다.

이것은 실현하지 않고 암묵적인 가정을하는 경우 중 하나입니다. 즉, 속성의 반환 값이 호출간에 변경되지 않습니다. 원하는 경우 주석으로 경고를 표시하지 않을 수 있습니다. 오히려 기본적 속성 구현 위에 가정을 밀어 주장에 대해 로컬 복사본을 만드는 대신 (연속 통화 사이의 비 가변성을 보장합니다.)

+0

체크하고 DataKeys는 인덱서 메서드를 통해 액세스하는 속성입니다. 이제는 의미가 있습니다. resharper가 작동하지 않는 'fix'를 생성하지 않도록 조금 더 똑똑 할 수 있습니다 (여기서 v6이 더 좋습니까?). –

1

확인이 : null 입력 사용하려고하면 int.Parse(int) 실패한다 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); 
    } 
} 
+0

Resharper는 내가 좋아하는 것보다 더 나은 코드를 좋아하지 않습니다. 나는 Dan Bryant가 무슨 일이 일어나고 있는지 정확한 설명을하고 있다고 생각한다. –

+0

@DanNeely 업데이트 됨, 실수를했습니다 – Damith

+0

그게 효과가 있습니다. 감사. –

관련 문제