2010-04-19 2 views
3

내 필드에서 일부 필드의 유효성을 검사하는 코드에서 세 가지 함수를 호출합니다. 아래 주어진 코드로 작업하려고 할 때. 거짓 결과를 얻을 때까지 첫 번째 값만 확인합니다.사용하는 동안 또는 연산자를 사용하는 동안 3 개의 함수를 모두 호출하면 결과가 true가됩니다.

fisrt 함수가 true를 반환하면 다음 함수 등을 호출해야하는 것과 같은 것을 원합니다. 이를 수행하기 위해 또는 연산자 대신 사용할 수있는 것은 무엇입니까?

if (IsFieldEmpty(ref txtFactoryName, true, "Required") || 
     IsFieldEmpty(ref txtShortName, true, "Required") || 
     IsFieldEmpty(ref cboGodown, true, "Required")) 
    { } 

public bool IsFieldEmpty(ref TextBox txtControl, Boolean SetErrorProvider,string msgToShowOnError) 
{ 
    ErrorProvider EP = new ErrorProvider(); 
    if (txtControl.Text == string.Empty) 
    { 
     EP.SetError(txtControl, msgToShowOnError); 
     return true; 
    } 
    else 
    { 
     EP.Clear(); 
     return false; 
    } 
} 

댓글하시기 바랍니다 편집, 미세 매개 변수의 하나로서 심판이 변수를 사용하여이 방법입니다.

제출 확인시 유효성 검사는 winform입니다.

+1

내가 틀릴 수도 있지만, 다른 것들 중에서도 당신은 ErrorProvider를 남용하는 것처럼 보입니다. 모든 유효성 검사에서 새 인스턴스를 회전하는 대신 폼 멤버로 인스턴스를 가져야합니다. –

답변

10

당신은 하나를위한 | OR를 사용할 수 있습니다

if (IsFieldEmpty(ref txtFactoryName, true, "Required") | 
    IsFieldEmpty(ref txtShortName, true, "Required") | 
    IsFieldEmpty(ref cboGodown, true, "Required")) 
{ } 

||short-circuit evaluation을 수행하는 이중 파이프의 single version| 전체 평가를 수행합니다.
&&&에 대해 동일합니다.

MSDN reference을 참조하십시오. 편집

응답 :이 txtControl 앞의 '심판'에 대한 필요가 없으며, 그것을 제거하는 것은 여기에 당신의 접근 방식에 대한 비판을 주소에 먼 길을 갈 것

  1. . IsFieldEmpty은 txtControl을 변경하지 않습니다. 조금 더 개선하기 위해 CheckFieldEmpty으로 이름을 바꿀 수 있습니다.
  2. 이 메서드 내부에 ErrorProvider 인스턴스를 만드는 것은 이상한 일입니다. 전혀 작동합니까? 일반적으로 양식에는 하나의 (영구적 인) 인스턴스가 있어야합니다. 이 메소드가 Form과 독립적이되기를 원할 것입니다. 따라서 매개 변수로 EP를 추가하십시오. 그것은 SetErrorProvider를 대체 할 수 있습니다, 당신은 null에 대한 EP 매개 변수를 확인할 수 있습니다. ?

    bool isFactoryNameEmpty = IsFieldEmpty(ref txtFactoryName, true, "Required"); 
    bool isShortNameEmpty = IsFieldEmpty(ref txtShortName, true, "Required"); 
    bool isGodownEmpty = IsFieldEmpty(ref cboGodown, true, "Required"); 
    if (isFactoryNameEmpty || isShortNameEmpty || isGodownEmpty) 
    { 
        // ... 
    } 
    

    은 (또한, 나는 당신이 그들이 부작용이 있기 때문에 세 가지 함수를 호출하는 필요가 가정 : O, 및 Ep.SetErrortxtControl, "");

+2

단일 문자 '|'는 비트 연산입니다. 당신은 단락 회로가 아니라는 것이 맞고,이 경우에는 원하는 것을 할 것입니다. – RichieHindle

+4

틀린,'|'과'&'연산자는 피연산자에 따라 비트와 논리적 모두이므로 논리적 연산에도이 연산자를 사용하는 것이 합법적입니다. 그리고 네, 둘 다 단락이 없습니다. 설명서는 http://msdn.microsoft.com/en-us/library/6a71f45d(VS.71).aspx를 참조하십시오. 만약 비트 단위 일 뿐이라면, bool에 대한 자동 변환이 없기 때문에 표현식이 컴파일되지 않았을 것입니다. if 문은 if (int) {}입니다. –

+0

