【问题标题】:MyClass equivalent in C#C# 中的 MyClass 等效项
【发布时间】:2011-07-26 14:12:57
【问题描述】:

在查看this question 时,评论者@Jon Egerton 提到MyClassVB.Net 中的一个关键字。没用过,我去找了documentation

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

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

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

【问题讨论】:

  • 当然,您可以使用反射和DynamicMethod 和自定义IL 生成(使用call 而不是您建议的callvirt)来做到这一点,但您最终会得到很多首先可能是一个坏主意的丑陋代码。如果您出于某种原因确实需要这种行为,那么 Heinzi 的解决方法就是您要走的路。

标签: c# vb.net


【解决方案1】:

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

不,C# 没有等效于 VB.NET 的 MyClass 关键字。如果您想保证不调用方法的覆盖版本,则需要首先使其成为非虚拟的。

一个明显的解决方法是:

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

private void MyLocalMethod()
{
    ...
}

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

【讨论】:

  • 如果你正在实现一个基类,这似乎很好,如果你是继承和继承自,那就不好了。
  • @Damien:是的。幸运的是,解决这个限制并不难(见我的编辑)。
【解决方案2】:

在 VB.Net 中没有与 MyClass 关键字等效的 C#。为保证不会调用方法的覆盖版本,只需将其设为非虚拟即可。

【讨论】:

  • 如果你想让它被覆盖?还是说这是不可能的?
  • @George Duckett 据我所知是的,这是不可能的。
【解决方案3】:

除了回答说它不存在,所以你必须让它成为非虚拟的。

这是一个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");
    }
}

【讨论】:

    猜你喜欢
    • 2012-07-31
    • 2010-10-20
    • 2013-12-09
    • 1970-01-01
    • 2014-05-08
    • 2023-03-09
    • 2013-05-24
    • 2012-09-15
    相关资源
    最近更新 更多