ATUALIZAÇÃO IMPORTANTE (12 de abril de 2016):
Fomos informados de que o padrão interno da equipe do .NET CoreFX insiste em usar a notação de sublinhado sem fornecer informações sobre o porquê. No entanto, se olharmos atentamente para a regra número 3 torna-se evidente que há um sistema de _, t_, s_prefixos que sugere por que _foi escolhido em primeiro lugar.
- Usamos
_camelCasepara campos internos e privados e usamos somente leitura sempre que possível. Prefixar campos de instância com _, campos estáticos com s_e encadear campos estáticos com t_. Quando usado em campos estáticos, readonlydeve vir depois static(ou seja, static readonlynão readonly static).
- Evitamos, a
this.menos que seja absolutamente necessário.
Portanto, se você é como a equipe do .NET CoreFX trabalhando em algum código de desempenho, multithreaded, crítico no nível do sistema , é altamente recomendável que você:
- aderir aos seus padrões de codificação e
- use a notação sublinhada e
- não leia mais esta resposta
Caso contrário, leia em ...
A RESPOSTA ORIGINAL:
Vamos primeiro concordar com o que estamos falando. A questão é como acessamos os membros da instância de métodos não estáticos e construtores de uma classe / subclasses, se modificadores de visibilidade permitirem isso.
Notação de sublinhado
- sugere que você use o prefixo "_" nos nomes dos campos particulares
- também diz que você nunca deve usar "isto", a menos que seja absolutamente necessário
Esta notação
- sugere que você sempre use "isso". para acessar qualquer membro da instância
Por que essa notação existe?
Porque é assim que você
- diferenciar um parâmetro de um campo quando eles compartilham o mesmo nome
- verifique se você está trabalhando no contexto da instância atual
Exemplo
public class Demo
{
private String name;
public Demo(String name) {
this.name = name;
}
}
Por que existe a notação sublinhada?
Algumas pessoas não gostam de digitar "this", mas ainda precisam distinguir um campo e um parâmetro, então concordaram em usar "_" na frente de um campo
Exemplo
public class Demo
{
private String _name;
public Demo(String name) {
_name = name;
}
}
Pode-se pensar que é apenas uma questão de gosto pessoal e as duas maneiras são igualmente boas / ruins. No entanto, existem certos aspectos em que essa notação supera a notação de sublinhado:
Clareza
- nomes de desordem de notação sublinhada
- essa notação mantém os nomes intactos
Carga cognitiva
A notação de sublinhado é inconsistente, faz com que você trate os campos de uma maneira especial, mas você não pode usá-los com outros membros sempre que precisar se perguntar se precisa de uma propriedade ou de um campo.
esta notação é consistente, você não precisa pensar, você sempre usa "this" para se referir a qualquer membro
UPDATE: como foi apontado, o seguinte não é um ponto de vantagem
Manutenção
A notação sublinhada exige que você fique de olho _durante a refatoração, digamos, transformando um campo em propriedade (remover _) ou o oposto (adicionar _)
essa notação não tem esse problema
Preenchimento automático
Quando você precisar ver a lista de membros da instância:
- A notação sublinhada não ajuda muito, porque quando você digita "_" o pop-up de preenchimento automático mostra os campos particulares e todos os tipos disponíveis nos assemblies vinculados misturados com o restante dos membros da instância
- esta notação fornece uma resposta clara, digitando "this" tudo o que você vê é a lista de membros e nada mais
Ambiguidade
Às vezes, você precisa lidar com o código sem a ajuda do Intellisense. Por exemplo, quando você faz revisões de código ou navega online pelo código-fonte.
A notação sublinhada é ambígua: quando você vê Something.SomethingElse, não é possível dizer se algo é uma classe e SomethingElse é sua propriedade estática ... ou talvez algo é uma propriedade de instância atual que possui sua própria propriedade de SomethingElse
this-notation is clear: Quando você vê Something.SomethingElse, isso só pode significar uma classe com uma propriedade estática e quando você vê this.Something.SomethingElse, você sabe que Something é um membro e SomethingElse é sua propriedade
Métodos de extensão
Você não pode usar métodos de extensões na própria instância sem usar "this".
- A notação sublinhada exige que você não use "this", mas com os métodos de extensão você deve
- Esta notação evita que você hesite, você sempre usa "isto", ponto final.
Suporte do Visual Studio
Recomendações oficiais
Existem muitas diretrizes oficiais que dizem claramente "não use sublinhados", especialmente em C #