c#中的MyClass等价
本文关键字:等价 MyClass 中的 | 更新日期: 2023-09-27 18:03:27
在看这个问题时,评论者@Jon Egerton提到MyClass
是VB.Net
中的关键字。我从未使用过它,我去找了它的文档:
MyClass关键字的行为就像一个对象变量,它引用了最初实现的类的当前实例。MyClass类似于Me,但是对它的所有方法调用都被视为该方法是不可重写的。
我可以看到在某些特定的场景下,这是如何有用的。我无法想到的是,如何在c#中获得相同的行为-也就是说,确保对虚拟方法myMethod
的调用实际上是针对当前类中的myMethod
调用的,而不是派生的myMethod
(又名在IL中,调用call
而不是callvirt
)?
我可能只是脑子里一片空白。
根据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");
}
}