c#中的MyClass等价

本文关键字:等价 MyClass 中的 | 更新日期: 2023-09-27 18:03:27

在看这个问题时,评论者@Jon Egerton提到MyClassVB.Net中的关键字。我从未使用过它,我去找了它的文档:

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

我可以看到在某些特定的场景下,这是如何有用的。我无法想到的是,如何在c#中获得相同的行为-也就是说,确保对虚拟方法myMethod的调用实际上是针对当前类中的myMethod调用的,而不是派生的myMethod(又名在IL中,调用call而不是callvirt)?

我可能只是脑子里一片空白。

c#中的MyClass等价

根据Jon Skeet的说法,没有这样的等价物:

不,c#没有与VB等价的东西。. NET的MyClass关键字。如果要保证不调用方法的重写版本,首先需要使其非虚的。

一个明显的解决方法是:

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

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

在VB.Net中没有与MyClass关键字等价的c#。要保证不会调用方法的重写版本,只需将其设置为非虚的即可。

除了回答说它不存在,所以你必须使它非虚拟。

这里有一个很臭的(阅读:不要这样做!)解决方法。但是说真的,重新考虑一下你的设计。

基本上将任何必须调用基类的方法移动到'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");
    }
}