2009-06-05 15 views
7

Esto me molesta mucho y me parece que escribo errores estúpidos cuando se combina con Intellisense (VS 2008 Pro):¿Cómo desactivo el "esto" implícito en C#?

class Foo 
{ 
    public Foo(bool isAction) 
    { 
     this.IsAction = IsAction; 
    } 

    public bool IsAction { get; private set; } 
} 

¿Viste eso? Ciertamente no lo hice hasta que IsAction nunca cambió, causando errores.

Intellisense alguna manera convertidos "isA<tab>" a "IsAction" para mí lo que significa la propiedad Foo.IsAction es siempre falsa independientemente de la entrada del constructor. Sólo brillante.

Tengo que decir que odio particularmente el "implícito this" (no sé si tiene un nombre formal) y me gustaría desactivarlo para que nunca lo asuma. ¿Hay alguna manera de hacer esto? Esto también se aplica al llamar a métodos estáticos de la misma clase.

Alternativamente, ¿qué convenciones de nomenclatura evitan este pequeño problema? La propiedad debe seguir siendo "IsAction", por lo que tiene que ser una convención sobre el nombre del parámetro del constructor. Por extraño que parezca, si lo nombro con la ortografía coincidente exacta, entonces this.IsAction = IsAction; funciona correctamente.

El problema no son los idiomas sensibles a las mayúsculas y minúsculas sino la implícita de this. Ahora que lo pienso, esto también es más una pregunta de VS 2008 Pro que una C#. Puedo vivir con código ya escrito sin la this pero no quiero escribir nuevo código sin ella, que significa decirle En


respuesta de noldorin me hizo pensar.

Ahora que lo pienso, esto también es más una pregunta de VS 2008 que una C#. Puedo vivir con el código ya escrito sin el this (aunque sí lo cambio si estoy allí rechinando) pero no quiero escribir un código nuevo sin él, lo que significa decirle a Intellisense que deje de hacerlo. ¿Puedo decirle a Intellisense que lo apague?

+0

Esto no es un problema de implícita. Incluso si pudieras apagarlo (creo que no puedes), estoy seguro de que lo volverías a encender en unos minutos. –

+0

Estoy bastante seguro de que no lo haría. ¿He mencionado que * lo odio *? :) –

+0

Me encantaría ver su código sin él, cada llamada a un método privado o protegido precedido por "esto" ... Las buenas clases contienen muchos pequeños métodos refactorizados y expresivos para lograr su objetivo. Usted estaría lleno de "esto" en todo el lugar. –

Respuesta

3

Este es un problema común. Microsoft tiene algunos recommendations for parameter names pero no son terriblemente útiles en su caso.

Como han mencionado otros respondedores, no se puede "desactivar" el comportamiento de resolución del alcance del lenguaje C#: su mejor enfoque es una convención de nomenclatura. Otros han mencionado la notación "húngara": algunas personas tienen una reacción instintiva ante esto debido al confusion over the original intent de la notación.

Mi enfoque personal, ha sido utilizar el carácter 'p' como prefijo de los nombres de los parámetros de las funciones públicas.Es discreto, simple, fácilmente identificable y fácil de aplicar con herramientas como Resharper.

La convención de nomenclatura particular que elija es una cuestión de preferencia y estilo; sin embargo, hay algún beneficio de ser consistente en la práctica que seleccione.

Usando mi convención de nomenclatura sugerida, que iba a escribir su constructor para:

class Foo 
{ 
    public Foo(bool pIsAction) 
    { 
     this.IsAction = pIsAction; 
    } 

    public bool IsAction { get; private set; } 
} 
+2

Los nombres de parámetros son parte de la interfaz, visible para las personas que llaman. Es posible que encuentre una convención para los campos de miembros sería mejor. – Richard

4

Siempre se puede volver a la notación húngara [Me estoy preparando para recibir llamas cuando escribo esto]. Si puedes lidiar con la fealdad, eso resolvería tu problema. Esta es una sugerencia, no una recomendación.

Como alternativa, estoy bastante seguro de que el análisis de código estático lo detectará y le advertirá al respecto. Prueba FxCop.

EDITAR

He estado usando ReSharper durante más de un año, y sé que es muy inteligente acerca de que le asiste en caso de una manera sensible. Entre otros beneficios, su problema intellisense se resolverá instalando Resharper.

EDITAR 2

simplemente he comprobado. Ni FxCop ni Resharper detectan este error directamente. Lo que sí atrapan es el hecho de que el parámetro isAction no se utiliza en el método Foo. En este caso, la advertencia lo guiará al error. En los casos en que el parámetro se utiliza de otra manera dentro del método, puede pasar por el análisis de código estático.

+0

Sabía que el hecho de que mencionara la notación húngara (aunque yo no lo recomiendo) provocaría votos hacia abajo. :) –

+0

Sí, pero la sugerencia de análisis de código estático obtuvo un +1 de mí ... habría captado esto :-) –

+0

¡Por favor, no hay notación húngara! No estoy seguro de por qué lo has mencionado si no lo recomiendas. – Noldorin

1

Esto me pone todo el tiempo.Me he tomado a variables prepending que se pasa al constructor con un '_', como:

