2010-03-14 4 views
6

이것을 작성하는 우아한 방법은 무엇입니까? null에 대한 우아한 검사와 C#에서의 종료

changeColor()

는 공극 함수와 상기 코드를 실행하는 기능뿐만 아니라 보이드의 함수이다.

+0

, 이런 건 :-) 머리를 긁적 코드를 유지해야합니다, 당신은 저장한다 로컬에서 현재 값을 사용하거나 내 응답마다 null 객체 패턴을 사용하십시오. 그렇지 않으면 lastSelection이 'if'와 'if'사이에서 변경되면 null 참조 예외가 발생할 위험이 있습니다. – kyoryu

답변

14

당신은 조건을 반대로하여 혼란을 줄일 수 있습니다.

if (lastSelection == null) 
{ 
    MessageBox.Show("No Selection Made"); 
    return; 
} 

lastSelection.changeColor(); 
+0

하! 음, +1 분명히 :) – overslacked

9

나는 개인적으로 정말 트랩 것, 오류 조건 종료를 봤어요, 함수의 여러 반환 진술을 갖는 방어 프로그램에 따라 싫어하고를 통해 무엇을 할 수 있지만 :

if(lastSelection == null) 
{ 
    MessageBox.Show("No Selection Made"); 
    return; 
} 

lastSelection.changeColor(); 

그것은이에 속하는 전체 기능을 보지 않고 내 자신의 작품이 할 거라고 어떻게 말을하기 어렵다

+0

:-) 동시에 두 가지 생각이 같은 솔루션에 들어갑니다. 그래도 당신의 의견은 더 많습니다. – Bevan

2

나는 lastSelection이 결코 null이 아니 었는지 확인하고 현재 디자인에서 null이 될 경우 "빈"객체를 가리 키도록하고 싶습니다. 그런 다음 null 확인을 할 필요가 없습니다. 시스템에서 발생할 수있는 엔지니어링 오류는 항상 좋은 습관입니다.

IOW, 코드에서 부적절한 점이 null 체크를하는지, 아니면 에 null 체크가 전혀 필요하지 않은지 여부를 물어볼 것입니다..

+0

"null"확인이 필요하지 않을 수도 있지만 UI 코드 인 것으로 보이며 사용자가 선택하지 않으면 "No Selection Made"라고 알리는 것이 좋습니다. 이 경우 Null Object Pattern을 사용해도 사용자에게 알리기 위해 Null 객체를 검사해야합니다. –

+2

@ 존 손더스 : 그렇다면 실행 가능한 작업이 아닌 경우에도 색상을 변경하는 옵션이 존재하는 이유는 무엇인지 물어볼 것입니다.이 경우 컨트롤을 사용하지 않도록 설정하여 작업을 차단하는 것이 좋습니다. 이 코드.또는 null 개체가 메시지 상자를 직접 또는 간접적으로 표시 할 수 있습니다 (예 : 상자에 표시되는 UI의 코드에 연결된 이벤트를 통해 null 개체가 UI 세부 정보를 인식하지 못하게 함). – kyoryu

+0

@ John Saunders : (BTW, null 체크를 피할 수있는 실행 가능한 옵션이 없을 수도 있지만 확실히 존재하는지 확인하려고합니다.) – kyoryu

0

나는 정상적인 경우 (lastSelection != null)을 먼저 확인한 다음 비정상적인 경우를 확인했습니다.

if (lastSelection == null) goto ERR; 
lastSelection.changeColor(); 
//... possibly more stuff... 
return; 
ERR: 
MessageBox.Show("No Selection Made"); 
+1

@ Sameh : 제안 된 코드가 메소드에있는 경우 제안이 작동합니다. 그러나 동일한 코드의 사본이 10 개 (각각 null이 아닌 다른 변수를 검사하는 경우)하면 어떻게 할 수 있습니까? –

+0

@ 존 : 이것은 좋은 지적이지만, 그의 문제는 내가 말한 것을 말하기에 충분할 정도로 단순 해 보인다. –

+0

@Sameh : 그는 내게 모든 코드를 보여주지 않았으며 그가 보여준 코드 만이 메서드의 유일한 코드는 아니 었습니다. 나는 그것에 대해 잘못 될 수 있습니다. –

1

보면 모두 다른 좋은 답변, 을하지 마십시오있어 :

나는 단지 하나의 수정을 추가 할 수 있습니다 다음과 같이 먼저 null :


if (null == lastSelection) 
{ 
    MessageBox.Show("No Selection Made"); 
    return; 
} 

lastSelection.changeColor(); 
 
+1

ㅎ. 이것은 좋은 조언입니다. 여러 return 문을 싫어한다고 말했을 때, 나는 어떤 의미로든 gotos를 옹호하려하지 않았습니다. – overslacked

0

빨리 잡기 연습을 작성하는 것입니다 :

if (lastSelection != null) 
{ 
    lastSelection.changeColor(); 
    //your other normal code 
} 
else 
{ 
    MessageBox.Show("No Selection Made"); 
    //return; //no need for this now 
} 
+5

@pokrate : "빠르게 따라 잡을 수 있습니까?" 컴파일러가'if (lastSelection = null)'에 대해 경고하지 않을 때, C의 시대의 유물이다. 거의 20 년이 넘었습니다! –

+0

@pokrate, 만약 당신이 모를 경우에, 당신은 실제로 * 컴파일러 오류 *를 얻을 것이다. 나는 이런 종류의 구조가 모두 잃어 버릴 것이기에 너무 슬퍼합니다. – overslacked

+0

그게 새로운 연습입니다. 거의 모든 asp.net 스타터 키트와 여기 StackOverflow에서 보았습니다. 그리고 나는 VS2008을 사용하고 있는데 어떤 컴파일러 경고도 볼 수 없다. – pokrate

1

이것은 아직 없습니다. 이것을 구현하는 다른 방법. lastSelection 변경할 수있는 기회가 있다면

 Action _action = (lastSelection != null 
           ? 
            new Action(lastSelection.changeColor) 
           : 
           () => Console.WriteLine("No Selection Made")); 
     _action.Invoke(); 

아마 조금 잔인한,하지만 당신은 확실히 사람들이 또한

+0

이 코드를 읽으면 가려움증이 났지만 가려움증은 내 머리에 없었습니다. – BillW

+1

이 코드는 매우 똑똑합니다. 잠깐, 뭔가 잘못 됐어. 나는 영리하다는 것이 네 글자라는 것을 확신했다. – kyoryu