다음을 통해 공유


private protected (C# 참조)

private protected 키워드 조합은 멤버 액세스 한정자입니다. 프라이빗 보호된 멤버는 포함하는 클래스에서 파생된 형식으로 액세스할 수 있지만 포함하는 어셈블리 내에서만 액세스할 수 있습니다. 다른 액세스 한정자와 비교 private protected 하려면 접근성 수준을 참조하세요.

비고

private protected 액세스 한정자는 C# 버전 7.2 이상에서 유효합니다.

예시

기본 클래스의 프라이빗 보호된 멤버는 변수의 정적 형식이 파생 클래스 형식인 경우에만 포함하는 어셈블리의 파생 형식에서 액세스할 수 있습니다. 예를 들어 다음 코드 세그먼트를 고려합니다.

// Assembly1.cs
// Compile with: /target:library
public class BaseClass
{
    private protected int myValue = 0;
}

public class DerivedClass1 : BaseClass
{
    void Access()
    {
        var baseObject = new BaseClass();

        // Error CS1540, because myValue can only be accessed by
        // classes derived from BaseClass.
        // baseObject.myValue = 5;

        // OK, accessed through the current derived class instance
        myValue = 5;
    }
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
class DerivedClass2 : BaseClass
{
    void Access()
    {
        // Error CS0122, because myValue can only be
        // accessed by types in Assembly1
        // myValue = 10;
    }
}

이 예제에는 두 개의 파일 Assembly1.csAssembly2.cs. 첫 번째 파일에는 공용 기본 클래스 BaseClass와 해당 파일에서 DerivedClass1파생된 형식이 포함됩니다. BaseClass는 동일한 어셈블리 내에서 상속된 멤버로 DerivedClass1가 액세스할 수 있는 프라이빗 보호 멤버인 myValue를 소유합니다.

두 번째 파일에서 myValue을(를) DerivedClass2의 상속된 멤버로 액세스 하려고 하면, private protected 오류가 발생합니다. 이는 멤버가 동일한 어셈블리 내의 파생 형식에서만 접근 가능하기 때문입니다. 이는 protected (모든 어셈블리의 파생 클래스에서 액세스를 허용함)과 protected internal (동일한 어셈블리 내의 모든 클래스 또는 모든 어셈블리의 파생 클래스에서 액세스를 허용함)과의 주요 차이점입니다.

Assembly1.csAssembly2이라는 이름을 가진 InternalsVisibleToAttribute가 포함된 경우, 파생 클래스 DerivedClass2BaseClass에 선언된 private protected 멤버에 액세스할 수 있습니다. InternalsVisibleToprivate protected 멤버를 다른 어셈블리의 파생 클래스에 표시합니다.

다른 보호된 액세스 한정자와 비교

다음 표에는 보호된 세 가지 액세스 한정자 간의 주요 차이점이 요약되어 있습니다.

액세스 한정자 동일한 어셈블리, 파생 클래스 동일한 어셈블리, 파생되지 않은 클래스 다른 어셈블리, 파생 클래스
protected ✔️ ✔️
protected internal ✔️ ✔️ ✔️
private protected ✔️
  • 어셈블리의 파생 클래스가 멤버에 액세스하도록 하려는 경우에 사용합니다 protected .
  • 가장 관대한 액세스(어디서나 동일한 어셈블리 또는 파생 클래스의 모든 클래스)를 원하는 경우에 사용합니다 protected internal .
  • 가장 제한적인 보호된 액세스(동일한 어셈블리의 파생 클래스만)를 원하는 경우에 사용합니다 private protected .

구조체 멤버는 private protected가 될 수 없습니다. 구조체는 상속될 수 없기 때문입니다.

C# 언어 사양

자세한 내용은 C# 언어 사양을 참조하세요. 언어 사양은 C# 구문 및 사용의 최종 소스입니다.

참고하십시오