문제

저는 꽤 새로운 C# 및 .Net 개발자입니다.저는 최근에 C#을 사용하여 MMC 스냅인을 만들었고 그 작업이 얼마나 쉬운지에 대해 만족했습니다. 특히 C++로 수행하는 것이 얼마나 어려운지에 대해 조직의 다른 개발자들로부터 많은 끔찍한 이야기를 듣고 나서 더욱 그렇습니다.

나는 어느 시점에서 전체 프로젝트를 거의 진행했으며 스냅인을 실행하기 위해 런타임에 필요한 경우를 제외하고 "public" 키워드의 모든 인스턴스를 "internal"로 만들었습니다.이에 대한 당신의 생각은 어떻습니까? 일반적으로 클래스와 메소드를 공개로 설정해야 할까요? 아니면 내부로 설정해야 할까요?

도움이 되었습니까?

해결책

나는 가능하다면 블랙박스를 믿습니다.프로그래머로서 나는 내 시스템에 쉽게 삽입하여 작동할 수 있는 잘 정의된 블랙박스를 원합니다.값을 지정하고 적절한 메서드를 호출한 다음 결과를 다시 가져옵니다.

이를 위해 클래스가 작업에 노출하는 데 필요한 기능만 제공하십시오.

엘리베이터를 생각해 보세요.바닥으로 이동하려면 버튼을 누릅니다.이는 엘리베이터를 원하는 층으로 이동시키는 데 필요한 모든 기능을 활성화하는 블랙박스에 대한 공용 인터페이스입니다.

다른 팁

당신이 한 일은 바로 당신이 해야 할 일입니다.수업에 최대한 최소한의 가시성을 제공하십시오.젠장, 정말로 돼지를 다 먹고 싶다면 이렇게 하면 됩니다. 모든 것 internal (최대) 다음을 사용합니다. InternalsVisibleTo 기인하다, 기능을 분리할 수 있지만 여전히 알려지지 않은 외부 세계에 노출되지 않도록 합니다.

공개하는 유일한 이유는 프로젝트를 여러 DLL 및/또는 EXE로 패키징하고 있고 (어떤 이유로든) 사용하고 싶지 않기 때문입니다. InternalsVisibleTo, 또는 제3자가 사용할 라이브러리를 만드는 중입니다.그러나 제3자가 사용하는 라이브러리에서도 가능하면 "표면적"을 줄이도록 노력해야 합니다.이용 가능한 수업이 많아질수록 도서관은 더욱 혼란스러워질 것입니다.

C#에서 가능한 최소 가시성을 사용하고 있는지 확인하는 좋은 방법 중 하나는 필요할 때까지 가시성 수정자를 그대로 두는 것입니다.C#의 모든 항목은 기본적으로 최소한의 가시성을 유지합니다.클래스의 경우 내부, 클래스 멤버 및 내부 클래스의 경우 비공개입니다.

내부 클래스와 멤버 측면에서 실수를 해야 한다고 생각합니다.언제든지 항목의 가시성을 높일 수 있지만 이를 줄이면 문제가 발생할 수 있습니다.다른 사람을 위한 프레임워크를 구축하는 경우 특히 그렇습니다.

사용자에게 유용한 기능을 숨기지 않도록 주의해야 합니다..NET BCL에는 리플렉션을 사용하지 않고는 사용할 수 없는 유용한 방법이 많이 있습니다.그러나 이러한 방법을 숨기면 테스트하고 유지 관리해야 하는 표면적이 줄어듭니다.

나는 수업을 다음과 같이 표시하는 것을 선호하지 않습니다. public 고객이 이를 소비하기를 명시적으로 원하지 않고 이를 지원할 준비가 되어 있지 않은 한.

클래스를 다음과 같이 표시하는 대신 internal, 접근성을 비워 둡니다.이 방법, public 눈에 띄는 것이 눈에 띕니다.(물론 동일한 어셈블리에서도 표시하려면 표시해야 하는 중첩 클래스는 예외입니다.)

대부분의 수업은 internal, 하지만 대부분의 비공개 회원은 public.

회원에 대해 꼭 물어봐야 할 질문은 '클래스가 만들어졌느냐'이다. public 노출될 멤버를 원할까요?"대답은 대개 "그렇습니다. public)" 접근 가능한 멤버가 없는 클래스는 별로 쓸모가 없기 때문입니다!internal 회원에게는 역할이 있습니다.이는 같은 집회에 거주하는 가까운 친척들만을 위한 '백도어 접근'입니다.

수업이 내부에 남아 있더라도 누가 프론트 도어 멤버이고 누가 백도어 멤버인지 확인하는 것이 좋습니다.그리고 공개로 변경한 경우 다시 돌아가서 어느 것이 무엇인지 생각할 필요가 없습니다.

가능한 한 다른 클래스에 노출을 최소화하는 경향이 있어야 하며 노출하는 내용과 그 이유에 대해 신중하게 생각해야 합니다.

