2012-01-13 2 views
0

바이트 속성에 문제가 있습니다. 숫자가 0보다 작은 수를 뺀 값을 뺀 값을 0으로 만들려면값이 음수이면 0이어야하는 byte 속성?

내 문제는 속성에서 계산이 이미 완료되고 값이 음수가 아닌 값 필드 만 가져옵니다. 그러나 바이트의 최대 값에서 음수 값을 뺍니다.

속성 유형을 sbyte로 변경하는 것은 옵션이 아닙니다.

명시 적 setter 메서드를 작성하지 않고 getter 속성 만 사용하면 4가 5가 아닌 255가 아닌지 확인하는 방법이 있습니까? 후원 속성이 int이며 이런 일에 대해 어떻게

+0

속성 유형을 'int'옵션으로 변경하고 있습니까? 이것이 .NET이 일반적으로하는 일입니다. – Ryan

+0

'checked' 키워드를 살펴볼 수 있습니다. –

+0

@minitech,'int'는 0 문제를 해결하지 못합니다. @ 32bitkid,'checked'는 예외 문제를 만듭니다. –

답변

1

:

private int m_TestValue; 
    public byte TestValue 
    { 
     get 
     { 
      if (m_TestValue < 0) 
      { 
       return 0; 
      } 
      else 
      { 
       return (byte)m_TestValue; 
      } 
     } 
     set { 
      m_TestValue = value; 
     } 
    } 

업데이트

감사 32bitkid에, 지금 위의 솔루션이 작동하지 않습니다 실현 어떤 부정적인 값 때문에 setter에 도달하기 전에 양수 값으로 변환하십시오.

할당하기 전에 값을 확인하는 것 이외에는이 문제를 해결할 수있는 유일한 방법은 속성의 데이터 형식을 int로 변경 한 다음 원하는 기능을 제공하는 바이트 속성을 제공하는 것입니다. 예를 들어

:

public int TestValue {get; set; } 

    public byte TestValueAsByte 
    { 
     get 
     { 
      if (this.TestValue < 0) 
      { 
       return 0; 
      } 
      else 
      { 
       return (byte)this.TestValue; 
      } 
     } 
     set 
     { 
      this.TestValue = value; 
     } 
    } 
+0

이 해결책은 이해가되지 않습니다. 'foo.TestValue = 0; foo.TestValue - = 128; Assert.AreEqual (foo.TestValue, 0);'어설 션은 실제로 '128'과 같기 때문에 실패합니다. 오버플로는 개인 m_TestValue의 범위를 벗어나서 발생하기 때문에 오버플로 값 +128이 할당됩니다. –

+0

@ 32bitkid : 지적 해 주셔서 고마워요. 바이트로 작업하는 경우는 거의 없으므로 암시 적 오버플로 변환의 정도를 알지 못했습니다. 제안 된 솔루션으로 답변을 수정했습니다. –

2

먼저, 일반적인 적분 byte 사용을 피한다. int에서 작동하는 것이 더 빠르며 더 많은 유연성을 제공하고 바이트를 압축하면 바이트 만 저장할 수 있으며 수백만 개가 될 때까지 절약해도 중요하지 않습니다.

이제 '빼는 수는 어디입니까?'는 명확하지 않습니다.

음수가 아닌 규칙은 "음수이지만 실제로는 0이지만 예를 들어 -3 plus 2는 0으로 표시되기 때문에 0이 표시됩니다."가 아니라면 상태의 문제입니다. 그 규칙을 시행하여 수기가 일어나는 지점에서 시행하십시오.

private void Subtract(int subtrahend) 
{ 
    value = Math.Max(value - subtrahend, 0); 
} 

후, 바로 게터

public byte ByteForSomeReason 
{ 
    get { return Math.Max(value, 0); } 
} 

또는 참에, 세터에서 그렇게 그렇게 제로로 beinternally 부정적인하지만 표시해야합니다. 세터가 가치를 정하는 것에 대해 당신은 무엇을 가지고 있으며, 나는 그것들이 훌륭하다고 생각합니다.

관련 문제