2008-09-20 3 views
40

저는 꽤 새로운 C# 및 .Net 개발자입니다. 나는 최근에 C#을 사용하여 MMC 스냅인을 만들었고, 특히 C++에서 얼마나 어려운지에 대한 내 조직의 다른 개발자들에 의한 많은 공포 이야기를 듣고 나서 얼마나 쉬운가에 만족했습니다.기본적으로 내부 공개 여부를 사용해야합니까?

나는 스냅 샷을 실행하기 위해 런타임에서 요구하는 경우를 제외하고는 거의 모든 프로젝트를 거쳐 "공개"키워드의 모든 인스턴스를 "내부"로 만들었습니다. 일반적으로 클래스와 메소드를 공개 또는 내부로 만들면 어떤 느낌이 드나요?

답변

35

가능한 경우 블랙 박스를 믿습니다. 프로그래머로서 필자는 시스템에 쉽게 침투 할 수있는 잘 정의 된 블랙 박스를 원한다. 나는 값을주고 적절한 방법을 호출 한 다음 내 결과를 다시 얻는다.

이 목적을 위해 클래스가 작동하는 데 필요한 기능 만 제공하십시오.

엘리베이터를 고려하십시오. 바닥으로 가려면 버튼을 누릅니다. 이것이 원하는 층으로 엘리베이터를 가져 오는 데 필요한 모든 기능을 활성화하는 블랙 박스에 대한 공용 인터페이스입니다.

+0

1 :

는 디폴트 범위는 내부에 http://msdn.microsoft.com/en-us/library/0b0thckt.aspx

좋은 문서를 참조하십시오. –

+0

그 외에도 전화하기 전에 활성화되지 않았습니다. – izbrannick

0

얼마나 많은 제어 기능을 사용하는 코드와 관련이 있습니다. 내 Java 개발에서는 getter가 성가신 일이기 때문에 기본적으로 내 모든 항목을 최종본으로 공개합니다. 그러나, 나는 또한 언제든지 내 코드베이스에서 무엇이든 변경할 수 있다는 사치를 가지고있다. 과거에는 소비자에게 코드를 공개해야했지만 항상 개인 변수와 getter를 사용했습니다.

1

가능한 한 다른 수업에 노출되는 경향이 있으며 노출하는 내용과 그 이유에 대해 신중하게 생각해야합니다.

0

해당 기본 클래스에 대한 가시성 요구 사항에 가장 적합한 것을 "기본값"으로 선택하지 마십시오. (더 범위가 지정되지 않기 때문에) 개인이다

class Class1 
{ 
} 

: 당신은 Visual Studio에서 새로운 클래스를 선택하면, 템플릿은 다음과 같이 생성됩니다. 클래스의 범위를 지정하는 것은 사용자의 몫입니다 (또는 비공개로 유지). 수업을 폭로해야 할 이유가 있어야합니다.

+0

어떤 상황에서 내부, 공개 또는 비공개를 선택 하시겠습니까? 어떤 특별한 필요가 당신을 선택하는데 영향을 줄 수 있습니까? –

+0

내부 및 개인은 중첩되지 않은 클래스에 대해 모두 똑같은 것으로 알고 있습니다. 두 가지 모두 전체 어셈블리에서만 볼 수 있습니다. (또는 InternalsVisibleTo 특성을 사용할 때 차이가 있습니까?) – Tobi

+5