Private 대신 Internal을 사용해야 하는 이유가 있나요?내부에는 어셈블리 수준 범위가 있다는 것을 알고 있습니다.즉, 내부 클래스/멤버는 다중 클래스 어셈블리의 모든 클래스에 액세스할 수 있습니다.

다른 답변에서 알 수 있듯이 실제로 내부/보호/공개가 필요하지 않는 한 일반적으로 가능한 한 최고 수준의 캡슐화(예: 비공개)를 선택하세요.

나는 찾았다 내부 클래스 사용 문제 가능한 한 많이.내부보다 더 눈에 띄는 해당 유형(또는 매개변수 유형 또는 반환 유형)의 메서드, 속성, 필드 등을 가질 수 없습니다.이로 인해 내부 생성자와 속성이 생성됩니다.이는 문제가 되지 않지만 실제로 Visual Studio와 xaml 디자이너를 사용할 때 문제가 있습니다. 디자이너가 거짓 긍정 오류를 감지합니다. 메서드가 공개되지 않기 때문에 사용자 컨트롤 속성이 디자이너에게 표시되지 않는 것 같습니다.다른 사람들도 이미 그런 문제에 빠졌는지 모르겠습니다 ...

가능한 한 표시되도록 노력해야 하지만 위에서 Mike가 설명한 대로 이로 인해 UserControls 및 폼이나 다른 UserControls의 해당 컨트롤과 함께 VS 디자이너를 사용하는 데 문제가 발생합니다.

따라서 일반적으로 디자이너를 사용하여 추가하지 않은 모든 클래스와 UserControl은 필요한 만큼만 표시되도록 유지하십시오.그러나 디자이너에서 사용하려는 UserControl을 만드는 경우(동일한 어셈블리 내에 있더라도) UserControl 클래스, 기본 생성자 및 모든 속성 및 이벤트가 디자이너에 대해 공개되어 있는지 확인해야 합니다. 그것으로 작업합니다.

최근 UserControl MyControl이 해당 생성자와 함께 내부로 표시되었기 때문에 디자이너가 초기화 구성 요소() 메서드에서 this.myControl = new MyControl() 줄을 계속 제거하는 문제가 있었습니다.

내부로 표시되어 있어도 디자이너에 추가하기 위해 도구 상자에 계속 표시되기 때문에 실제로 버그라고 생각합니다. Microsoft는 공개 생성자가 있는 공개 컨트롤만 표시해야 하거나 다음과 같이 내부 컨트롤과 작동하도록 해야 합니다. 잘.

이를 사용하는 코드에 대해 얼마나 많은 제어권을 갖고 있는지에 따라 다릅니다.Java 개발에서는 getter가 귀찮기 때문에 기본적으로 모든 항목을 public final로 설정합니다.그러나 나는 원할 때마다 내 코드베이스의 무엇이든 변경할 수 있는 사치도 누리고 있습니다.과거에는 소비자에게 코드를 공개해야 할 때 항상 개인 변수와 getter를 사용했습니다.

특정 클래스의 가시성 요구 사항에 가장 적합한 "기본" 선택을 선택하지 마십시오.Visual Studio에서 새 클래스를 선택하면 템플릿이 다음과 같이 생성됩니다.

class Class1
{
}

범위가 지정되지 않았기 때문에 비공개입니다.클래스의 범위를 지정하거나 비공개로 남겨두는 것은 사용자의 몫입니다.클래스를 노출하는 데에는 이유가 있어야 합니다.

나는 가능한 한 물건을 적게 노출시키는 것을 좋아합니다.개인, 보호, 내부, 공개:클래스, 변수, 속성 및 함수에 모든 것이 계속 작동하는 데 필요한 최소한의 가시성을 제공합니다.

타당한 이유가 있는 경우에만 공개적으로 해당 체인의 가시성을 높일 것입니다.

나는 지금까지의 답변에 완전히 동의하지 않습니다.내부는 다른 어셈블리가 귀하의 유형을 상속하지 못하게 하거나 해결 방법이 필요할 경우 내부 유형을 사용하는 것을 막는 끔찍한 아이디어라고 생각합니다.

오늘은 System.Data.DataTable의 내부에 접근하기 위해 리플렉션을 사용해야 했고(모든 검사 없이 매우 빠르게 데이터 테이블을 구축해야 했습니다), 단일 유형이 아니기 때문에 리플렉션을 사용해야 했습니다. 나에게 이용 가능했습니다.그들은 모두 내부로 표시되었습니다.

기본적으로 클래스는 C#에서 내부로 생성됩니다.내부 수단:액세스는 현재 어셈블리로 제한됩니다.

보다http://msdn.microsoft.com/en-us/library/0b0thckt.aspx

좋은 기사 기본 범위는 내부입니다.http://www.c-sharpcorner.com/UploadFile/84c85b/default-scope-of-a-C-Sharp-class/

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