2014-04-09 3 views
0

나는 char 리미트로 관리하고 문자열을 도울 수있는 Ascii 클래스를 가지고 있으며 char처럼 증가시킬 수 있기를 원하기 때문에 연산자 오버로드가 발생한다. 주어진 다음 코드 :연산자 오버로드, 딥 복사가 필요합니까?

public static AsciiWord operator++(AsciiWord aWord){ 
     aWord.numValue++; 
     return aWord.Copy(); 
    } 

정말 사본이 필요합니까?

참고 : 복사는 확장 방법입니다. 나는 거의 모든 것의 전체 복사본을 수행하는 SO를 복사했습니다.

+1

'연산자 ++'를 오버로드하는 대신 적절한 이름으로 메소드를 구현하는 것이 좋습니다. – Henrik

답변

4

증가 연산자는 원래 값을 변경하지 않고 그대로 유지하고 증분 복사본을 반환합니다. 그러나 구현시 전달 된 aWord을 인수로 변경하려고합니다.

예컨대, 다음 코드는 이후 수정 증가 연산자를 사용하고 0으로 oldValue.NumValue을 기대하지만, 현재 구현은 즉 (1)

AsciiWord aWord = new AsciiWord { NumValue = 0 }; 
AsciiWord oldValue = aWord++; 
Assert.Equal(0, oldValue.NumValue); // fails 

int i = 0; 
int oldIntValue = i++; 
Assert.Equal(0, oldIntValue); //passes 

될 것입니다 - 깊이 불변해야 AsciiWord을.

+0

그렇다면 먼저 깊은 복사를 제안한 다음, numValue 사본을 복사 한 다음 사본을 반환 하시겠습니까? –

+0

그것은 다소 받아 들일 수 있지만, 이상적인 해결책은'AsciiWord'를 완전히 변경할 수 없도록 만드는 것입니다. 즉, 모든 필드가'readonly'로 표시되어 있는지 확인하십시오. * 매번 필드/속성 중 하나를 변경해야 할 때마다 완전히 새로운 객체를 만들어야합니다. 'string'과 같습니다. – dcastro

+0

그리고 그것은 'AsciiWord'와 그것이 의존하는 모든 유형 모두에 적용됩니다. 그렇게 할 수 없다면 Henrik의 제안과 함께'++ '연산자를 오버로드하는 대신 Increment() 메서드를 구현하는 것이 좋습니다. – dcastro