2012-05-01 1 views

답변

6

당신은 버그라고 생각하는 부분이 확실하지 않지만, 컴파일 할 때 반성을 통해 클래스의 내부에 액세스하는 것은 항상 가능했습니다. 이는 의도적으로 설계된 동작입니다. CLR의 여러 측면은 직렬화와 같은 필드 액세스에 대한 리플렉션에 의존합니다. 컴파일 된 IL은 모든 개체의 모든 필드에 액세스 할 수 있어야합니다. 그렇지 않으면 개인 필드를 에서 범위 내로 설정할 수 없습니다.

C#의 액세스 한정자는 보안 메커니즘이 아닙니다. 누군가가 외부에서 그것을 설정하는 것을 막기 위해 사적인 영역에 의존한다면, 당신은 잘못된 행동을하고있는 것입니다. 클래스의 어느 부분이 구현 세부 사항 (및 따라서 예고없이 변경 될 수있는 공개 계약 (따라서 이론적으로 안정))인지 ​​명확하게 설명합니다.

리플렉션을 사용하도록 선택하면 객체의 내부 상태를 변경하십시오. 모든 징후가 있지만 혼자 남겨 두어야합니다. 응용 프로그램의 안정성을 자신의 손안에 가져 가면 어떤 대가를 치를 수 있습니다.

+1

보안 메커니즘이 확실하지 않습니다. 부분적으로 신뢰할 수있는 코드가 다른 유형의 비공개 멤버에 액세스 할 수없는 이유가 있습니다. – svick

+0

좋은 대답은 .... – MarkP

0

리플렉션은 완전 신뢰 코드에만 허용되므로 코드에서 이미 아무 것도 할 수 있습니다 (프로세스의 메모리에 직접 파고 들기 포함). 따라서 사유 재산에 대해서도 값을 변경하는 방법을 지원한다고해서 코드의 안전성이 떨어지는 것은 아닙니다. 리플렉션 API를 일관되게 만들고 특히 테스트를위한 유용한 시나리오를 제공합니다.

관련 문제