C #의 기본 액세스 수정자는 무엇입니까?


답변:


485

C #의 모든 것에 대한 기본 액세스는 "해당 멤버에 대해 선언 할 수있는 가장 제한된 액세스" 입니다.

예를 들어 :

namespace MyCompany
{
    class Outer
    {
        void Foo() {}
        class Inner {}
    }
}

에 해당

namespace MyCompany
{
    internal class Outer
    {
        private void Foo() {}
        private class Inner {}
    }
}

이에 대한 한 가지 예외는 속성 자체의 선언 된 접근성보다 속성의 일부 (일반적으로 세터)를 더 제한하는 것입니다.

public string Name
{
    get { ... }
    private set { ... } // This isn't the default, have to do it explicitly
}

이것이 C # 3.0 사양이 말한 것입니다 (섹션 3.5.1).

멤버 선언이 발생하는 컨텍스트에 따라 특정 유형의 선언 된 액세스 가능성 만 허용됩니다. 또한 멤버 선언에 액세스 수정자가 포함되지 않은 경우 선언이 발생하는 컨텍스트에 따라 선언 된 기본 액세스 가능성이 결정됩니다.

  • 네임 스페이스에는 암시 적으로 공개적으로 선언 된 액세스 가능성이 있습니다. 네임 스페이스 선언에는 액세스 수정자가 허용되지 않습니다.
  • 컴파일 단위 또는 네임 스페이스로 선언 된 형식은 공개 또는 내부 선언 된 접근성을 가질 수 있으며 기본적으로 내부 선언 된 접근성을 가질 수 있습니다.
  • 반원은 5 가지 종류의 선언 된 접근성을 가질 수 있으며 기본적으로 비공개로 선언 된 접근성을 가질 수 있습니다. 클래스의 멤버로 선언 된 형식은 5 가지 종류의 선언 된 액세스 가능성을 가질 수 있지만 네임 스페이스의 멤버로 선언 된 형식은 공용 또는 내부적으로 선언 된 액세스 가능성 만 가질 수 있습니다.
  • 구조체는 암시 적으로 봉인되어 있으므로 구조 구성원은 공개, 내부 또는 개인 선언 된 접근성을 가질 수 있으며 기본적으로 비공개 선언 된 접근성을 가질 수 있습니다. 구조체에 도입 된 (즉 구조체에 상속되지 않은) 구조체 멤버는 내부적으로 선언 된 액세스 가능성을 보호하거나 보호 할 수 없습니다. (구조체의 멤버로 선언 된 형식은 public, internal 또는 private으로 선언 된 접근성을 가질 수 있지만, 네임 스페이스의 멤버로 선언 된 형식은 public 또는 내부적으로 선언 된 접근성을 가질 수 있습니다.)
  • 인터페이스 멤버는 암시 적으로 공개적으로 선언 된 액세스 가능성을 갖습니다. 인터페이스 멤버 선언에는 액세스 수정자가 허용되지 않습니다.
  • 열거 형 멤버는 암시 적으로 공개적으로 선언 된 액세스 가능성을 갖습니다. 열거 멤버 선언에는 액세스 수정자가 허용되지 않습니다.

중첩 유형은 "클래스 멤버"또는 "구조 멤버"파트 아래에 있으므로 기본적으로 개인용 가시성으로 설정됩니다.


154
top level class: internal
method: private
members (unless an interface or enum): private (including nested classes)
members (of interface or enum): public
constructor: private (note that if no constructor is explicitly defined, a public default constructor will be automatically defined)
delegate: internal
interface: internal
explicitly implemented interface member: public!

13
클래스가 중첩 유형이기 때문에 멤버이기도 한 경우 기본적으로 private로 설정되어 있음을 명확하게 알 수 없습니다. 또한 인터페이스 및 열거 형 멤버는 항상 공개입니다.
Jon Skeet

1
@niry 아니요, 비공개가 아닙니다. 공개입니다. 그냥 그렇다면, 구현하는 형태의 슬롯을하지 않는 class Foo : IFoo { IFoo.M() {} } ... Foo a = new Foo();액세스 할 수없는, M가진 a.M()그러나 당신이 그것을 액세스 할 수 있습니다 (a as IFoo).M(). (사양에 대한 자세한 내용은 사양을 확인하십시오)
M.Stramm

130