class Foo 
{  
    public Foo(bool _isAction) 
    { 
     this.IsAction = _isAction; 
    } 
    public bool IsAction { get; private set; }} 
+3

Normalmente, el guión bajo se reserva para indicar una variable de instancia, no un parámetro. Usarlo para indicar un parámetro debería estar bien, pero podría ser frustrante para los desarrolladores que no están familiarizados con su convención. –

+0

Si no hago auto-propiedades, entonces nombre mi propiedad "IsAction" y mi campo de respaldo "_IsAction" para que la convención no funcione para esos. :) –

+5

Lo he visto antes también, pero es terriblemente feo. Es una práctica aceptable para nombrar campos privados (e incluso utilizado por Microsoft a veces), pero ciertamente no para parámetros. – Noldorin

1

Me temo que no hay manera de desactivar la función "implícita this". Es parte de la especificación del lenguaje y del compilador, y no hay forma de desactivarlo.

Personalmente, no considero que sea un gran problema. Es cierto que es importante tener cuidado con la capitalización de los nombres de los miembros y los parámetros, pero esta es siempre la situación en un lenguaje que distingue entre mayúsculas y minúsculas, como C#.

Mi "solución" recomendada (que ya parece que está haciendo) es usar siempre la palabra clave this para hacer referencia a propiedades/campos, de modo que se destaque inmediatamente cuando deba usar un parámetro. No va a resolver el problema para usted, pero si lo tiene en cuenta, sin dudas lo ayudará. Solo adquirir el hábito de esto (así como recordar todos los nombres de parámetros/variables locales deben comenzar con minúsculas) le ayudará a evitar este problema en el futuro.

+0

Iba a comentar, pero voy a modificar mi pregunta aquí en un segundo. –

+0

Entonces, ¿desea desactivar las sugerencias intellisense para todas las * propiedades * por lo que yo entiendo? Estoy bastante seguro de que esto no es posible, pero lo pensaré. – Noldorin

+0

Quiero que no tire de los miembros de la clase implícita, es decir, instancia, pero estática también estaría bien. –

0

Es un problema molesto en intellisense de Visual Studio. Resharper lo hace bien la mayor parte del tiempo sin embargo.

0

Creo que es más probable que el desarrollador haya elegido "IsAction" en lugar de "isAction" de Intellisense. No creo que Intellisense cambie "isA" a "this.IsAction".

Si los nombres difieren solo por caso, entonces creo que la única forma de evitar errores como este es ser consciente de ellos y cuidadoso, y al usar las pruebas unitarias de manera efectiva.

+0

Sí, porque en este caso, sería el valor predeterminado para el caso más específico (es decir, el argumento isAction) en el intellisense VS predeterminado. este fue el error del usuario ;-) –

+0

Si llega a eso, entonces los errores derivados de los desarrolladores. Decir que un error del desarrollador causó un error es redundante y no ayuda a mi pregunta en lo más mínimo. Estoy buscando una forma de reducir esos errores para evitar los errores. –

+0

Esto va a funcionar en C#;). Y también, las propiedades siempre deben comenzar con mayúsculas (incluso el análisis del código te dirá que si estoy en lo cierto). Lo mismo ocurre con las funciones en su código ... siempre debe comenzar con una letra mayúscula. – Nordes

0

Podría ser molesto en otras capacidades, pero podría desactivar la opción para que Intellisense preseleccione el miembro utilizado más recientemente. Me doy cuenta de que realmente no solucionará el problema directamente, pero podría ayudar a prevenir algunas pestañas accidentales cuando realmente no tiene seleccionado el elemento correcto.

2

FxCop se quejará de esto porque el parámetro isAction nunca se utiliza. Específicamente, extraerá la regla CA1801: ReviewUnusedParameters.

Personalmente, siempre he pensado que el compilador C# debería dar una advertencia sobre los parámetros no utilizados.

0

Nota:

Si está utilizando ReSharper, tiene algunos atajos que escriben un montón de este código para usted y evitar el error.

Puede crear la propiedad primero, luego presionar Alt-Ins y elegir "generar constructor", o puede agregar un parámetro "isAction" al constructor, presionar Alt-Enter con el cursor en el parameterName, y elegir la acción "Crear e inicializar propiedad de la propiedad IsAction" del menú que aparece.

+0

Otro favorito mío es cuando tienes miembros con nombres largos. Yo uso intellisense para encontrar IsAnotherActionThatIsVeryLong escribiendo IAATIVL, y isAotherActionThatIsVeryLong escribiendo iAATIVL. Nunca supe que me estaba perdiendo hasta que lo tuve. –

6

He intentado simplemente su código en Visual Studio 2008. Al encender el análisis de estática que produce el siguiente error:

Warning 3 CA1801 : Microsoft.Usage : Parameter 'isAction' of 'Foo.Foo(bool)' is never used. Remove the parameter or use it in the method body.

Mi sugerencia es que al activar esto en adelante encontrará errores como este al principio. Para habilitar esto, seleccione propiedades del menú contextual en el proyecto, luego seleccione la pestaña Análisis de código y seleccione "Habilitar análisis de código en compilación"