ACTUALIZACIÓN IMPORTANTE (12 de abril de 2016):
Se nos señaló que el estándar interno del equipo .NET CoreFX insiste en usar la notación de subrayado sin dar ninguna idea de por qué. Sin embargo, si nos fijamos bien en la regla # 3 se hace evidente que existe un sistema de _, t_, s_prefijos que sugiere por qué _fue elegido en el primer lugar.
- Usamos
_camelCasepara campos internos y privados y utilizamos solo lectura cuando sea posible. Prefijar campos de instancia con _, campos estáticos con s_y campos estáticos de subprocesos con t_. Cuando se usa en campos estáticos, readonlydebe aparecer después static(es decir, static readonlyno readonly static).
- Evitamos a
this.menos que sea absolutamente necesario.
Entonces, si usted es como el equipo de .NET CoreFX que trabaja en un código de nivel de sistema crítico, multiproceso y de rendimiento crítico, le SUGERIMOS FUERTEMENTE:
- adherirse a sus estándares de codificación y
- use la notación de subrayado y
- no lea más esta respuesta
De lo contrario, sigue leyendo ...
LA RESPUESTA ORIGINAL:
Primero pongamos de acuerdo de lo que estamos hablando. La pregunta es cómo accedemos a los miembros de la instancia desde métodos y constructores no estáticos de una clase / subclase si los modificadores de visibilidad lo permiten.
Notación de subrayado
- sugiere que use el prefijo "_" en los nombres de los campos privados
- también dice que nunca debe usar "esto" a menos que sea absolutamente necesario
Esta notación
- sugiere que siempre uses "esto". para acceder a cualquier miembro de la instancia
¿Por qué existe esta notación?
Porque así es como tú
- distinguir un parámetro de un campo cuando comparten el mismo nombre
- asegúrese de estar trabajando en el contexto de la instancia actual
Ejemplo
public class Demo
{
private String name;
public Demo(String name) {
this.name = name;
}
}
¿Por qué existe la notación de subrayado?
A algunas personas no les gusta escribir "esto", pero aún necesitan una forma de distinguir un campo y un parámetro, por lo que acordaron usar "_" delante de un campo
Ejemplo
public class Demo
{
private String _name;
public Demo(String name) {
_name = name;
}
}
Uno puede pensar que es solo cuestión de gustos personales y que ambas formas son igualmente buenas / malas. Sin embargo, hay ciertos aspectos en los que esta notación supera a la notación de subrayado:
Claridad
- nombres de desorden de guiones bajos
- esta notación mantiene los nombres intactos
Carga cognitiva
la notación de subrayado es inconsistente, te hace tratar los campos de una manera especial, pero no puedes usarlo con otros miembros, cada vez que necesites preguntarte si necesitas una propiedad o un campo
esta notación es consistente, no tienes que pensar, siempre usas "this" para referirte a cualquier miembro
ACTUALIZACIÓN: como se señaló, lo siguiente no es un punto de ventaja
Mantenimiento
la notación de subrayado requiere que _vigiles mientras refactorizas, por ejemplo, convertir un campo en propiedad (eliminar _) o lo contrario (agregar _)
esta notación no tiene ese problema
Autocompletado
Cuando necesite ver la lista de miembros de la instancia:
- la notación de subrayado no le ayuda mucho, porque cuando escribe "_", la ventana emergente de autocompletar le muestra los campos privados y todos los tipos disponibles de los ensamblados vinculados mezclados con el resto de los miembros de la instancia
- esta notación le da una respuesta clara, escribiendo "esto" todo lo que ve es la lista de miembros y nada más
Ambigüedad
A veces tienes que lidiar con el código sin la ayuda de Intellisense. Por ejemplo, cuando realiza revisiones de código o explora el código fuente en línea.
la notación de subrayado es ambigua: cuando ve Something.SomethingElse no puede decir si Something es una clase y SomethingElse es su propiedad estática ... o tal vez Something es una propiedad de instancia actual que tiene su propia propiedad de SomethingElse
esta notación es clara: cuando ves Something.SomethingElse solo puede significar una clase con una propiedad estática y cuando ves this.Something.SomethingElse sabes que Something es miembro y SomethingElse es su propiedad
Métodos de extensión
No puede usar métodos de extensiones en la instancia misma sin usar "this".
- la notación de subrayado requiere que no use "esto", sin embargo, con los métodos de extensión debe
- esta notación lo salva de dudas, siempre usa "esto", punto.
Soporte de Visual Studio
Recomendaciones oficiales
Hay muchas pautas oficiales que dicen claramente "no use guiones bajos", especialmente en C #