Los modificadores de acceso solo limitan el código situado fuera de la clase; no existe aislamiento de acceso dentro de la clase.
Como hemos aprendido antes, dentro de una clase se puede acceder libremente a todos sus miembros.
A continuación, aprenderemos a acceder a los miembros desde fuera de la clase.
Para acceder a los miembros de instancia públicos desde el exterior de la clase, debes usar la sintaxis de punto nombreVariableObjeto.nombreMiembro.
class Program
{
static void Main(string[] args)
{
Worker worker = new Worker(); // Crear objeto
int hours = worker.GetHours(); // Acceder a método público mediante el objeto
worker.hours = 12; // Asignar valor a variable pública usando el objeto
Console.WriteLine(worker.hours); // Leer directamente como una variable normal
}
}
class Worker
{
int age;
private double savings;
public int hours;
void ReadSavings()
{
Console.WriteLine(savings);
}
public int GetHours()
{
return hours;
}
}Lenguaje del código: C# (cs)
El método GetHours de Worker está marcado como public, por lo tanto se puede leer y modificar desde fuera.
El método Main de la clase Program crea el objeto Worker llamado worker.
Se puede acceder mediante el nombre del objeto worker. El nombre del objeto funciona parecido a un puntero, almacena una referencia (dirección de memoria), y usando ese nombre junto con el punto . se puede acceder a los miembros públicos.

Formato para acceder a miembros de instancia desde fuera: variableObjeto.campoPublico / metodoPublico().
Los miembros private no se pueden acceder con sintaxis de punto desde fuera de la clase.

Si intentas acceder a miembros privados (campos, funciones) fuera de la clase, se producirá un error directamente.
Ejemplo con error
class Program
{
static void Main(string[] args)
{
Worker worker = new Worker();
int hours = worker.GetHours();
worker.hours = 12;
Console.WriteLine(worker.hours);
worker.ReadSavings();
worker.age = 20;
worker.savings = 1000000000.0;
}
}
class Worker
{
int age;
private double savings;
public int hours;
void ReadSavings()
{
Console.WriteLine(savings);
}
public int GetHours()
{
return hours;
}
}Lenguaje del código: C# (cs)
Veamos otro ejemplo
class Rectangle
{
// Campos de instancia públicos: longitud Length, ancho Width
public int Length, Width;
// Método de instancia: calcula y devuelve el área del rectángulo
public int GetArea()
{
return Length * Width;
}
}
class Program
{
static void Main()
{
// Crear dos instancias independientes de rectángulo
Rectangle rect1 = new Rectangle();
Rectangle rect2 = new Rectangle();
// Asignar valores de longitud y ancho a cada rectángulo; los datos están aislados entre sí
rect1.Length = 10; rect1.Width = 5;
rect2.Length = 8; rect2.Width = 7;
// Leer longitud y ancho, llamar al método para imprimir el área
Console.WriteLine("Rectángulo 1: Longitud {0}, Ancho {1}, Área {2}", rect1.Length, rect1.Width, rect1.GetArea());
Console.WriteLine("Rectángulo 2: Longitud {0}, Ancho {1}, Área {2}", rect2.Length, rect2.Width, rect2.GetArea());
}
}Lenguaje del código: C# (cs)
Esta es una clase rectángulo. Cuenta con dos campos públicos, Length y Width, que almacenan respectivamente la longitud y el ancho del rectángulo. También tiene la función GetArea para devolver el área del rectángulo.
Todos ellos son públicos.
Resultado de ejecución
Rectángulo 1: Longitud 10, Ancho 5, Área 50
Rectángulo 2: Longitud 8, Ancho 7, Área 56
Así se almacenan en memoria

Los dos objetos se almacenan de forma independiente, cada uno tiene sus propios Length y Width sin afectarse mutuamente.
Acceso a miembros desde fuera de la clase