2011-07-26 9 views
17

Al mirar this question, el comentarista @Jon Egerton mencionó que MyClass era una palabra clave en VB.Net. Ya que nunca lo usaron, fui y encontré el documentation en él:equivalente de MyClass en C#

La palabra clave MiClase se comporta como una variable de objeto en referencia a la instancia actual de una clase tal como se aplica en un principio. MyClass es similar a Me, pero todas las llamadas a métodos se tratan como si el método fuera NotOverridable.

Veo cómo podría ser útil, en algunos escenarios específicos. Lo que no puedo pensar es cómo obtendría el mismo comportamiento en C#, es decir, para garantizar que una llamada a un método virtual myMethod se invoca contra myMethod en la clase actual, y no un derivado myMethod (aka in IL, invocando call en lugar de callvirt)?

Sin embargo, podría estar teniendo un completo momento mental en blanco.

+0

Por supuesto, usted puede hacer esto con la reflexión y 'DynamicMethod' y costumbre IL-generación (usando' 'call' en lugar de callvirt' como sugieres), pero que iba a terminar con un montón de feo código para algo que es probablemente una mala idea en primer lugar. Si realmente necesita este comportamiento por alguna razón, entonces la solución de Heinzi es el camino a seguir. – LukeH

Respuesta

14

According to Jon Skeet, no hay tal equivalentes:

n, C# No tiene un equivalente de la palabra clave MiClase de VB.NET. Si desea garantizar que no llame a una versión anulada de un método, primero debe hacerlo de forma no virtual.

Una solución obvia sería la siguiente:

public virtual void MyMethod() 
{ 
    MyLocalMethod(); 
} 

private void MyLocalMethod() 
{ 
    ... 
} 

entonces se podría llamar MyLocalMethod() cuando un usuario VB escribiría MyClass.MyMethod().

+0

Parece estar bien si está implementando una clase base, no tan buena si está heredando y heredando. –

+0

@Damien: cierto. Afortunadamente, no es difícil evitar esta limitación (ver mi edición). – Heinzi

3

No existe un equivalente de C# de la palabra clave MyClass en VB.Net. Para garantizar que no se invocará una versión anulada de un método, simplemente haga que no sea virtual.

+0

¿Y si quiere permitir que se anule? ¿O estás diciendo que esto es imposible? –

+0

@George Duckett por lo que puedo pensar que sí es imposible. – Numenor

1

Además de las respuestas que dicen que no existe, por lo que debe hacerlo no virtual.

Aquí hay un smelly (léase: ¡no hagas esto!). Pero en serio, vuelve a pensar en tu diseño.

Mueva básicamente cualquier método que deba tener la base llamada en la clase 'super'base', que se encuentra por encima de su clase base existente. En tu clase existente, llama a base.Método() para llamar siempre al que no está invalidado.

void Main() 
{ 
    DerivedClass Instance = new DerivedClass(); 

    Instance.MethodCaller(); 
} 


class InternalBaseClass 
{ 
    public InternalBaseClass() 
    { 

    } 

    public virtual void Method() 
    { 
     Console.WriteLine("BASE METHOD"); 
    } 
} 

class BaseClass : InternalBaseClass 
{ 
    public BaseClass() 
    { 

    } 

    public void MethodCaller() 
    { 
     base.Method(); 
    } 
} 

class DerivedClass : BaseClass 
{ 
    public DerivedClass() 
    { 

    } 

    public override void Method() 
    { 
     Console.WriteLine("DERIVED METHOD"); 
    } 
}