문제

나는 공개 방법에 대해 여러 번 반사를 사용했지만 개인 방법도 호출 할 수 있다는 것을 결코 깨닫지 못했습니다. 보다 개인 회원과의 반성.

왜 처음부터 허용 되는가? "개인"이라는 규칙이 "개인"이라는 규칙을 어 기지 않습니까?

도움이 되었습니까?

해결책

private C#에서는 진정으로 언어 사양의 일부일뿐입니다. C# 언어뿐만 아니라 시각적 기본 언어 또는 기타 현명한 .NET 언어 (포함 , 모든 .NET 언어가 컴파일하는 것) 하나가 액세스하는 것을 방지합니다. private (또는 protected, 당신이 파생 클래스 내에 있지 않다면) 회원 언어로. 그러나 언어가 공개적으로 액세스하는 것을 지원하지 않기 때문에 private 또는 protected 회원은 의미하지 않습니다 기본 프레임 워크 그 회원들에게 액세스 할 수 없습니다.

이것은 일반적으로 하나의 경우 중 하나입니다 그렇지 않아야합니다 리플렉션과 같은 해결 방법을 사용하여 액세스하거나 수정하십시오 private 또는 protected 멤버이지만 프레임 워크는 어쨌든 하나를 허용합니다. 일반적으로, 당신은 a가 있어야합니다 매우 접근 할 좋은 이유 private 또는 protected 회원; 예를 들어, 그러한 이유 중 하나는 객체를 올바르게 직렬화하기 위해 객체의 내부 상태를 살펴 봐야하는 직렬 라이저를 구현하기 때문입니다. 당신이 그런 일을하지 않는다면, 당신은 당신이 내부에서 찌르는 수업을 다시 구현하는 것을보아야하므로 프로그램에 반영을 사용할 필요가 없습니다.

다른 팁

이는 코드가 완전한 신뢰 (또는 관련 허가로)에 따라 실행될 때만 허용됩니다. 그렇지 않으면, a MethodAccessException 던질 것입니다.

프레임 워크는 액세스를 적절하게 제한 할 수 있습니다. 완전한 신뢰하에 있거나 특정 권한이있을 때는 그렇지 않습니다. 보다 "반사를위한 보안 고려 사항" 이 작업을 수행 할 수있는시기에 대한 자세한 내용은 자세한 내용입니다.

그렇습니다. 규칙을 어 기고 있습니다. 누군가가 이것을했다면 리뷰 중에 코드를 거의 전달하지는 않을 것입니다.

방법을 호출하기 위해 반사를 사용하는 것은 유형-안전이 아닌 slllloooow이며, 기본 클래스에 개인 메소드가 재 작업 된 경우 쉽게 깨집니다.

요컨대, 나는 나쁜 생각이라는 데 동의합니다!

이것은 프레임 워크에서 얻는 고급 전력입니다. 제작 코드에서 사용하는 것은 매우 드문 일이며,이를 호출하는 방법은 숨어있는 회원의 장점을 깨뜨립니다.

유용 할 수있는 곳이 있습니다.

  • 레거시 코드 테스트 - 예를 들어, 레거시 코드로 작업 중이며 단위 테스트로이를 다루고 싶다고 가정합니다. 코드를 변경하지 못하고 기능의 작은 부분을 개인 메소드를 호출하는 것이 유용합니다.
  • 생산 코드의 해킹 - 일부 시나리오에서 개인 청소가 완료되지 않은 제 3 자 컨트롤에서 버그가 한 번 발생했습니다. 개인 호출을 사용하여 작업을 수행 할 수 있습니다.

이 기능을 제공하는 프레임 워크에는 아무런 문제가 없지만 필수가 아닌 곳에 사용하는 것이 잘못되었습니다.

반사는 .NET에서 강력한 기능이지만 단점도 있습니다.

장점 :

  1. 반사는 모든 회원 (개인 및 보호를 포함하여)에 액세스 할 수 있습니다. 반사 분열 보안. (이 권한은 응용 프로그램이 인터넷이 아닌 동일한 드라이브에서 반사 된 어셈블리에 액세스 할 때 얻을 수 있습니다.)

  2. 드문 경우에는 반사가 작업을 수행하는 유일한 방법입니다.

단점 :

  1. 반사는 보안을 중단합니다 (어셈블리를 디 컴파일하는 것과 마찬가지로). 애플리케이션 코드 및 데이터에 대한 완전한 보안을 얻으려면 암호화를 사용해야합니다. 혼자서는 반사 나 소환을 통해 쉽게 깨질 수 있기 때문에 개인 또는 보호 된 키워드에 의존하는 것이 아니라 암호화를 사용해야합니다.

  2. 반사는 정적 참조 (정상적인 방법)보다 훨씬 느리고 더 많은 리소스를 소비합니다. 이러한 이유로 문제를 해결하는 유일한 방법이 아니라면 반성을 피해야합니다.

반사가 문제를 해결하는 유일한 방법 인 경우 :

  1. 응용 프로그램이 코드를 동적으로 컴파일한다고 가정합니다 (예 : 사용자가 런타임에 제공하는 기능을 플로팅 할 때). 그러한 경우, 어셈블리와 유형을로드하는 유일한 방법은 반사를 통한 것입니다.

  2. 당신은 물체를 복제하고 싶습니다. 개인 필드에 액세스하려면 반사를 사용해야합니다.

이게 도움이 되길 바란다. 그의 아름다운 책인 Microsoft Visual Basic 2005 : The Language에 대해 Francesco Balena 씨에게 감사드립니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top