Variável this

Toda classe tem implicitamente declarada uma variável chamada this, do mesmo tipo da classe e que se refere ao objeto corrente. Ela é usada quando for necessário referir-se ao próprio objeto.

Alguns usos comuns da palavra chave this são:

  • Qualificação de membros de nomes equivalentes (passados por parâmetro):
    1
    2
    3
    4
    5
    6
    
    public Pessoa(string nome, string sobrenome)
    {
        // A utilização do this "qualifica" os membros nome e sobrenome:
        this.nome = nome;
        this.sobrenome = sobrenome;
    }
  • Para passar o próprio objeto como parâmetro para um método:
    1
    
    CalculaTaxa(this);
  • Na declaração de índices:
    1
    2
    3
    4
    5
    
    public int this[int param]
    {
        get { return array[param]; }
        set { array[param] = value; }
    }

É bom reforçar que, como membros static existem para a classe e não para a instância desta, é um erro referenciar a variável this dentro de um método ou propriedade static.
Abaixo segue um exemplo completo da utilização dos conceitos citados anteriormente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
class Empregado
{
    private string nome;
    private string sobrenome;
    private decimal salario = 3000.00m;
 
    // Construtor:
    public Empregado(string nome, string sobrenome)
    {
        // A utilização do this "qualifica" os membros nome e sobrenome:
        this.nome = nome;
        this.sobrenome = sobrenome;
    }
    // Método para imprimir na tela:
    public void printEmpregado()
    {
        Console.WriteLine("nome: {0}\nsobrenome: {1}", nome, sobrenome);
        // Passa o objeto para o método CalculaTaxa, que é static:
        Console.WriteLine("Taxas: {0:C}", Taxa.CalculaTax(this));
    }
 
    public decimal salario
    {
        get { return salario; }
    }
}
 
class Taxa
{
    public static decimal CalculaTaxa(Empregado E)
    {
        return 0.08m * E.salario;
    }
}
 
class MainClass
{
    static void Main()
    {
        // Cria o objeto:
        Empregado E1 = new Empregado("Mickey", "Mouse");
 
        // Mostra na tela:
        E1.printEmpregado();
    }
}
/*
Saída do console:
    nome: Mickey
    sobrenome: Mouse
    Taxas: $240.00
 */

Outros Modificadores

A classe pode receber o seguinte modificador:

Modificador e classe Significado
abstract Indica que a classe é abstrata, ou seja, contém  pelo menos um método abstrato. Ela deve ser herdada e ter os seus método abstratos implementados. Não podemos criar instâncias de classes abastratas.

Os membros podem receber os seguintes modificadores: 

Modificador e membro Aplicação Restrições Significado
static Campos, métodos e propriedades. Não se aplica a indexadores construtores e destrutores   Faz com que o elemento não seja aplicado a objeto nenhum, pode ser chamado no contexto da classe. Por exemplo, o método “Main” tem que ser “static”
virtual Método e propriedades. Não pode ser usado em conjunto com “static”, “virtual” ou “override” Declara um ancestral que pode ser redefinido na classe derivada.
override Método e propriedades. Não pode ser usado em conjunto com “new”, “static”, “virtual” ou “override” Provê uma nova implementação de um método virtual de uma classe base.
readonly Método e propriedades.   Declara um campo que pode ser atribuído apenas no construtor da mesma classe.
abstract Método e propriedades. Não pode ser usado em conjunto com “static”, “virtual” ou “override” Método ou propriedade em classe abstrata que deve ser implementado em classe derivada.
new Método e propriedades.   Especifica que o método ou propriedade esconde outro virtual com a mesma assinatura (nome e parâmetros) da classe base. Pode ser usando em conjunto com virtual.

Modificadores de Acesso

Os modificadores de acesso são os seguintes: 

Modificador Significado
public Sem limitação de acesso.
protected internal Acesso limitado à própria classe, às classes derivadas e ao próprio assembly
protected Acesso limitado à própria classe, às classes derivadas.
internal Acesso limitado ao próprio assembly.
private Acesso limitado à própria classe.

Algumas restrições:

  • Namespaces, interfaces e membros de enumeração têm acesso implicitamente “public” e não pode ser modificado;
  • Tipos (incluindo classes) podem ser “public” ou “internal”, o padrão é “internal”;
  • Membros de classes podem ser de todos os tipos, o padrão é “private”;
  • Membros de estruturas podem ser “public”, “internal” ou “private”, o padrão é “private”;