[C#] C #에서 “내부”키워드의 실제 사용

internalC # 에서 키워드 의 실제 사용법이 무엇인지 설명해 주 시겠습니까?

것을 나는 알고 internal현재 어셈블리에 대한 수정 액세스를 제한,하지만 나는 그것을 언제 어떤 상황에서 사용해야합니까?



답변

동일한 어셈블리 내의 다른 많은 클래스에서 액세스하려고하지만 다른 어셈블리의 코드에 액세스 할 수 없도록하려는 유틸리티 또는 도우미 클래스 / 방법.

에서 MSDN (archive.org를 통해) :

내부 액세스의 일반적인 사용은 구성 요소 기반 개발에 있으며, 이는 구성 요소 그룹이 나머지 응용 프로그램 코드에 노출되지 않고 개인 방식으로 협력 할 수 있기 때문입니다. 예를 들어, 그래픽 사용자 인터페이스를 구축하기위한 프레임 워크는 내부 액세스 권한이있는 멤버를 사용하여 협력하는 Control 및 Form 클래스를 제공 할 수 있습니다. 이러한 멤버는 내부에 있으므로 프레임 워크를 사용하는 코드에 노출되지 않습니다.

InternalsVisibleTo어셈블리 레벨 속성 과 함께 내부 수정자를 사용 하여 대상 어셈블리 내부 클래스에 대한 특별 액세스 권한이 부여 된 “친구”어셈블리를 작성할 수도 있습니다.

이는 유닛 테스트 어셈블리를 생성 한 다음 테스트 할 어셈블리의 내부 멤버를 호출 할 수 있도록하는 데 유용 할 수 있습니다. 물론 다른 어셈블리에는이 수준의 액세스 권한이 부여되지 않으므로 시스템을 해제하면 캡슐화가 유지됩니다.


답변

Bob이 BigImportantClass를 필요로하는 경우 Bob은 프로젝트 A를 소유 한 사람들이 가입하여 BigImportantClass가 자신의 요구를 충족하도록 작성되고, 그의 요구를 충족하는지 테스트하고, 그의 요구를 충족시키는 것으로 문서화되고, 프로세스임을 확인하도록해야합니다. 더 이상 그의 필요를 충족시키기 위해 변경되지 않도록하기 위해

클래스가 내부 클래스 인 경우 해당 프로세스를 거치지 않아도되므로 프로젝트 A의 예산을 절약하여 다른 것에 소비 할 수 있습니다.

내부의 요점은 그것이 밥에게 삶을 어렵게한다는 것이 아닙니다. 프로젝트 A가 기능, 수명, 호환성 등에 대해 비싼 약속을 제어 할 수 있습니다.


답변

internal을 사용해야하는 또 다른 이유는 바이너리를 난독 처리하는 것입니다. obfuscator는 내부 클래스의 클래스 이름을 스크램블하는 것이 안전하지만 공개 클래스의 이름은 기존 참조를 손상시킬 수 있으므로 스크램블 할 수 없다는 것을 알고 있습니다.


답변

많은 복잡한 기능을 간단한 공개 API로 캡슐화하는 DLL을 작성하는 경우 공개적으로 노출되지 않는 클래스 멤버에는 “내부”가 사용됩니다.

복잡성 숨기기 (일명 캡슐화)는 품질 소프트웨어 엔지니어링의 주요 개념입니다.


답변

내부 키워드는 관리되지 않는 코드 위에 래퍼를 작성할 때 많이 사용됩니다.

DllImport하려는 C / C ++ 기반 라이브러리가있는 경우 이러한 함수를 클래스의 정적 함수로 가져 와서 내부적으로 만들 수 있으므로 사용자는 원래 API가 아닌 랩퍼에만 액세스 할 수 있으므로 아무것도 엉망. 정적 함수는 필요한 여러 래퍼 클래스에 대해 어셈블리 어디에서나 사용할 수 있습니다.

Mono.Cairo를 살펴볼 수 있습니다.이 접근 방식을 사용하는 cairo 라이브러리를 감싸는 래퍼입니다.


답변

“엄격한 수정 자로 사용”규칙에 따라 구동되므로 다른 어셈블리에서 명시 적으로 액세스해야 할 때까지 다른 클래스의 메소드에 액세스해야하는 모든 곳에서 내부를 사용합니다.

어셈블리 인터페이스는 일반적으로 클래스 인터페이스의 합보다 좁기 때문에 사용하는 곳이 많이 있습니다.


답변

내부가 많이 남용되는 것을 알았습니다. 당신은 실제로 다른 소비자에게 제공하지 않을 특정 클래스에만 특정 기능을 노출해서는 안됩니다.

제 생각에는 인터페이스가 깨지고 추상화가 깨집니다. 이것은 절대 사용해서는 안된다는 것이 아니라 더 나은 해결책은 다른 클래스로 리팩토링하거나 가능한 경우 다른 방식으로 사용하는 것입니다. 그러나 이것이 항상 가능한 것은 아닙니다.

문제가 발생할 수있는 이유는 다른 개발자가 귀하와 동일한 어셈블리에 다른 클래스를 작성해야 할 책임이 있기 때문입니다. 내부가 있으면 추상화의 선명도가 떨어지고 잘못 사용되면 문제가 발생할 수 있습니다. 공개 한 것과 같은 문제입니다. 다른 개발자가 작성하는 다른 클래스는 여전히 외부 클래스와 마찬가지로 소비자입니다. 클래스 추상화와 캡슐화는 외부 클래스를 보호하기위한 것이 아니라 모든 클래스를 보호하기위한 것입니다.

또 다른 문제는 많은 개발자들이 당시 어셈블리가 필요하지 않더라도 어셈블리의 다른 곳에서 사용하고 내부로 표시해야 할 수도 있다고 생각 한다는 것 입니다. 그런 다음 다른 개발자가 가지고 갈 것이라고 생각할 수 있습니다. 일반적으로 결정이 필요할 때까지 비공개로 표시하려고합니다.

그러나이 중 일부는 주관적 일 수 있으며 절대 사용해서는 안된다는 말은 아닙니다. 필요할 때만 사용하십시오.