C#中的MyClass等价物

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

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

在某些特定场景中,我可以看到它有多么有用。 我无法想到的是,你如何在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() MyClass.MyMethod()

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

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

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

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