csharp-modificadores-acceso

Modificadores de acceso en C#

Los modificadores de acceso proporcionan control sobre la visibilidad y mutabilidad de los miembros de las clases y estructuras.

Los modificadores de acceso son la forma de implementar encapsulación en C#, uno de los pilares de la programación orientada a objetos

Si quieres aprender más sobre Encapsulación
consulta el Curso de Programación Orientada a Objetos leer más ⯈

Modificadores de acceso

Los miembros de la clase base pueden tener diferentes niveles de accesibilidad: public, protected, internal, protected internal y private. La accesibilidad de estos miembros determina cómo pueden ser utilizados por la clase derivada.

  • public: accesible desde cualquier lugar.
  • protected: accesible desde la clase base y las clases derivadas.
  • private: accesible solo dentro de la clase base.
  • internal: accesible dentro del mismo ensamblado.
  • protected internal: accesible desde el mismo ensamblado o desde clases derivadas.

Modificador public

El modificador public permite que los miembros sean accesibles desde cualquier lugar del código, sin restricciones. Es útil para definir la API pública de una clase, permitiendo que otros componentes interactúen con ella.

public class Vehiculo
{
    public string Marca { get; set; }
    public string Modelo { get; set; }

    public void Arrancar()
    {
        Console.WriteLine($"{Marca} {Modelo} ha arrancado.");
    }
}

Aquí, las propiedades Marca y Modelo, así como el método Arrancar, son públicos y pueden ser accedidos desde cualquier lugar donde se instancie un objeto Vehiculo.

Modificador private

El modificador private restringe el acceso a los miembros únicamente a la clase o estructura que los define. Esto significa que ningún otro código fuera de esta clase puede acceder a estos miembros, promoviendo el encapsulamiento y la protección de los datos internos.

public class CuentaBancaria
{
    private decimal saldo;

    public CuentaBancaria(decimal saldoInicial)
    {
        saldo = saldoInicial;
    }

    public void Depositar(decimal cantidad)
    {
        saldo += cantidad;
    }

    public decimal ObtenerSaldo()
    {
        return saldo;
    }
}

En este ejemplo, saldo está declarado como private, por lo que solo puede ser accedido y modificado mediante los métodos públicos Depositar y ObtenerSaldo.

Modificador internal

El modificador internal restringe el acceso a los miembros a cualquier código dentro del mismo ensamblado, es decir, el mismo proyecto o biblioteca. Esto es útil para componentes que deben ser accesibles en toda la aplicación, pero no expuestos públicamente a otros ensamblados.

internal class ServicioInterno
{
    internal void Ejecutar()
    {
        Console.WriteLine("Ejecutando servicio interno.");
    }
}

En este ejemplo, la clase ServicioInterno y su método Ejecutar solo son accesibles dentro del mismo ensamblado.

Modificador protected

El modificador protected permite que los miembros sean accesibles dentro de su clase y por cualquier clase derivada. Esto es útil para definir miembros que deben ser accesibles para la herencia pero no expuestos públicamente.

public class Animal
{
    protected void Comer()
    {
        Console.WriteLine("El animal está comiendo.");
    }
}

public class Perro : Animal
{
    public void Ladrar()
    {
        Comer(); // Acceso permitido a método protegido de la clase base
        Console.WriteLine("El perro está ladrando.");
    }
}

En este ejemplo, el método Comer es protected y puede ser llamado por la clase derivada Perro, pero no está disponible fuera de esta jerarquía de herencia.

Modificador protected internal

Se puede combinar internal y protected para permitir el acceso dentro del mismo ensamblado y en clases derivadas.

public class Base
{
    protected internal void Metodo()
    {
        Console.WriteLine("Método accesible desde el mismo ensamblado o clases derivadas.");
    }
}

public class Derivada : Base
{
    public void LlamarMetodo()
    {
        Metodo(); // Acceso permitido
    }
}

En este ejemplo, Metodo puede ser accedido tanto por clases derivadas como por cualquier clase en el mismo ensamblado.