2009-04-17 18 views
10

Al acceder a variables de instancia o propiedades de una clase desde dentro de la misma clase, ¿las antepone con "this."?¿Utiliza 'esto' delante de variables de instancia?

+0

posible duplicado de [¿Prefija su variable de instancia con 'this' en java?] (Http://stackoverflow.com/questions/132777/do-you-prefix-your-instance-variable-with-this- in-java) – finnw

Respuesta

11

No. Lo considero un ruido visual. Creo que esta variable es una muleta para los malos estilos de nombres. Dentro de mi tipo, debería ser capaz de administrar el nombre de los campos, propiedades y métodos.

No hay absolutamente ninguna razón para nombrar su campo de respaldo "myfield", el parámetro para el constructor como "myField" y la propiedad para ser "myField".

public class TestClass 
{ 
    private string myField; 
    public TestClass(string myField) 
    { 
     this.myField = myField; 
    } 
    public string MyField {get { return myField;} set {myField = value}} 
} 

Personalmente, siempre agrego un prefijo _ a todos mis campos de respaldo privados.

public class TestClass 
{ 
    private string _myField; 
    public TestClass(string myField) 
    { 
     _myField = myField; 
    } 
    public string MyField {get { return _myField;} set {_myField = value}} 
} 

y ahora con propiedades automáticas en C#

public class TestClass 
{ 
    private string MyField {get; set;} 
    public TestClass(string myField) 
    { 
     MyField = myField; 
    } 
} 

distintos de los anteriores tal vez la única otra vez que escriba esto. es porque quieres ver el intellisense para tu tipo actual.Si necesita hacer esto, entonces presento que su tipo es demasiado grande y probablemente no siga el Single Responsibility Principle. Y digamos que eres. Por qué mantener esto alrededor después de hacer la llamada. Refactorizarlo.

3

Cada vez que tengo un parámetro de método cuyo nombre es idéntico a una variable de instancia (rara vez) lo hago, para evitar confusiones.

+0

Creo que tiene que hacerlo en esos casos, ya que los parámetros var/method locales sombrearán la var. de instancia. De acuerdo, sin embargo, ayuda a evitar confusiones. –

2

No, pero luego escribo un montón de VB;)

Acerca de la única vez que voy a ver este/Me es cuando no me acuerdo el nombre exacto del miembro o cuando necesito para distinguir con un parámetro de función del mismo nombre.

2

¡No! Ciertamente puedo ver que podría ser beneficioso, pero nada de lo que trabajo es lo suficientemente complejo como para necesitar otro nivel de aclaración.

28

Solo uso un prefijo this. en constructores o instaladores, principalmente en el caso en que los parámetros pasados ​​tienen el mismo nombre que las variables de miembro relevantes.

+5

De acuerdo. Solo lo agrego para eliminar la ambigüedad. –

+3

acordado adicionalmente. Odio tener nombres que no coincidan para setters. Realmente no tiene sentido. –

+0

+1 Tendría igual sentido anteponer los espacios de nombres a cada objeto que crea una instancia. – Nippysaurus

21

En C#, lo hago absolutamente. Las razones principales son:

  1. si hacerlo o no es una cuestión de estilo . A pesar de todo la pelea que continúa, no creo que haya un enfoque objetivamente mejor .

  2. Mi herramienta de análisis de la fuente (StyleCop) por defecto que requiere this. en frente a accesos de ejemplo. Mi primer punto implica que no debería cuidado mucho acerca de si hago siempre o siempre no, y porque la configuración por defecto es StyleCop a siempre lo requieran, que tomar el camino de menor resistencia /mayor coherencia y sigo la configuración predeterminada .

Sigo esta filosofía para la mayoría de los problemas estilísticos. Soy un gran fan de no cambiando las opciones de formato predeterminadas en un IDE de formato automático. Simplemente hace que la vida de todos sea más difícil por algo que realmente no es tan importante.

+2

El formateo predeterminado de Resharper elimina todo el 'esto'. Me abstengo de usar 'esto'. excepto si no puedo prescindir. – Carra

+1

No estoy de acuerdo con esta respuesta. El hecho de que sea un valor predeterminado en StyleCop no significa que sea correcto. Creo que quien creó esa regla probablemente esté trabajando con menos de 2 horas de sueño en 3 días. –

+2

@robert diciendo que es el estilo que quiere decir, y estoy de acuerdo, que en este caso no existe un comportamiento universalmente correcto. Ir con los valores predeterminados lo hace más fácil cuando se trabaja en el escritorio de otra persona o mirando el código de otra persona ... –

