2010-05-03 4 views
3

클래스를 내부 클래스로 정의 할 때 일반적으로 공용 필드를 내부 클래스로 정의 할 수 있습니까? 아니면 공개로 남겨 두시겠습니까? 나는 내부/외부로 설정하기로 결정한 public/private 메소드를 가진 클래스들을 가지고있다. 이제 클래스의 수정자를 internal로 변경하고 메소드/속성의 나머지 부분을 공개/비공개로 변경하거나 내부/개인으로 전환해야합니까?클래스를 내부 클래스로 정의 할 때 일반적으로 공용 필드를 내부 클래스로 정의 할 수 있습니까?

내부적으로 변경하는 것이 큰 의미가 없습니다. 나중에 어떤 이유로 든 다시 공개로 설정하려는 경우 다시 공개해야 할 작업이 많습니다.

다른 의견이 있으십니까?

답변

6

어쨌든 클래스가 외부 어셈블리에 표시되지 않으므로 공개하지 않는 이유가 없습니다. 이 문제가 중요하다고 생각하는 유일한 경우는 해당 클래스에 대한 리플렉션을 사용하는 경우입니다.

1

개인 회원을 내부로 변경해서는 안되기 때문에 에 액세스 할 수 있습니다. 정의 멤버십 외부의 어떤 것도 내부 클래스에 대한 참조를 얻을 수 없으므로 공개 멤버를 내부 멤버로 변경할 필요가 없습니다.

2

클래스가 내부적 인 경우 클래스 멤버를 공개 (또는 보호 된/개인적으로 개인적인 경우)합니다. 나는 종종 내가 수업을 받으면서 내가 내부를 유지할 수 있기를 바란다는 것을 알게된다. 나는 결국 결국 모든 적절한 회원들을 대중에게 돌려 보내야하는 것을 성가 시게한다.

1

유형이 공개 된 경우 일반 회원에게 동일한 가시성을 주어야한다고 생각합니다.

공개 API의 일부인 구성원은 공개이어야하며 "친구"클래스에서만 볼 수 있어야하는 특수 목적의 도우미는 내부에 있어야합니다.

이것은 유형 공개를 결정한 경우 회원 공개 여부가 변경되지 않음을 의미합니다.

더 중요한 것은, 또한 의도를 문서화합니다. 코드를 읽는 사람은 내부 멤버가 누구인지 파악할 수 있습니다.

0

우리는 내부 클래스의 멤버에 대해 내부 키워드를 사용하므로 의도가 명확합니다. 그러나 멤버가 공개로 정의되어야하는 내부 인터페이스를 암시 적으로 구현하면 실패합니다. 우리는 이유를 알지 못하며 이것을 우리가 살아야만하는 언어 사양의 우발적 실수로 간주합니다.

0

Reflector에서 약간 파고 보면 BCL 자체가이 점에 대해 크게 모순 된 것을 알 수 있습니다. public 회원을 가진 많은 내부 수업과 internal 회원을 가진 많은 다른 수업을 보게됩니다. 여러 클래스는 심지어 두 개의 믹스와 두 개의 특정 운이나 이유도없이 구분할 수 있습니다.

은 더 여기에서 "오른쪽"대답이 없다, 그러나 당신이에 결정을해야 할 때마다 고려해야 할 몇 가지가있다 :

  • internal 회원 암시 적 인터페이스를 구현할 수 없습니다, 및 명시 적 구현 항상 비공개입니다. 따라서 인터페이스 멤버가 클래스 인스턴스 (IDisposableDispose 메서드는 일반적인 것임)를 통해 액세스 할 수있게하려면 공개로 설정해야합니다.

  • 유형 표시가 변경 될 수 있습니다. internal 클래스에는 외부에서 사용할 수있게하려는 유용한 기능이 있다는 것을 결정할 수 있습니다. 하지만 그렇다면 모두 명의 공개 회원이 모두에 액세스 할 수있게됩니다. 이것이 당신이 원하는 것이라면 미리 결정해야합니다.

  • internal 클래스를 public으로 만들 수있는 또 다른 이유는 서브 클래 싱해야한다고 결정하고 파생 클래스가 다른 어셈블리에 있어야한다는 것입니다. 이 경우 귀하의 internal 회원 중 일부는 protected internal이어야하며, 그렇지 않은 경우 파생 된 클래스는 필요한 회원에게 액세스 할 수 없습니다. 결국

는 무엇 모두 귀착 다른 사람 읽을 및 유지 관리 할 코드를 작성하는 것입니다. 그것은 외부 세계에 유용한 보이지 않는

  1. , 실제로 하나 유해되지 않을 것 : 수정 자 internal는 유지 보수 프로그래머에게 매우 다른 두 가지를 의미 할 수있다. 전형적인 예는 5 분 안에 채워지고 많은 검증이나 오류 검사를하지 않는 유틸리티 클래스입니다. 이 경우 코드를 조금 조여주고 제대로 사용하는 방법을 문서화하는 한 누군가가 코드를 만들 수 있습니다 (public). 구성원을 만들어서이 가정을 명백히하십시오. public.

  2. 실제적으로 은 안전하지 않음 외부 사용; 이 경우, 실제로는 개별 메소드 internal을 작성하여 등이 클래스를 사용하지 않아야 함을 절대적으로 확실하게하고 싶을 수 있습니다.

시나리오에 맞는 것을 선택하십시오.

관련 문제