2012-10-03 1 views
13

DLL에서이 열거 형을 상상해보십시오.enum 값을 추가하면 바이너리 호환성이 손상됩니까?

public enum Colors 
{ 
    Red, 
    Green 
} 

열거 형 값을 추가하면 이진 호환성이 저하됩니까? 변경하려면 기존 EXE가 중단됩니까?

public enum Colors 
{ 
    Red, 
    Green, 
    Blue 
} 

나는 this answer을 보았다하지만 값을 삽입 의 경우를 해결하는 것 같았다. 끝에 값을 추가하면 만 괜찮습니까?

답변

17

아니요, 열거 형은 기본적으로 정수 리터럴 상수이므로 이진 호환성을 손상시키지 않습니다 (어셈블리에서 여전히로드 등). 중간에 값을 삽입하는 것은 분명히 위험한 아이디어이지만, 이미 제외 시켰습니다.

그러나, 당신이 방지해야 할 다른 문제의 숫자가 발생할 수 있습니다 (특히 switch 문) 새 값을 예상하지 않을 수 있습니다

  • 몇 가지 코드를; 열거 값-확인 (열거 변수가 정의되지 않은 값을 포함 할 수 있습니다)
  • 가능한 열거를 조회
  • 아무것도 다른 결과 특히
    • 을받을 것입니다 아니기 때문에 기술적으로이 너무 전에 문제가 있었다, 직렬화 및 역 직렬화 실패 할 수 있습니다 아직 당신은 단지 끝에 추가 가정, 특정 클라이언트
+1

굉장합니다. 파손에 저항하기 위해 무엇을 할 수 있습니까? 분명히, 만약 내가 그것을 가지고 있다면, 나는 enum에 추가하지 않을 것이다. 그러나 상황을 고려할 때, 이것에 접근하는 가장 안전한 방법은 무엇인가? switch 문 (의도하지 않은 말장난)의 경우,'default :'슬롯을 지정하면 전혀 변경되지 않습니다. – TheBuzzSaw

+1

@ TheBuzzSaw 파손을 방지하는 가장 좋은 방법은 시간이 끝날 때까지 동일하게 유지되지 않을 것으로 예상되는 것에 대해서는 enum을 사용하지 않는 것입니다. – Servy

+0

@Servy 동의 ...하지만 지금 열거 형에 붙어 있기 때문에, 그 밖의 무엇이 있습니까? ;) – TheBuzzSaw

3

괜찮을한다 기대하지 않는 열거 형을 사용하여 데이터가 예기치 않게합니다. 그러나 enum 값은 암시 적으로 0부터 시작하여 정의된다는 사실 때문에 깨질 위험이 있습니다. 따라서 누군가가 DB에 값을 유지하면 값이 매핑되는 값이 변경 될 위험이 있습니다. 자신의 데시벨에이 값을 저장

public enum Colors 
{ 
    Blue, 
    Red, 
    Green 
} 

누구나 한 번 레드 있었다 일이, 지금은 블루 것을 볼 것이고, 어떤 녹색이었다 지금이다 : 당신이 당신의 열거를 변경 한 경우 예를 들어

이 될 수 있습니다 빨간.

이상적으로, 당신은 다음처럼 열거를 정의해야합니다 : 당신은 새로운 하나를 추가 할 때 다음

public enum Colors 
{ 
    Red = 0, 
    Green = 1 
} 

과를, 당신은해야합니다

public enum Colors 
{ 
    Red = 0, 
    Green = 1, 
    Blue = 2 
} 

이 잠재적 인 버전 관리 문제를 예방하는 데 도움이됩니다 .

+0

+1. 내가 할 수 있으면이 녹색 체크를 너무 줄 것이다. 이것은 열거 형을 더 단단하게 만드는 현명한 방법입니다. – TheBuzzSaw

+0

사양에서는 특별히 값을 지정하지 않으면 0에서 시작하여 각 값마다 1 씩 증가하므로 배킹 정수가 첫 번째 경우에 대해 정의되지 않은 동작이 아니라고 명시되어 있습니다. 그냥 끝에 추가 할 수 있습니다. – Servy

+0

맞아요,하지만 끝에 추가해야합니다. 그렇지 않으면 끊어집니다. –