짧은 답변 : 가능한 최소 액세스 (참조 : Jon Skeet의 답변).

긴 대답 :

중첩되지 않은 유형, 열거 및 대리자 접근성 ( 내부 또는 공용 접근성 만 가질 수 있음 )

                     | Default   | Permitted declared accessibilities
------------------------------------------------------------------
namespace            | public    | none (always implicitly public)

enum                 | public    | none (always implicitly public)

interface            | internal  | public, internal

class                | internal  | public, internal

struct               | internal  | public, internal

delegate             | internal  | public, internal

중첩 유형 및 멤버 접근성

                     | Default   | Permitted declared accessibilities
------------------------------------------------------------------
namespace            | public    | none (always implicitly public)

enum                 | public    | none (always implicitly public)

interface            | public    | none

class                | private   | All¹

struct               | private   | public, internal, private²

delegate             | private   | All¹

constructor          | private   | All¹

interface member     | public    | none (always implicitly public)

method               | private   | All¹

field                | private   | All¹

user-defined operator| none      | public (must be declared public)

¹ 모두 === 공개, 보호, 내부, 개인, 보호 내부

² 구조체는 구조체 나 클래스에서 상속 할 수 없으며 (그렇지만 인터페이스는 가능하지만) protected는 유효한 수정자가 아닙니다.

중첩 형식의 액세스 가능성은 멤버의 선언 된 액세스 가능성과 즉시 포함 형식의 액세스 가능성 도메인에 의해 결정되는 해당 액세스 가능성 도메인에 따라 다릅니다. 그러나 중첩 유형의 접근성 도메인은 포함 유형의 접근성 도메인을 초과 할 수 없습니다.

참고 : CIL에는 또한 보호 및 내부 (기존 보호 "또는"내부와 반대) 조항 이 있지만 C #에서는 현재 사용할 수 없습니다.


보다:

http://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
http://msdn.microsoft.com/en-us/library/ms173121.aspx
http://msdn.microsoft.com/en- us / library / cx03xt0t.aspx
(Microsoft URI를 좋아하는 사람 ...)


12

