Comparteix via


protected (Referencia de C#)

La protected palabra clave es un modificador de acceso para miembros.

Nota:

En este artículo se describe el protected acceso. La palabra clave protected también forma parte de los modificadores de acceso protected internal y private protected.

Puede acceder a un miembro protegido dentro de su clase y por instancias de clase derivadas.

Para obtener una comparación de protected con los otros modificadores de acceso, vea Niveles de accesibilidad.

La documentación de referencia del lenguaje C# cubre la versión más reciente publicada del lenguaje C#. También contiene documentación inicial sobre las características de las versiones preliminares públicas de la próxima versión del lenguaje.

La documentación identifica cualquier característica introducida por primera vez en las últimas tres versiones del idioma o en las versiones preliminares públicas actuales.

Sugerencia

Para buscar cuándo se introdujo por primera vez una característica en C#, consulte el artículo sobre el historial de versiones del lenguaje C#.

Puede acceder a un miembro protegido de una clase base en una clase derivada solo si el acceso se produce a través del tipo de clase derivada. Por ejemplo, considere el siguiente segmento de código:

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;
        }
    }
}

La instrucción baseObject.myValue = 10 genera un error porque accede al miembro protegido a través de una referencia de clase base (baseObject es de tipo BaseClass). Solo puede acceder a los miembros protegidos a través del tipo de clase o los tipos derivados de él.

A diferencia de private protected, el modificador de acceso protected permite el acceso desde clases derivadas en cualquier ensamblado. A diferencia protected internalde , no permite el acceso desde clases no derivadas dentro del mismo ensamblado.

No se pueden declarar miembros struct como protegidos porque las estructuras no se pueden heredar.

En este ejemplo, la clase DerivedPoint se deriva de Point. Por lo tanto, puede acceder a los miembros protegidos de la clase base directamente desde la clase derivada.

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
}

Si cambia los niveles de acceso de x y y a privado, el compilador devuelve los mensajes de error:

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

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

En el ejemplo siguiente se muestra que los miembros protected son accesibles desde clases derivadas aun cuando están en ensamblados diferentes.

// 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;
        }
    }
}

Esta accesibilidad entre ensamblados protected es lo que distingue de private protected (lo que restringe el acceso al mismo ensamblado), pero es similar a protected internal (aunque protected internal también permite el acceso al mismo ensamblado desde clases no derivadas).

Especificación del lenguaje C#

Para obtener más información, vea Accesibilidad declarada en la especificación del lenguaje C#. La especificación del lenguaje es el origen definitivo de la sintaxis y el uso de C#.

Consulte también