2017-02-06 2 views
1

배열 속성을 다른 인덱스의 두 개의 다른 배열 계산을 반환하도록했습니다 (이 질문은 다른 질문 인 zip을 사용하여 대답했습니다 Array property returns calculation of 2 other arrays). 하지만 지금은 계산의 가치를 설정해야합니다.C# 배열 속성 다른 배열을 기반으로

즉. HiLimit [0]을 설정하면 Range가 (값 - LowLimit)으로 설정됩니다. 어떻게 가능합니까? getter와 setter 모두 필요합니다.

EDIT (2017-02-09) : @ dasblinkenlight 답변을 올바른 것으로 표시했습니다. 내가 이것을 필요로하는 이유는 하한선과 범위를 보내는 장치와 통신하고 있기 때문입니다. 그러나 소프트웨어는 사용자가 하한선과 상한선을 읽고 편집 할 수있게합니다. 상한과 하한은 디스플레이의 컨트롤에 바인딩되어 있으므로 해당 속성을 사용하고 장치와 통신 할 때 범위를 설정하고 가져 오는 두 가지 방법을 만들었습니다.

public ushort[] LowLimit{ get; set; } = new ushort[8]; 

public ushort[] HighLimit{ get; set; } = new ushort[8]; 

public ushort getRange(int index) { 
    ushort range = 0; 

    if(index < 8) 
     range = (ushort)(HighLimit[index] - LowLimit[index]); 
    return range; 
} 

public void setRange(int index, ushort value) { 
    if (index < 8) 
     HighLimit[index] = (ushort)(LowLimit[index] + value); 
} 
+1

FYI, bodied 속성 식은 액세스 할 때마다 코드 계산/실행을 수행합니다. 그래서 새로운 배열을 얻을 때마다 - 캐쉬되거나 필드에 저장되지 않습니다. – pinkfloydx33

+0

LowLimit과 Range는 소프트웨어가 통신하고있는 장치에서옵니다. LowLimit 및 HiLimit은 사용자가 소프트웨어에서 편집 할 수있는 매개 변수입니다. – jsun5192

답변

3

계산 된 속성이 항상 읽기 전용이므로 계산 된 속성을 양방향으로 만들 수 없습니다. 또한 배열을 반환하는 속성을 공개하면 메서드가 반환하는 배열에서 수행 된 수정 작업을 제어 할 수 없습니다. 배열은 본질적으로 변경할 수 있으므로 요소의 변경 내용을 "감시"할 방법이 없습니다.

이 같은 HiLimit 설정하는 방법을 제공함으로써이 문제를 해결할 수

void SetHiLimit(int index, ushort newLimit) { 
    // Change `Range` as needed 
} 

참고 :이 각을 재 계산되어 있으므로, 상기 어레이에 대해 계산 된 속성의 사용을 재고있다 당신이 접근 한 시간. 예를 들어 길이가 HiLimit 인 배열의 길이가 100이고 각 요소에 한 번 액세스하는 루프를 실행하면 코드는 배열을 100 번 다시 계산하여 100 개의 동일한 throw-away 복사본을 만듭니다. 전반적인 점근 적 성능은 O (n )입니다. 2).

+0

배열을 사용하지 않았다면 getter와 setter에 코드를 추가 할 수 있습니다. 속성을 사용하려고하는 이유는 바인딩을위한 것이므로이 경우 함수가 작동하지 않습니다. – jsun5192

+1

@ jsun5192 배열 타입의 프로퍼티를 반환하면'obj.HiLimit [1] = 123'을 할 때 setter를 호출 할 필요가 없습니다. 할당은 배열이 아니라 배열에서 수행되기 때문에 getter를 호출하지만 setter는 호출되지 않습니다. – dasblinkenlight

관련 문제