"다른 형식으로 중첩되지 않은 최상위 형식은 내부 또는 공용 액세스 가능성 만 가질 수 있습니다. 이러한 형식의 기본 액세스 가능성은 내부적입니다." (http://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx) – Auron

0

저는 가능한 한 사물을 드러내는 것을 좋아합니다. 개인, 보호, 내부, 공개 : 클래스, 변수, 속성 및 함수에 모든 것이 여전히 작동하기 위해 필요한 최소한의 가시성을 제공합니다.

내가 좋은 이유가있을 때만 대중에게 그 사슬의 눈에 띄는 것을 볼 것입니다.

4

고객에게 명시 적으로 소비하고 싶지 않고 클래스를 지원할 준비가되지 않은 경우 클래스를 public으로 표시하지 않는 것이 좋습니다.

클래스를 internal으로 표시하는 대신 액세스 가능성을 비워 둡니다. 이렇게하면 public 눈에 눈에 띄는 것으로 눈에 띄게됩니다. 물론 예외는 중첩 된 클래스이기 때문에 동일한 어셈블리에서도 표시해야하는 경우 표시해야합니다.

7

내부 클래스 및 멤버 측에서 오류가 발생한다고 생각합니다. 항목의 가시성을 늘리면 문제가 발생할 수 있습니다. 다른 사람을위한 프레임 워크를 구축하는 경우 특히 그렇습니다.

유용한 기능을 사용자에게 숨기지 않도록주의해야합니다. 리플렉션을 사용하지 않고 사용할 수없는 .NET BCL에는 유용한 메소드가 많이 있습니다.그러나 이러한 방법을 숨김으로써 테스트되고 유지되어야하는 표면적이 감소됩니다.

1

개인 대신 내부를 사용해야하는 이유가 있습니까? Internal은 어셈블리 레벨 범위를 가지고 있다는 것을 알고 있습니다. 즉, 내부 클래스/멤버는 다중 클래스 어셈블리의 모든 클래스에서 액세스 할 수 있습니다.

다른 답변에서 말한 것처럼 내부/보호/공개가 실제로 필요한 경우가 아니면 일반적으로 가능한 한 최고 수준의 캡슐화 (예 : 개인)로 이동하십시오.

11

당신이 한 일은 당신이해야 할 일입니다. 가능한 최소한의 가시성을 수업에 부여하십시오. 지옥, 진짜 돼지를 찾으려면 을 모두internal (최대)으로 만들고 InternalsVisibleTo attribute을 사용하면 기능을 분리 할 수 ​​있지만 알려지지 않은 외부 세계에 노출되지 않도록 할 수 있습니다.

일을 공개하는 유일한 이유는 프로젝트를 여러 DLL 및/또는 EXE로 패키징하고 어떤 이유로 든 InternalsVisibleTo을 사용하지 않거나 사용할 라이브러리를 만드는 경우입니다. 제 3 자에 의해. 그러나 제 3자가 사용하는 도서관에서도 가능한 한 "표면적"을 줄여야합니다. 사용할 수있는 수업이 많을수록 라이브러리가 혼란 스럽습니다.

C#에서는 가능한 한 최소한의 가시성을 사용하고 있는지 확인하는 좋은 방법 중 하나는 필요할 때까지 가시성 수정 기호를 사용하지 않는 것입니다. C#의 모든 것은 기본적으로 가능한 한 가시성이 가장 낮습니다. 즉, 클래스는 내부이고, 클래스 멤버와 내부 클래스는 private입니다.

1

가능한 한 내부 클래스을 사용하여 문제가 발견되었습니다. 해당 유형 (또는 매개 변수 유형 또는 리턴 유형)의 메소드, 특성, 필드 등을 내부보다 더 많이 볼 수는 없습니다. 이로 인해 속성뿐만 아니라 내부의 생성자가 생성됩니다. 이것은 문제가되지 않지만 사실 Visual Studio와 xaml 디자이너를 사용할 때 문제가 있습니다. 디자이너가에서 메서드가 public이 아니기 때문에 false positive 오류가 검색되었으므로 사용자 정의 컨트롤 속성이 디자이너에게 표시되지 않는 것처럼 보입니다. 나는 다른 사람들이 이미 그런 문제에 빠져 있었는지 모르겠다. ...

+1

잘못되었습니다. 내부 클래스에 대한 공용 메서드 및 속성을 가질 수 있으며 실제로 그렇게하는 것이 많은 사람들에게 권장됩니다. – kjbartel

1

위의 Mike가 말했듯이, 이것은 UserControls에 문제를 일으키고 VS Designer를 사용하여 양식 또는 다른 UserControls 컨트롤.

일반적으로 Designer를 사용하여 추가 할 필요가없는 모든 클래스와 UserControl은 필요한 대로만 유지하십시오. 디자이너에서 UserControl 클래스, 기본 생성자 및 모든 속성 및 이벤트를 공용으로 만들어야하는 경우 (동일한 어셈블리 내에있는 경우에도) Designer에서 사용하려는 UserControl을 만듭니다. 그것으로 작업 할 수 있습니다.

최근에 디자이너에서 UserControl MyControl이 생성자와 함께 내부로 표시되었으므로 디자이너가 this.myControl = new MyControl() 줄을 InitializeComponent() 메서드에서 제거하는 문제가있었습니다.

정말 내부 버그로 표시 되어도 도구 상자에 나타나서 Microsoft에서 공용 생성자 만 공개 컨트롤을 표시해야하거나 작동하도록해야하기 때문에 실제로 버그라고 생각합니다. 내부 통제도 마찬가지입니다.

0

나는 지금까지의 답변에 완전히 동의하지 않습니다. 나는 내부가 무서운 생각인데, 다른 어셈블리가 당신의 타입을 상속하지 못하도록하거나, 심지어 당신의 내부 타입을 사용하여 회피 할 필요가 생겼을 때를 생각한다.

오늘은 System.Data.DataTable의 내부 구조를 가져 오기 위해 리플렉션을 사용해야했습니다. (모든 체크를하지 않고도 데이터 테이블 번개를 빠르게 만들어야합니다.) 리플렉션을 사용해야했습니다. 나에게 사용할 수있는 단일 유형이 아닙니다. 그들은 모두 내부로 표시했다.

+1

'internal'이 존재하기 때문에 API 공급 업체 (예 : MS)는 코드를 사용하여 임의의 낯선 사람에 대해 걱정하지 않고 클래스를 작성할 수 있습니다. API가 공개 될 때마다 공급 업체는 더 이상 서명을 쉽게 변경할 수 없습니다. '내부'가 선택되면 MS는 다른 사람의 코드를 위반할 염려없이 코드를 변경할 수 있습니다. 즉, 그들이 "속임수"를 사용하지 않는다면 말입니다. –

+0

나는 개인과 보호 된 회원들도 똑같이 할 수 있다고 주장한다. 그래서 적어도 누군가가 잠수 할 때 ("나는 언제"라고 말했을 때) 반성 대신 강한 타이핑을 사용할 수있다. –

+1

@Pedar,'private '을 사용하면 어떻게 반사보다는 강력한 입력을 사용하는 것이 더 쉬워 집니까? 'private'은'internal'보다 ** less ** 접근 가능합니다. 그리고 만약 당신이'protected'를 사용한다면 API의 ** 계약 **의 일부가되며 MS는 그것을 변경하는 것이 금지 될 것입니다. 나는 내가 그 점을 무시했다고 생각합니다. –

2

대부분의 수업은 internal이어야하지만 대부분의 비공개 회원은 public이어야합니다.

회원에 대해 물어 봐야 할 질문은 "수업이 만들어진 경우 public 회원이 회원에게 노출되기를 원하십니까?"입니다. 액세스 할 수있는 멤버가없는 클래스는별로 사용하지 않으므로 일반적으로 대답은 "예 (public)"입니다. internal 회원에게는 역할이 있습니다. 그들은 동일한 집회에 사는 가까운 친척들에게만 의미가있는 '뒷문 접근'입니다.

클래스가 내부에 있더라도 어느 것이 프론트 도어 멤버이고 백도어인지 확인하는 것이 좋습니다. 그리고 대중에게 그것을 바꿀 수 있다면, 당신은 돌아가서 어떤 것에 대해 생각할 필요가 없을 것입니다.

관련 문제