次の方法で共有


protected (C# リファレンス)

protected キーワードはメンバー アクセス修飾子です。

このページでは、 protected アクセスについて説明します。 protected キーワードは、protected internalおよびprivate protectedアクセス修飾子の一部でもあります。

保護されたメンバーは、そのクラス内および派生クラス インスタンスからアクセスできます。

protectedと他のアクセス修飾子の比較については、「アクセシビリティ レベル」を参照してください。

例 1

基底クラスの保護されたメンバーは、派生クラス型を介してアクセスが行われる場合にのみ、派生クラスでアクセスできます。 たとえば、次のコード セグメントを考えてみます。

namespace Example1
{
    class BaseClass
    {
        protected int myValue = 123;
    }

    class DerivedClass : BaseClass
    {
        static void Main()
        {
            var baseObject = new BaseClass();
            var derivedObject = new DerivedClass();

            // Error CS1540, because myValue can only be accessed through
            // the derived class type, not through the base class type.
            // baseObject.myValue = 10;

            // OK, because this class derives from BaseClass.
            derivedObject.myValue = 10;
        }
    }
}

このステートメント baseObject.myValue = 10 、基底クラス参照を介して保護されたメンバーにアクセスするため、エラーが生成されます (baseObjectBaseClass型です)。 保護されたメンバーには、派生クラス型または派生した型を介してのみアクセスできます。

private protectedとは異なり、protected アクセス修飾子を使用すると、任意のアセンブリ内の派生クラスからアクセスできます。 protected internalとは異なり、同じアセンブリ内の非派生クラスからのアクセスは許可されません

構造体を継承できないため、構造体メンバーを保護できません。

例 2

この例では、 DerivedPoint クラスは Pointから派生しています。 したがって、基底クラスの保護されたメンバーには、派生クラスから直接アクセスできます。

namespace Example2
{
    class Point
    {
        protected int x;
        protected int y;
    }

    class DerivedPoint: Point
    {
        static void Main()
        {
            var dpoint = new DerivedPoint();

            // Direct access to protected members.
            dpoint.x = 10;
            dpoint.y = 15;
            Console.WriteLine($"x = {dpoint.x}, y = {dpoint.y}");
        }
    }
    // Output: x = 10, y = 15
}

xyのアクセス レベルをプライベートに変更すると、コンパイラによってエラー メッセージが発行されます。

'Point.y' is inaccessible due to its protection level.

'Point.x' is inaccessible due to its protection level.

アセンブリ間アクセス

次の例は、 protected メンバーが異なるアセンブリ内にある場合でも、派生クラスからアクセス可能であることを示しています。

// Assembly1.cs
// Compile with: /target:library
namespace Assembly1
{
    public class BaseClass
    {
        protected int myValue = 0;
    }
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
namespace Assembly2
{
    using Assembly1;
    
    class DerivedClass : BaseClass
    {
        void Access()
        {
            // OK, because protected members are accessible from
            // derived classes in any assembly
            myValue = 10;
        }
    }
}

このアセンブリ間のアクセシビリティは、 protectedprivate protected (同じアセンブリへのアクセスを制限する) と区別しますが、 protected internal に似ています (ただし、 protected internal では、派生していないクラスからの同じアセンブリ アクセスも許可されます)。

C# 言語仕様

詳細については、「C# 言語仕様宣言されたアクセシビリティ」を参照してください。 言語仕様は、C# の構文と使用法の決定的なソースです。

こちらも参照ください