액세스 수정 자 살펴보기 (C # 프로그래밍 안내서)

수업 및 구조 접근성

네임 스페이스 내에서 직접 선언 된 클래스와 구조체 (즉, 다른 클래스 나 구조체 내에 중첩되지 않은 클래스)는 공개 또는 내부 일 수 있습니다. 액세스 수정자가 지정되지 않은 경우 내부가 기본값입니다.

중첩 클래스 및 구조체를 포함한 구조체 멤버는 공용, 내부 또는 개인으로 선언 될 수 있습니다. 중첩 클래스 및 구조체를 포함한 클래스 멤버는 공개, 보호 내부, 보호, 내부, 개인 보호 또는 개인이 될 수 있습니다. 중첩 클래스 및 구조체를 포함한 클래스 멤버 및 구조체 멤버의 액세스 수준은 기본적으로 비공개입니다. 포함 형식 외부에서는 개인 중첩 형식에 액세스 할 수 없습니다.

파생 클래스는 기본 유형보다 더 큰 접근성을 가질 수 없습니다. 다시 말해, 내부 클래스 A에서 파생 된 공용 클래스 B를 가질 수 없습니다. 이것이 허용되면 A의 보호 또는 내부 구성원 모두가 파생 클래스에서 액세스 할 수 있기 때문에 A를 공용으로 만드는 효과가 있습니다.

다음을 사용하여 특정 다른 어셈블리가 내부 유형에 액세스 할 수있게합니다. InternalsVisibleToAttribute . 자세한 내용은 친구 어셈블리를 참조하십시오.

수업 및 구조 회원 접근성

클래스 멤버 (중첩 클래스 및 구조체 포함)는 6 가지 유형의 액세스 중 하나로 선언 할 수 있습니다. 구조체가 상속을 지원하지 않기 때문에 구조체 멤버를 보호 된 것으로 선언 할 수 없습니다.

일반적으로 멤버의 액세스 가능성은 멤버를 포함하는 유형의 액세스 가능성보다 크지 않습니다. 그러나 멤버가 인터페이스 메서드를 구현하거나 퍼블릭 기본 클래스에 정의 된 가상 메서드를 재정의하는 경우 어셈블리 외부에서 내부 클래스의 퍼블릭 멤버에 액세스 할 수 있습니다.

필드, 속성 또는 이벤트 인 멤버의 유형은 최소한 멤버 자체만큼 액세스 가능해야합니다. 마찬가지로 메서드, 인덱서 또는 대리자 인 멤버의 반환 형식과 매개 변수 형식은 최소한 멤버 자체만큼 액세스 가능해야합니다. 예를 들어 C도 공용이 아닌 한 클래스 C를 반환하는 공용 메서드 M을 가질 수 없습니다. 마찬가지로 A가 개인으로 선언 된 경우 A 유형의 보호 된 속성을 가질 수 없습니다.

사용자 정의 연산자는 항상 public 및 static으로 선언해야합니다. 자세한 내용은 연산자 오버로드를 참조하십시오.

종료자는 내게 필요한 옵션 수정자를 가질 수 없습니다.

다른 유형

네임 스페이스 내에서 직접 선언 된 인터페이스는 공용 또는 내부로 선언 될 수 있으며 클래스 및 구조체와 마찬가지로 인터페이스는 내부 액세스로 기본 설정됩니다. 인터페이스의 목적은 다른 유형이 클래스 나 구조체에 액세스 할 수 있도록하는 것이므로 인터페이스 멤버는 항상 공개입니다. 인터페이스 멤버에는 액세스 수정자를 적용 할 수 없습니다.

열거 형 멤버는 항상 공개이며 액세스 수정자를 적용 할 수 없습니다.

대의원은 수업과 구조체처럼 행동합니다. 기본적으로 네임 스페이스 내에서 직접 선언 된 경우 내부 액세스 권한이 있고 중첩 된 경우 개인 액세스 권한이 있습니다.


8

수업은 내부 기본적으로 입니다.

  • 클래스 멤버는 비공개입니다 기본적으로 입니다.

인터페이스는 기본적으로 내부 입니다.

  • 인터페이스 멤버는 공개 기본적으로 입니다. (인터페이스를 사용하면 멤버에 대한 접근성을 지정할 수 없습니다.)

    참고 : 인터페이스 멤버에 액세스 지정자를 지정하려고하면 컴파일 오류가 표시됩니다.

구조체는 내부기본적으로 구조 입니다.

  • 기본적으로 구조 부재는 비공개 입니다.

5

설명서 링크를 추가하고 싶습니다. 자세한 내용은 여기를 확인 하십시오 .

여기에 이미지 설명을 입력하십시오


1
class는 기본적으로 내부 용이며 개인용이 아닙니다.
Baahubali

1
내가 수업을 쓴 곳은 비공개입니까?
Asif Mushtaq

이 테이블은 중첩 유형에만 유효합니다.
BlueSilver

클래스는 기본적으로 내부이며 네임 스페이스 내부의 클래스는 개인용이 될 수 없습니다. 그러나 수업 (중첩 수업) 내부의 수업은 비공개
Arun

인터페이스의 액세스 수정자는 기본적으로 내부 입니다.
Kamala Hanchinal

4

가장 간단한 대답은 다음과 같습니다 .....

C #의 모든 멤버는 항상 기본적으로 가장 액세스 가능한 수정자를 사용합니다.

이것이 어셈블리의 모든 최상위 클래스가 기본적으로 "내부"인 이유입니다. 즉, 어셈블리에 공개되어 있지만 비공개이거나 외부 어셈블리에 대한 액세스에서 제외됩니다. 최상위 클래스의 유일한 다른 옵션은 더 접근하기 쉬운 public입니다. 중첩 형식의 경우 공용으로 만 사용할 수있는 열거 형 및 인터페이스의 구성원과 같은 몇 가지 드문 예외를 제외하고 모두 비공개입니다. 몇 가지 예. 최상위 클래스 및 인터페이스의 경우 기본값은 다음과 같습니다.

내부 클래스 동물 과 동일한 클래스 동물

공용 인터페이스 동물 과 동일한 인터페이스 동물

중첩 클래스 및 인터페이스 (내부 유형)의 경우 기본값은 다음과 같습니다.

개인 클래스 동물 과 같은 클래스 동물

개인 인터페이스 동물 과 동일한 인터페이스 동물

기본값이 항상 가장 개인 정보라고 가정하는 경우 기본값을 변경해야 할 때까지 접근자를 사용할 필요가 없습니다. 쉬운.



0

네임 스페이스 수준 : internal

타입 레벨 : private

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.