2

Estamos usando ReSharper, que maneja todo eso muy bien. La mayoría de las veces eliminamos 'esto' a menos que lo mantengamos en un constructor ya que normalmente usamos parámetros de constructor con el mismo nombre.

5

Creo que esta práctica mejora la legibilidad la mayor parte del tiempo, entonces sí.

8

Añade desorden. Entonces no

+1

Estoy de acuerdo, es un desperdicio. –

+0

Totalmente en desacuerdo. Si agrega esto anuncios desordenados, entonces su código probablemente ya esté muy desestructurado. – KdgDev

0

Yo hago. Recuperé el hábito cuando Intellisense en Visual Studio no era tan inteligente como lo es en estos días.

No me parece una distracción, supongo porque escribo mucho Python y estoy acostumbrado a verme en todas partes.

0

Solo cuando es necesario para distinguir de los parámetros, como en un setter o constructor. Considero que su uso en casos innecesarios es "codejunk", análogo al chartjunk de Edward Tufte. Ruido, en lugar de señal.

0

Si el nombre de la variable de instancia es el mismo que el argumento del método, ya no es "simplemente una razón para aclarar". Si no lo hace anteponer, puede ocasionar defectos.

Creo que eso es lo que Ben S quiso decir, pero solo quería recalcar, que ya no es una cuestión de buenas prácticas.

A menudo hago- aumenta la claridad. No creo que aumente el desorden, porque nuestros cerebros lo leen rápidamente, pero registra que es una variable de instancia

7

Absolutamente. 'this' evita la necesidad de cualquier prefijo, como m_. Más importante aún, mejora rápidamente el rendimiento de mi código, y esta es la razón por la cual:

Abrazé realmente a Microsoft Cops (FxCop, StyleCop). Realmente me han ayudado a atrapar cosas que normalmente ni siquiera pensaría. Por ejemplo, si un método no hace referencia a ninguna variable miembro, una sugerencia de FxCop es marcar el método como estático, por lo que el método no tiene que asignarse a cada instancia de la clase. De MSDN:

Los métodos que no tienen acceso a instancia llamada de datos o métodos de instancia se puede marcados como static (Shared en Visual básico). Después de marcar los métodos como estáticos, el compilador emitirá sitios de llamadas no virtuales a estos miembros . La emisión de llamadas no virtuales sitios evitará una comprobación en tiempo de ejecución para cada llamada que asegure que el puntero de objeto actual no sea nulo. Esto puede dar como resultado una ganancia de rendimiento mensurable de para código sensible al rendimiento. En algunos casos , la falla al acceder a la instancia del objeto actual representa un problema de corrección .

Prefijo de mis variables de miembro con 'this.' hace dos cosas por mi Primero, satisface StyleCop. En segundo lugar, y más importante aún, me ayuda a identificar rápidamente si un método debe marcarse como estático.

Por supuesto, ejecutar FxCop me dirá si necesito marcar un método como estático. Sin embargo, usando 'esto'. me ayuda a dedicar más tiempo a escribir código nuevo y menos a corregir las violaciones de FxCop.

+0

Esto solo se aplica a ese raro código sensible al rendimiento, sin embargo. Generalmente, si una función es estática o no es una cuestión de contrato. No se debe establecer una función estática solo porque en la implementación actual no es necesario acceder a los miembros de la clase. Puede ser necesario en el futuro, cuando otro código se basa en que es estático. –

1

Lo hago, para mí agrega un poco de claridad al código, ¿está en el procedimiento actual o en la clase?

1

Sí, si veo esto. Estoy seguro de que es local y no necesito buscar más. Si no está prefijado con esto. (O tal vez '_') Tengo que comprobar si se declara de forma local o en un ancestro o si se trata de un parámetro o ...

Todos estos controles tomo un poco más de tiempo durante la depuración ...

0

Hago muchas cosas simplemente porque hace que aparezca el autocompletado.

1

En general sí, lo hago. La comunicación del alcance es un aspecto importante de la legibilidad. Lo distingue de las variables locales, los métodos estáticos, etc. También comunica que la definición es "cercana".

Ah, y solo lo hago por métodos/propiedades públicos. Esos tienden a ser mayúscula así que esto se ve bien. La vista interna se parece a la vista externa (myInstance.Thing). Las propiedades privadas suelen ser minúsculas, por lo que es una idea menos atractiva para ellas.

No es estrictamente necesario, por supuesto, y algunas personas lo prefieren más escueto. Pero proporciona sugerencias para mí y para otros desarrolladores que podrían ver el código.

Cuestiones relacionadas