[C#] 내부 클래스에서 공개 메소드를 사용하는 이유는 무엇입니까?

프로젝트 중 하나에 다음과 같은 코드가 많이 있습니다.

internal static class Extensions
{
    public static string AddFoo(this string s)
    {
        if (s == null)
        {
            return "Foo";
        }

        return $({s}Foo);
    }
}

“나중에 유형을 공개하는 것이 더 쉬운 것”이외의 다른 명백한 이유가 있습니까?

나는 그것이 매우 이상한 가장자리 케이스 (Silverlight에서의 반사)에서만 중요하거나 전혀 그렇지 않다고 생각합니다.



답변

업데이트 :이 질문은 2014 년 9 월 내 블로그의 주제였습니다 . 좋은 질문 감사합니다!

컴파일러 팀 자체 내에서도이 질문에 대해 상당한 논쟁이 있습니다.

우선, 규칙을 이해하는 것이 현명합니다. 클래스 또는 구조체의 공용 멤버 는 포함 형식에 액세스 할 수있는 모든 항목에 액세스 할 수있는 멤버입니다 . 따라서 내부 클래스의 공개 멤버는 사실상 내부입니다.

이제 내부 클래스가 주어지면 어셈블리에서 액세스하려는 멤버를 공개 또는 내부로 표시해야합니까?

내 의견은 : 그런 회원들을 공개로 표시하십시오.

“public”을 사용하여 “이 멤버는 구현 세부 정보가 아닙니다”를 의미합니다. 보호 된 멤버는 구현 세부 사항입니다. 파생 된 클래스 작업을 수행하는 데 필요한 내용이 있습니다. 내부 멤버는 구현 세부 사항입니다. 이 어셈블리 내부의 다른 무언가가 올바르게 작동하려면 멤버가 필요합니다. 공용 구성원은 “이 구성원은이 개체에서 제공하는 주요 문서화 된 기능을 나타냅니다.”라고 말합니다.

기본적으로 내 태도는 :이 내부 수업을 공개 수업으로 만들기로 결정했다고 가정 해 봅시다. 이를 위해 클래스의 접근성이라는 것을 정확히 변경하고 싶습니다 . 내부 클래스를 공개 클래스로 바꾸는 것이 내부 멤버도 공개 멤버로 바꿔야 한다는 것을 의미하는 경우 해당 멤버는 클래스 의 공개 영역 의 일부였으며 처음에는 공개되어야했습니다.

다른 사람들은 동의하지 않습니다. 멤버 선언을 한눈에보고 내부 코드에서만 호출되는지 여부를 즉시 알고 싶다는 조건이 있습니다.

불행히도, 그것이 항상 잘 작동하는 것은 아닙니다. 예를 들어, 내부 인터페이스를 구현하는 내부 클래스는 클래스의 공용 영역의 일부 이므로 구현 멤버를 public으로 표시해야합니다 .


답변

클래스가 internal인 경우 메서드를 표시하는지 internal또는에 표시하는지 여부는 접근성 관점에서 중요하지 않습니다 public. 그러나 클래스가 있었다면 사용할 유형을 사용하는 것이 여전히 좋습니다 public.

일부는이에서 전환을 용이하게했다있는 반면 internalpublic. 또한 방법 설명의 일부로 사용됩니다. Internal메소드는 일반적으로 자유로운 액세스에 대해 안전하지 않은 public것으로 간주되는 반면, 메소드는 (대부분) 무료 게임으로 간주됩니다.

사용하여 internal또는 public당신은에서와 public클래스, 당신은 당신이 또한 클래스를 만들기 위해 필요한 작업 완화하면서 액세스의 스타일이 예상되는 어떤 통신 할 수 있도록 public미래를.


답변

나는 종종 내부 클래스 대신 내부 클래스에서 내 메소드를 표시합니다 .a) 실제로 중요하지 않습니다 .b) 내부에서 메소드가 의도적으로 내부임을 나타냅니다. 따라서 내부 메서드가있는 경우 내부 메서드를 공개로 변경하기 전에 내부 이유를 이해해야하지만 내부 클래스에서 공개 메서드를 처리하는 경우 왜 그 이유에 대해 생각해야합니다. 클래스는 각 메소드가 내부적 인 이유와 반대로 내부입니다.


답변

“나중에 유형을 공개하는 것이 더 쉬운가요?” 그렇습니다.

범위 지정 규칙은 방법은 전용으로 볼 수 있다는 것을 의미 internal정말 방법이 표시됩니다 여부를 중요하지 않습니다 – 그래서 publicinternal.

명심해야 할 한 가지 가능성은 클래스 공개되었고 나중에 변경되었으며 internal개발자가 모든 메소드 액세스 가능성 수정자를 변경하지 않았다는 것입니다.


답변

경우에 따라 내부 유형에 공용 인터페이스가 구현되어 해당 인터페이스에 정의 된 모든 메소드를 여전히 공용으로 선언해야 할 수도 있습니다.


답변

똑같습니다. 공용 메서드는 내부 클래스 내부에 있기 때문에 실제로 내부로 표시되지만 클래스를 공개로 표시하려면 코드를 더 적게 변경해야합니다.


답변

internal멤버는 동일한 어셈블리 내에서만 액세스 할 수 있습니다. 해당 어셈블리의 다른 클래스는 액세스 할 수있는 internal public멤버 만 접근 a를 할 수 없을 것 private또는 protected회원 internal여부.