Os modificadores de acesso restringem apenas o código fora da classe; não há isolamento de acesso dentro da classe.
Conforme aprendemos anteriormente, todos os membros podem ser acessados livremente dentro de uma classe.
Em seguida, aprenderemos como acessar membros fora da classe.
Para acessar os membros de instância públicos de fora da classe, é obrigatório usar a sintaxe com ponto nomeVariavelObjeto.nomeMembro.
class Program
{
static void Main(string[] args)
{
Worker worker = new Worker(); // Criar objeto
int hours = worker.GetHours(); // Acessar função pública através do objeto
worker.hours = 12; // Atribuir valor à variável pública pelo objeto
Console.WriteLine(worker.hours); // Ler diretamente como uma variável comum
}
}
class Worker
{
int age;
private double savings;
public int hours;
void ReadSavings()
{
Console.WriteLine(savings);
}
public int GetHours()
{
return hours;
}
}Code language: C# (cs)
O método GetHours da classe Worker está marcado como public, então pode ser lido e alterado externamente.
O método Main da classe Program cria um objeto Worker chamado worker.
Você acessa os membros públicos usando o nome do objeto worker. O nome do objeto funciona semelhante a um ponteiro, guardando uma referência (endereço de memória). Com esse nome seguido de um ponto . conseguimos acessar os membros públicos.

Formato para acessar membros de instância externamente: variavelObjeto.campoPublico / metodoPublico().
Membros declarados como private não podem ser acessados com sintaxe de ponto fora da classe.

Se tentar acessar membros privados (campos, funções) fora da classe, ocorrerá um erro imediatamente.
Exemplo com erro
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;
}
}Code language: C# (cs)
Veja mais um exemplo
class Rectangle
{
// Campos de instância públicos: comprimento Length, largura Width
public int Length, Width;
// Método de instância: calcula e retorna a área do retângulo
public int GetArea()
{
return Length * Width;
}
}
class Program
{
static void Main()
{
// Criar duas instâncias independentes de retângulo
Rectangle rect1 = new Rectangle();
Rectangle rect2 = new Rectangle();
// Atribuir comprimento e largura separadamente; os dados são isolados entre si
rect1.Length = 10; rect1.Width = 5;
rect2.Length = 8; rect2.Width = 7;
// Ler as dimensões e chamar o método para exibir a área
Console.WriteLine("Retângulo 1: Comprimento {0}, Largura {1}, Área {2}", rect1.Length, rect1.Width, rect1.GetArea());
Console.WriteLine("Retângulo 2: Comprimento {0}, Largura {1}, Área {2}", rect2.Length, rect2.Width, rect2.GetArea());
}
}Code language: C# (cs)
Esta é uma classe de retângulo. Ela contém dois campos públicos, Length e Width, que armazenam o comprimento e a largura do retângulo. Também possui a função GetArea que retorna a área do retângulo.
Todos esses membros são públicos.
Resultado da execução
Retângulo 1: Comprimento 10, Largura 5, Área 50
Retângulo 2: Comprimento 8, Largura 7, Área 56
É assim que são armazenados na memória

Os dois objetos são armazenados separadamente. Cada um tem seu próprio Length e Width e não interferem um no outro.
Acesso aos membros fora da classe