C# 使用基指针调用方法的优点

C# 使用基指针调用方法的优点,c#,C#,我在基类中实现了一个方法,如下所示: class A { protected void f1() { } } class A1 : A { public void f2() { //Simple Calling f1(); //Calling using base pointer base

我在基类中实现了一个方法,如下所示:

  class A
    {
        protected void f1()
        {

        }
    }
    class A1 : A
    {
        public void f2()
        {
           //Simple Calling
            f1();
           //Calling using base pointer
            base.f1();
        }

    }

简单调用和使用基指针调用有什么区别?这两种方法的优点是什么?

在这种情况下,没有。但想象一下:

class A 
{ 
    public virtual void F() 
    {
    } 
}
class B : A 
{ 
   public override void F() 
   { 
       Console.WriteLine("B"); 
   } 
   public void F2() 
   { 
       F(); /*output: B*/ 
       base.F() /*no output*/ 
   } 
}
这就是base开始变得有用的地方。

当您重写虚拟方法时,this.f1或干脆f1与base.f1之间的区别变得相关:

class A
{
    public virtual void F()
    {
        Console.WriteLine("A");
    }
}

class B : A
{
    public override void F()
    {
        Console.WriteLine("B");
    }

    void Test()
    {
        F(); // Prints "B"
        this.F(); // Prints "B"
        base.F(); // Prints "A"
    }
}

只有在重载/隐藏了基类中定义的方法时,它才有用

class A1 : A
{
    public void f2()
    {
       //Simple Calling
        f1();
       //Calling using base pointer
        base.f1();
    }

    protected new void f1()
    {
        // I won't be called
    }

}

当链接构造函数时,或者当您希望访问成员方法、属性、基类中已在当前类中重写或隐藏的任何内容时,base关键字用于引用基类。 比如说,

class A {
    protected virtual void Foo() {
        Console.WriteLine("I'm A");
    }
}

class B : A {
    protected override void Foo() {
        Console.WriteLine("I'm B");
    }

    public void Bar() {
        Foo();
        base.Foo();
    }
}
根据这些定义

new B().Bar();
将输出

I'm B
I'm A

如果覆盖f1,则需要使用它来区分它们

class A
{
    protected virtual void f1() {   }
}
class A1 : A
{
    protected override void f1() {   }

    public void f2()
    {
       //Simple Calling
        f1();                 <--- this will call to overrided f1 in this class
       //Calling using base pointer
        base.f1();
    }

}

在你的例子中没有区别。但是,考虑F1是虚拟的情况,它在A1类中有另一种实现:

f1不同于base.f1。使用new关键字在派生类中隐藏基实现时也会出现相同的情况:

protected new void f1()
{
    Console.WriteLine("A1");
}

当您想扩展基本方法的功能,但不想复制它时,也很有用:

class A
{
    public virtual void F()
    {
        Console.WriteLine("A");
    }
}

    class B : A
    {
        public override void F()
        {
            base.F();
            Console.WriteLine("B");
        }

        void Test()
        {
            F(); // Prints "A B"
        }
    }

快速提示-除非您使用不安全的代码,否则默认情况下C中不存在指针,您基本上使用的是base关键字。在B类中F不应该标记为override而不是virtual吗?@MarcinJuraszek是的,我的错。
class A
{
    public virtual void F()
    {
        Console.WriteLine("A");
    }
}

    class B : A
    {
        public override void F()
        {
            base.F();
            Console.WriteLine("B");
        }

        void Test()
        {
            F(); // Prints "A B"
        }
    }