A declaração de classe equivale a um modelo ou planta. Você pode criar quantas instâncias de classe quiser a partir dela.
Membros de instância: Cada instância de uma classe é um objeto independente com seu próprio conjunto de dados, sem interferir em outras instâncias do mesmo tipo. Esses são chamados membros de instância porque estão ligados aos objetos instanciados da classe.
Membros estáticos: O tipo padrão são os membros de instância. Também é possível declarar membros estáticos, que pertencem à própria classe, e não às instâncias. Esse assunto será abordado nas próximas aulas.
Veja um exemplo para compreender melhor
class Program
{
static void Main(string[] args)
{
Factory factoryFox = new Factory();
Robot robot1 = new Robot();
Robot robot2 = new Robot();
Robot robot3 = new Robot();
}
}
class Factory
{
}
class Robot
{
public string name;
public void SayHello()
{
Console.WriteLine($"Hello everyone my name is {name},I come from Foxdevelop.com");
}
}Code language: C# (cs)
Neste exemplo temos duas classes: Factory e Robot. A classe Robot possui um método e um campo chamado name. A classe Factory não tem esse campo name.
A função principal cria uma instância de Factory e três instâncias de Robot.
Vamos analisar como os dados são organizados na memória.

Os três robôs robot1, robot2 e robot3 têm cada um o seu próprio valor de name, armazenados em endereços diferentes e não interferem uns com os outros. Alterar o robot1 não afetará o robot2.
static void Main(string[] args)
{
Factory factoryFox = new Factory();
Robot robot1 = new Robot();
Robot robot2 = new Robot();
Robot robot3 = new Robot();
robot1.name = "Tom"; //Cada name é independente, sem interferência mútua
robot2.name = "Jack";
robot3.name = "Smith";
}Code language: C# (cs)
Apenas uma cópia dos membros de função
Como vimos com o campo name, cada instância mantém um valor independente. Modificar o valor de uma instância não altera os valores das outras. Além dos campos, as classes também contêm membros de função.
Cada função dentro da classe existe apenas uma vez e é compartilhada por todas as instâncias?
O corpo do código da função (método): existe apenas uma vez globalmente e é compartilhado por todas as instâncias
Após a compilação, as instruções de máquina dos métodos ficam armazenadas na Tabela de Métodos (Method Table), pertencente ao próprio tipo. Todas as instâncias dessa classe no heap compartilham esse código; não há uma cópia separada da função para cada objeto.
Tomemos como exemplo o método SayHello dentro da classe Robot
class Robot
{
public string name;
public void SayHello()
{
Console.WriteLine($"Hello everyone my name is {name},I come from Foxdevelop.com");
}
}Code language: C# (cs)
A memória possui outras áreas além do heap e da pilha. Os métodos são guardados na Method Table.
As funções da classe são mantidas na tabela de métodos. Ao chamar uma função, o sistema executa o código correspondente dessa tabela, portanto ela é compartilhada.
static void Main(string[] args)
{
Factory factoryFox = new Factory();
Robot robot1 = new Robot();
Robot robot2 = new Robot();
Robot robot3 = new Robot();
robot1.name = "Tom";
robot2.name = "Jack";
robot3.name = "Smith";
robot1.SayHello();
robot2.SayHello();
robot3.SayHello();
}Code language: C# (cs)
No código acima, as três chamadas ao SayHello executam a mesma função. Contudo, variáveis locais dentro do método são independentes, e o acesso aos campos varia conforme a instância que fez a chamada.
public void SayHello()
{
Console.WriteLine($"Hello everyone my name is {name},I come from Foxdevelop.com");
}Code language: C# (cs)
Quando robot1 invoca SayHello, name recebe Tom; quando robot2 invoca, name recebe Jack e assim por diante.
Membros de instância