2014-04-24 2 views
1

"Kleurencombinatie"클래스를 만들고이 클래스에는 get 및 set이있는 배열이 있습니다. 내가C# 배열의 setter 입력 확인

Kleurencombinatie Combo = new Kleurencombinatie(); 
Combo.Combinatie[0]++; 

을 수행하여 기회 배열의 값을하지만 문제 수

byte[] combinatie; 
public byte[] Combinatie 
{ 
    get { return combinatie; } 
    set { combinatie = value; } 
} 

는 오버 플로우를 생성한다는 것이다. 그래서 제 생각은 세터의 입력을 검증하는 것이 었습니다. Modulo (%)로 간단하게 할 수 있습니다. 그러나 나는 당신이 어떻게 세터에서 이것을 할 것인지 모른다. 나는 그것이되고 싶었 방법

예 :

byte aantalkleuren; 
public byte Aantalkleuren 
{ 
    get { return aantalkleuren; } 
    set { aantalkleuren = value % 7; } 
    //The max value of is 6 now. As soon it over 6 its starts again at 0 
} 

해결책은 이것에 대한 기능을하게 될 것입니다. 그러나 나는 setter 자체에서 이것을 할 수 있다고 생각한다.

아이디어는 어떻게됩니까? 감사합니다.

+2

어떤 종류의

그러나 대신 indexer을 구현하는 자신의 클래스를 쓸 수 오버플로가 발생합니까? 메모리 또는 스택? – Tigran

+0

에 오신 것을 환영합니다. 질문에 코드를 포함하도록 게시물을 업데이트했습니다. pastebin 유형 서비스를 사용할 필요가 없습니다. 중괄호를 사용하여 텍스트를 코드로 변환하면됩니다. – Ian

+0

@Tigran 숫자 오버 플로우라고 생각합니다. –

답변

1

표시되는 코드가 배열의 모든 코드 인 경우 배열이 아직 생성되지 않고 방금 선언되었으므로 NullReferenceException으로 실패합니다. 그래도 초기화해야합니다. 클래스의 생성자 또는 호출 코드

Kleurencombinatie Combo = new Kleurencombinatie(); 
Combo.Combinatie = new byte[length]; 
Combo.Combinatie[0]++; 

또한, 세터와 게터가 아닌 개별 요소의 바이트 배열 자체위한 것이다. 다른 변수와 마찬가지로 유효한 값으로 액세스하고 설정할 수 있습니다. byte[]

+0

글쎄, 나는 전체 코드를주지 않았다. 그러나 이것은 클래스의 생성자에서 수행되었습니다. – 6kgstront

3

그런 속성을 통해 원시 배열을 노출하는 경우 해당 요소에 대한 쓰기를 가로 채어 값의 유효성을 검사 할 수 없습니다. 당신이 필요 바이트 배열 대신에, 그것은 할 것

public sealed class RangeCheckedByteArray 
{ 
    public RangeCheckedByteArray(int size) 
    { 
     _data = new byte[size]; 
    } 

    public byte this[int index] // This indexer ensures that values are checked. 
    { 
     get 
     { 
      return _data[index]; 
     } 

     set // Nobody can set an element's value without coming through here. 
     { 
      _data[index] = (byte)(value%7); 
     } 
    } 

    private readonly byte[] _data; 
} 

사용 :

RangeCheckedByteArray combinatie; 
public RangeCheckedByteArray Combinatie 
{ 
    get { return combinatie; } 
    set { combinatie = value; } 
} 
+0

감사합니다. 이것은 좋게 보일 것입니다. 그러나 저는이 클래스를 위해 여분의 클래스를 만드는 대신 클래스에서 함수를 만들 것입니다. – 6kgstront

+0

C#은 클래스에 의해 요금이 부과되지 않습니다. 클래스 내에서 동작이 가장 잘 캡슐화되면 주저없이 해당 논리를 추출합니다. – SWeko