2011-04-22 4 views
0

텍스트 상자에서 입력의 유효성을 검사하기 위해 다음 get 및 set을 작성합니다. 기본적으로 사용자가 모든 값을 입력했는지 확인합니다. TextBox를 비워두면 아무 것도하지 않고 해당 변수가 사용 된 출력에 '0'이 표시됩니다. 그러나 시스템이 예외를 생성하고 실행을 중지하는 것을 보여 주지만, 왜 속성을 통해 입력을 검증하지 않는지 궁금합니다. 당신의 세트 문에get 및 set이 작동하지 않습니다.

public double RecoDoseSize 
{ 
    get 
    { 
     return recoDoseSize; 
    } 
    set 
    { 
     if (!(value>0)) 
     { 
      MessageBox.Show("Please Enter the recommended dose size for this product"); 
      textBox8.Focus(); 
     } 
     recoDoseSize = value; 
    } 
} 

private void Submit2_Click(object sender, RoutedEventArgs e) 
{ 
    TotalContentProduct = double.Parse(textBox7.Text); 
    recoDoseSize = double.Parse(textBox8.Text); 
    NoOfDosespUnit = TotalContentProduct/recoDoseSize; 
} 
+0

코드 예에서 명확하지 않습니다. recoDoseSize는 RecoDoseSize와 같습니까? 아니면 관련이없는 개인 변수입니까? 너는 이것에 대해서 언급하고 있소 .RecoDoseSize? – dawebber

+0

당신이 설명하는 경우에 0을 얻는 이유는 텍스트 상자의 Text 속성의 기본값에서 ParseMethod가 최선을 다하고 있기 때문입니다. – dawebber

+0

@ dawebber : RecoDoseSize의 getter가 recoDoseSize를 반환하기 때문에 관련이 있다고 생각합니다. ;-) – Heinzi

답변

1

기타는 주어진 질문에 대한 정답을 제공합니다. 즉 getter/setter를 사용하려면 대문자 인 RecoDoseSize으로 전화해야합니다.

그러나 Setter 내부에 메시지 상자를 표시하는 것은 극히 나쁜 습관인데, 그 이유는 최소한의 놀람 원칙에 위배되기 때문입니다.

누군가가 줄 RecoDoseSize = double.Parse(textBox8.Text);을 보면이 작업으로 인해 메시지 상자가 나타날 수 있음이 분명하지 않습니다.

세터가 UI 변경 사항을 트리거하도록하는 경우가 종종 있습니다 (예 : 컨트롤의 Visible 속성).하지만 기본값이 아닌 경우에는 더 혼란스러워 할 것이라고 확신하지 않는 한 기본값을 사용하지 않는 것이 좋습니다. 그렇습니다 (예를 들어, Visible = false을 설정하더라도 여전히 눈에 surpris 것입니다). 당신이 그것을 구현하는 방법에 대한 내 댓글에 대해서는

의 검사는 클릭 처리기에서 수행해야하며, 속성은 너무 같은 자동 재산이 될 수 있습니다

public double RecoDoseSize { get; set; } 

private void Submit2_Click(object sender, RoutedEventArgs e) 
{ 
    TotalContentProduct = double.Parse(textBox7.Text); 

    double enteredSize; 
    if (!double.TryParse(textBox8.Text, out enteredSize) || enteredSize <= 0) 
    { 
     MessageBox.Show("Please Enter the recommended dose size for this product"); 
     textBox8.Focus(); 
     return; 
    } 
    RecoDoseSize = enteredSize; 
    NoOfDosespUnit = TotalContentProduct/recoDoseSize; 
} 

당신은 사용할 수 있습니다 Parse를 사용하면 텍스트가 유효한 double이 아닌 경우 오류가 발생하므로 TryParse를 사용하십시오. TryParse는 성공 여부에 따라 true 또는 false을 반환하고 out 매개 변수가 성공하면 결과를 채 웁니다.

결과가 구문 분석에 실패하거나 결과가 <= 0 인 경우 메시지 상자가 표시됩니다. 이 경우 메소드에서 return s이기 때문에 나머지는 실행되지 않습니다.또는 나머지 방법은 else 블록에있을 수 있으며이 경우 return은 필요하지 않습니다. 어떤 방식으로 선호되는 스타일의 문제입니다.

+0

내 코드에서이 기능을 구현해야하는 다른 방법을 알려주시겠습니까? 여기를 통해 좀 배우고 있습니다. ( – MangoTable

+0

@Mango 'textBox7'에도'TryParse'를 사용하고 싶을 수도 있습니다. 만약 당신이'Parse'를 사용한다면 텍스트가 유효한'double'이 될 것이라는 사실을 알고 있다고 말하면서 그것을 해석하십시오. 당신이 100 % 확신 할 수 없을 때'TryParse'를 사용하십시오. 텍스트 상자의 내용을 나타내는 텍스트 상자의 이름을 바꾸는 것도 좋습니다. – Davy8

0

당신은 취급 안 초점 :

여기 내 코드입니다.

또한 값이 null이 아닌지 확인해야합니다. 그렇지 않으면 아무것도 (greater-than 등)와 비교할 수 없습니다.

+2

속성은 'double'이므로 'value'는 (null을 사용할 수없는) double 값이기도합니다. null가되지 않습니다. –

+2

소문자'double'은 결코 'null'일 수 없습니다. null이 아닌 타입이면 :'double? ' – pickypg

6

코드가 들어있는 속성 인 RecoDoseSize이 아닌 recoDoseSize의 배경 필드를 설정하고 있습니다. 따라서 코드가 실행되지 않습니다. 당신은 (자본 R주의)

RecoDoseSize = double.Parse(textBox8.Text); 

에 메소드 본문의 두 번째 줄을 변경해야합니다.

+2

다른 속성과 필드를 대문자와 소문자로 구분하는 또 다른 예는 좋지 않습니다. – Pondidum

+1

@ Pondidum : 아니, 정상적으로 작동합니다 (물론 당신이 무엇을하고 있는지 알고 있다면), 나는 최근에 밑줄이 쳐진 필드로 전환했습니다. –

+0

@Pond 당신이 나쁜 글꼴을 사용하지 않는다면 (또는 특히 나쁜 눈으로 생각할 때) 대문자와 소문자의 첫 글자의 차이를보기가 쉽습니다. (변수 이름의 중간은 눈이 자연스럽게 첫 번째/마지막 문자만큼 집중하지 않기 때문에 더 까다로울 수 있습니다.) – Davy8

1

당신은 실제로 getter/setter를 사용하지 않습니다. 실제 필드 이름 : recoDoseSize을 직접 사용하고 있습니다. 이것을 RecoDoseSize으로 변경하십시오.

1
private void Submit2_Click(object sender, RoutedEventArgs e) 
{ 
    TotalContentProduct = double.Parse(textBox7.Text); 
    RecoDoseSize= double.Parse(textBox8.Text); 
    NoOfDosespUnit = TotalContentProduct/recoDoseSize; 
} 
관련 문제