This article has been localized into Portuguese by the community.
Membros estáticos
Como vimos em um capítulo anterior, a maneira usual de se comunicar com uma classe é criar uma nova instância da classe e depois trabalhar no objeto resultante. Na maioria dos casos, é sobre isso que as classes são abordadas; a capacidade de instanciar várias cópias da mesma classe e usá-las de maneira diferente de alguma forma. No entanto, em alguns casos, você pode querer ter uma classe que possa ser usada sem instanciá-la, ou pelo menos uma classe em que possa usar membros dela sem criar um objeto para ela. Por exemplo, você pode ter uma classe com uma variável que permanece sempre a mesma, não importa onde e como ela é usada. Isso é chamado de membro estático, porque permanece o mesmo.
Uma classe pode ser estática e pode ter membros estáticos, funções e campos. Uma classe estática não pode ser instanciada, portanto, em outras palavras, ela funcionará mais como um agrupamento de membros relacionados do que uma classe real. Você pode optar por criar uma classe não estática, mas deixá-la com certos membros estáticos. Uma classe não estática ainda pode ser instanciada e usada como uma classe regular, mas você não pode usar um membro estático em um objeto da classe. Uma classe estática pode conter apenas membros estáticos.
Primeiro, aqui está um exemplo de uma classe estática:
public static class Rectangle
{
public static int CalculateArea(int width, int height)
{
return width * height;
}
}
Como você pode ver, usamos a palavra-chave estática para marcar a classe como estática e a usamos novamente para marcar o método CalculateArea como estático também. Se não fizéssemos isso, o compilador iria reclamar, já que não podemos ter um membro não estático de uma classe estática.
Para usar esse método, nós o chamamos diretamente na classe, assim:
Console.WriteLine("The area is: " + Rectangle.CalculateArea(5, 4));
Poderíamos adicionar outros métodos úteis à classe Rectangle, mas talvez você esteja se perguntando por que estamos passando largura e altura para o método real, em vez de armazená-lo dentro da classe e, em seguida, puxá-lo de lá quando necessário? Porque é estático! Poderíamos armazená-los, mas apenas um conjunto de dimensões, porque há apenas uma versão de uma classe estática. Isso é muito importante para entender.
Em vez disso, podemos tornar a classe não estática e, em seguida, ter o CalculateArea como uma função de utilitário nesta classe:
public class Rectangle
{
private int width, height;
public Rectangle(int width, int height)
{
this.width = width;
this.height = height;
}
public void OutputArea()
{
Console.WriteLine("Area output: " + Rectangle.CalculateArea(this.width, this.height));
}
public static int CalculateArea(int width, int height)
{
return width * height;
}
}
Como você pode ver, tornamos a classe não estática. Nós também adicionamos um construtor, que toma uma largura e uma altura e o atribui à instância. Em seguida, adicionamos um método OutputArea, que usa o método estático para calcular a área. Este é um bom exemplo de misturar membros estáticos com membros não estáticos, em uma classe não estática.
Um uso comum de classes estáticas, apesar de desaprovado por algumas pessoas, são classes utilitárias/auxiliares, nas quais você coleta vários métodos úteis, que podem não pertencer, mas também não parecem se encaixar em outro lugar.