Uma classe no C# pode ter N membros estáticos através da palavra chave static. Um membro estático deve ser invocado diretamente do nível da classe e não a partir de uma referencia de objeto, é bastante utilizado em classes que tem um nível de desacoplamento alto (envio de email, geração de hash, etc).

Para ilustrar melhor irei fazer alguns exemplos.

Atributos estáticos

Uma classe ou estrutura pode ter atributos estáticos, ao fazer isso você aloca apenas uma vez e compartilhar entre todos os objetos da mesma categoria de classe.  Exemplo

Definição da classe

public class Conta {
    public static double taxaSaque = 1.5;
    public double saldo = 100.00;

    public double sacar(double valor) {
       saldo -= valor + taxaSaque;

       return saldo;
     }
}

Defini uma classe chamada Conta, que tem um atributo estático chamado taxaSaque e outro atributo saldo(porem esse está no nível de instância, ou seja, a cada objeto desse tipo mantém uma copia independente do campo), e por ultimo defini um método chamado sacar, onde deve ser passado como parâmetro o valor a ser sacado(para fins didáticos não me preocupei com detalhes como deposito, limite da conta, etc) que subtrai o valor do saque e acrescenta a taxa de saque, e retorna o valor do novo saldo. Como a ideia é que todas as instâncias de conta tenha a mesma taxa de saque, não tem por que manter a taxa no nível de instâncias. Todas as instancias de conta referenciam a mesma taxa.

Fazendo uso da classe conta

     Console.WriteLine(new Conta().sacar(10.10)); // Resultado: 88.40
     Console.WriteLine(new Conta().sacar(20.10)); // Resultado: 78.40
     Console.WriteLine(new Conta().sacar(51.16)); // Resultado: 47.34

No exemplo acima a CLR(Common Language Runtime) não redefini o valor de taxaSaque.

Construtores estáticos

O construtor estático é um construtor especial, ele é ideal para inicializar valores estáticos quando o valor não é determinado no momento da compilação, deve levar em conta alguns detalhes para definição do construtor estático.

  • Uma classe pode ter apenas um construtor estático, ou seja, não é possível fazer sobrecarga dele.
  • Um construtor estático não aceita modificador de acesso(public, private, protected, internal e protected internal) e não pode ter parâmetro.
  • Ele é executa apenas uma vez, independentes da quantidade de instancias da classe sejam criadas.
  • Ele é executado antes de quaisquer construtores do nível de instancia.

Caso um valor de um atributo estático seja definido em um construtor no nível de instancia, o valor dele é redefinido a cada nova instância. É necessário definir dados um construtor estático (com seus respetivos dados) para realizar alguma tarefa que requer um escopo do método, por isso o C# disponibiliza a definição de um construtor estático, assim você pode definir com segurança os valores de seus dados estáticos.

Redefinido a implementação da classe conta

public class Conta {
    public static double taxaSaque;
    public double saldo = 100.00;

    static Conta() {
        taxaSaque = 1.5;
    }

    public double sacar(double valor) {
         saldo -= valor + taxaSaque;
         return saldo;
    }
}

Espero ter sido claro nesse breve artigo, até a próxima.