Al llamar a un método, ¿deberíamos usar base.methodname y this.methodname?

8

En C #, con un conjunto de clases heredado, al llamar a un método, ¿debemos usar las palabras clave 'base.methodname y this.methodname' ... independientemente de si es un método anulado o no?

Es probable que el código experimente cambios en términos de lógica y tal vez algunas condiciones similares a IF-ELSE puedan presentarse en una fecha posterior. Entonces, en ese momento, el desarrollador debe verse obligado a volver a visitar cada línea de código y asegurarse de que elija correctamente el método que se llama --- base.methodname () o this.methodname () ELSE the. NET Framework llamará a DEFAULT (creo que es base.methodname ()) y toda la lógica puede ser descartada.

MukeshAnAlsoRan
fuente
Debe agregar su respuesta como una respuesta real a la pregunta, en lugar de incluirla en la pregunta.
yannis
3
"Mi respuesta es: SÍ, es una buena práctica, úsela porque es por eso que fueron creados para". Según esa lógica, también podría decir "NO, es una buena práctica, el uso de estas palabras clave es opcional por una razón".
pdr

Respuestas:

27

Usar la basepalabra clave no es una cuestión de preferencia, es una cuestión de corrección. Si desea llamar a la implementación de la clase base en un método anulado, debe usar base. Si no quieres llamar a eso, no puedes usarlo base.

La thispalabra clave, por otro lado, es una cuestión de preferencia en la mayoría de los casos. Creo que solo satura innecesariamente el código, por lo que no lo uso si no es necesario. Donde es útil es si tiene un parámetro de método con el mismo nombre que el campo (o propiedad). Lo usaría thisen tal caso. Pero si estoy escribiendo un nuevo código, tiendo a usar convenciones de nombres que eviten este problema.

svick
fuente
Cuando escribo código solo para mí o para que yo o un desarrollador senior diferente lo mantenga, omitiré thiscomo se supone. En proyectos más grandes donde tendré junior (potencialmente incluso nuevas contrataciones), nuestro estándar es usar esas palabras clave solo para que el alcance sea inmediatamente evidente, independientemente del nivel de experiencia del codificador.
Joel Etherton
1
Hola Joel ... tu perspectiva hacia esto es perfecta con la mía. Lo que estamos trabajando es un viejo código C # escrito en 2001 y, a veces, es un laberinto. También mañana, no estamos seguros de quién sería el desarrollador (aprendiz o experimentado) después de un par de años ... por lo tanto, si se usan estas palabras clave y alguien continúa implementando métodos anulados (en aras del polimorfismo), entonces ese desarrollador lo haría ser obligado a volver a visitar cada llamada de un método dado para que la lógica no falle.
MukeshAnAlsoRan
Si no anulo un método, ¿por qué no podría usarlo de basetodos modos al llamarlo, aunque sea semánticamente incorrecto?
Deduplicador el
1
@JoelEtherton No creo que la programación para atender al "mínimo común denominador" sea una buena idea. Entendería esa razón si discutiera algo significativamente más complejo, pero thises lo más básico posible. Si los programadores aún no entienden el alcance de los métodos (y el this.acceso implícito de los miembros del objeto, incluso cuando no están escritos explícitamente), entonces tienen que estudiar. Eso está en ellos .
Alexander - Restablece a Mónica el
1
@JoelEtherton En general, estaría de acuerdo. No me volvería loco con la metaprogramación de plantillas C ++, por ejemplo. Pero thises realmente fundamental. Se espera el conocimiento de cada peldaño de la escalera de habilidades de programación.
Alexander - Restablece a Mónica el
5

Sugeriría que si está llamando explícitamente a un método base desde una clase en la que se anula ese método, tiene un grave problema con la lógica y la legibilidad. baserealmente solo debería aparecer cuando se llama a la implementación base de un método anulado desde ese método anulado.

En cualquier otro lugar, debería estarlo this(si el método no se anula, irá a la clase base de todos modos) y no hay nada de malo en permitir que el compilador deduzca eso.

pdr
fuente
0

thispalabra clave: no existe una regla estricta y rápida para aplicar la thispalabra clave, ya que es una preferencia personal, pero su código podría estar desordenado.

Pros y contras de usar esta palabra clave en C #

basepalabra clave (reutilización): ya hay respuestas que indican el uso de base. Me gustaría agregar un punto.

La funcionalidad común para todas las clases derivadas vendría en la clase base y puede llamar al método base seguido de la implementación específica en el método en la clase derivada logrando la reutilización.

Karthik Sreenivasan
fuente
0

Además de lo mencionado, puede usar "esto" al llamar a una función de extensión.

public static class ExtensionForMyClass {  
public static void SomeFunction (this MyClass inst) {} 
}

No puedes hacer:

SomeFunction();

desde el interior del cuerpo de MyClass. Solamente:

this.SomeFunction();

No hay una razón real para crear extensiones estáticas para la clase que está haciendo. El único escenario en el que me resultó útil fue cuando tenía funciones de extensión basadas en la interfaz que está implementando mi clase, no en la clase misma.

Iurii Selinnyi
fuente
0

Recomendaría soltar el this.prefijo, excepto en los casos en que agrega simetría. P.ej:

public class Foo: IComparable {
    int value1, value 2;

    public int CompareTo(object _that) {
        if (_that == null) return 1;
        if (Object.ReferenceEquals(this, _that)) return 0;

        Foo that = (foo) _that;
        var result = this.value1.CompareTo(that.value1)
        if (result != 0) return result;

        result = this.value2.CompareTo(that.value2)
        if (result != 0) return result;

        return 0
    }
}
Alexander - Restablece a Monica
fuente