@Richiel : 아니요, 저는 공식 링크이지만'| '는 반드시 부울 연산자로 정의됩니다. (링크가 추가됨) –

10

가 명시 적으로 무슨 일을하고 있는지 확인하여 EP.Clear(); 교체 case IsFieldEmpty은 정말 나쁜 이름입니다.)

+7

이 방법을 강력히 권장합니다. 아마도 메서드에 부작용이 있기 때문에 누전을 피하기를 원할 것입니다. 이 메소드는 단순히 상태를 쿼리하기 위해 호출되지 않습니다. 이 경우 메서드 호출을 if 문으로 혼합하면 메서드 호출을 수행하는 전체적인 의도가 숨겨집니다. –

+1

-1이 기능은 쓸데없는 텍스트를 추가하여 기능을 변경하지 않고 가독성을 손상시킵니다. Henk의 솔루션은 훨씬 더 읽기 쉽습니다. 단락 및 비 단락 논리 연산자가 모두 존재하는 이유가 있습니다. –

+1

@ Adam : 나는 왜 당신이'?'해결책 대신에'|'를 사용하는지에 대한 설명을 덧붙여 야한다는 위대한 논평을 통해 가독성이 더 해롭다 고 생각합니다. (IsFieldEmpty의 이름을 바꾸면 두 경우 모두 도움이됩니다!) – RichieHindle

0

C#에서는 단락 회로라고합니다. 첫 번째 표현식이 실패하면 최종 결과가 이미 결정되었으므로 다음 표현식 시도가 번거롭지 않습니다.

http://johnnycoder.com/blog/2006/08/02/short-circuit-operators-in-c/

당신은 당신이해야 | | 대신에 || 당신의 결과를 얻기 위해서.

if (IsFieldEmpty(ref txtFactoryName, true, "Required") | 
     IsFieldEmpty(ref txtShortName, true, "Required") | 
     IsFieldEmpty(ref cboGodown, true, "Required")) 

C#을 운영 http://msdn.microsoft.com/en-us/library/6a71f45d.aspx

|| 운영자. http://msdn.microsoft.com/en-us/library/6373h346.aspx

| 운영자. http://msdn.microsoft.com/en-us/library/kxszd0kx.aspx

6

왜 필요할까요? 내가 생각할 수있는 유일한 이유는 "IsFieldEmpty"함수가 일부 계산 또는 데이터 변경을 수행하고 있다는 것입니다. "IsFieldEmpty"라는 함수는 실제로 아무것도 수행하면 안됩니다.

SomeFieldMaintenance(ref txtFactoryName, true, "Required") 
SomeFieldMaintenance(ref txtShortName, true, "Required") 
SomeFieldMaintenance(ref cboGodown, true, "Required") 
if (IsFieldEmpty(txtFactoryname) || 
    IsFieldEmpty(txtShortName) || 
    IsFieldEmpty(cboGodown)) 
{ } 

또는 그 동류의 무언가 :

는 경우, 사용 편의성/유지 보수의 관점에서, 당신은 더 나을거야.

+0

나무에 나무를 보는 +1! – RichieHindle

+0

필자는이 함수가 더 적절하게 명명 될 수 있다는 것에 동의하지만, 왜 추가 함수가 (특히'ref' 매개 변수가있는) 이유는 무엇입니까? –

+0

나는 이름을 바꾸는 것이 아니라 두 가지 기능으로 나눌거야. 하나는 필드 유지 관리가 필요하며, 하나는 필드가 비어 있는지 확인하는 것입니다. IsFieldEmpty 함수에서 어떤 일이 일어나고 있는지 전혀 알 수 없기 때문에 이름을 변경하는 것으로 충분할 수 있습니다. 그러나 레이블에서 말하는 것보다 더 많은 것을 수행합니다. 그렇지만이 상황에서 참조가 이동해야 할 수도 있습니다 ... – Trevel

0

지금까지는 모든 필드의 유효성을 검사하기를 원했지만 그 중 하나가 실패한 후에도 필드를 확인하려고합니다. 이 가정은 원래의 질문에서 명백하지 않습니다. 따라서 한 필드가 실패 할 때 유효성 검사를 중지해도 괜찮 으면 가장 간단한 해결책은 || 대신 & & 연산자를 사용하는 것입니다. 이것은 명시된 목표를 달성 할 것입니다 : "첫 번째 함수가 true를 반환하면 다음 함수 등을 호출해야합니다". 그러나 첫 번째 함수가 false를 반환하면 다른 함수가 호출되지 않으므로 원하는 결과가 아닐 수 있습니다.