C# C中的MyClass等价物

C# C中的MyClass等价物,c#,vb.net,C#,Vb.net,在查看时,commenter@Jon Egerton提到MyClass是VB.Net中的一个关键字。由于从未使用过,我去了,发现上面有: MyClass关键字的行为类似于引用最初实现的类的当前实例的对象变量。MyClass与我类似,但对它的所有方法调用都被视为不可重写的方法 我可以看出,在某些特定场景中,这是多么有用。我想不出的是,如何在C中获得相同的行为——即,确保对虚拟方法myMethod的调用实际上是针对当前类中的myMethod调用的,而不是IL中的派生myMethod a.k.a,调用

在查看时,commenter@Jon Egerton提到MyClass是VB.Net中的一个关键字。由于从未使用过,我去了,发现上面有:

MyClass关键字的行为类似于引用最初实现的类的当前实例的对象变量。MyClass与我类似,但对它的所有方法调用都被视为不可重写的方法

我可以看出,在某些特定场景中,这是多么有用。我想不出的是,如何在C中获得相同的行为——即,确保对虚拟方法myMethod的调用实际上是针对当前类中的myMethod调用的,而不是IL中的派生myMethod a.k.a,调用call而不是callvirt


不过,我可能只是有一个头脑完全空白的时刻。

在VB.Net中没有与MyClass关键字相当的C。要保证方法的重写版本不会被调用,只需将其设置为非虚拟版本。

,没有此类等效版本:

不,C没有VB.NET的MyClass关键字的等价物。如果要保证不调用方法的重写版本,首先需要将其设置为非虚拟

一个明显的解决办法是:

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

private void MyLocalMethod()
{
    ...
}

然后,当VB用户编写MyClass.MyMethod时,您可以调用MyLocalMethod。

除了回答说MyClass.MyMethod不存在之外,您还必须将其设置为非虚拟

这里有一句话:不要这样做!解决问题。但说真的,重新考虑你的设计

基本上,将任何必须调用基类的方法移动到“super”基类中,它位于现有基类之上。在现有类中,调用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");
    }
}

如果你想让它被覆盖?或者你是说这是不可能的?@George Duckett据我所知是的,这是不可能的。如果你实现了基类,这看起来很好,但是如果你继承并继承了基类,就不太好了。@Damien:是的。幸运的是,绕过这个限制并不难,请参见我的编辑。当然,您可以使用反射和DynamicMethod以及使用call而不是callvirt(如您所建议的那样)自定义IL生成来实现这一点,但您最终会得到大量丑陋的代码,而这可能是一个坏主意。如果你真的出于某种原因需要这种行为,那么海因茨的解决办法就是一条出路。