C#中的MyClass等价物

时间:2011-07-26 14:12:57

标签: c# vb.net

在查看this question时,评论者@Jon Egerton提到MyClassVB.Net中的关键字。从未使用过它,我去找了documentation就可以了:

  

MyClass关键字的行为类似于一个对象变量,它引用了最初实现的类的当前实例。 MyClass与Me类似,但是对它的所有方法调用都被视为方法是NotOverridable。

在某些特定情况下,我可以看到它有多么有用。我无法想到的是,你将如何在C#中获得相同的行为 - 也就是说,确保在当前类中实际调用对myMethod的虚拟方法myMethod,而不是派生的myMethod(也就是在IL中,调用call而不是callvirt)?

我可能只是有一个完整的心理空白时刻。

3 个答案:

答案 0 :(得分:14)

According to Jon Skeet,没有这样的等价物:

  

不,C#没有相当于VB.NET的MyClass关键字。如果您想保证不调用方法的重写版本,则需要首先将其设置为非虚拟。

一个明显的解决方法是:

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

private void MyLocalMethod()
{
    ...
}

然后,当VB用户写MyLocalMethod()时,你可以调用MyClass.MyMethod()

答案 1 :(得分:3)

VB.Net中没有MyClass关键字的C#等价物。为了保证不会调用方法的重写版本,只需将其设置为非虚拟。

答案 2 :(得分:1)

除了答案说它不存在之外,所以你必须把它变成非虚拟的。

这是一个smelly(读:不要这样做!)解决方法。但严肃地说,重新考虑你的设计。

基本上将任何必须将基本调用的方法移动到“超级”基类中,该类位于现有基类之上。在你现有的类中调用base.Method()来始终调用非重写的。

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");
    }
}