C# 为什么使用虚拟方法

C# 为什么使用虚拟方法,c#,C#,可能重复: 在C#中,即使不将基类方法声明为虚拟方法,编译器也总是在方法签名匹配时调用最新的派生类方法。 如果没有virtual关键字,我们只会看到一条警告消息,说明将调用派生方法(现在可以使用new关键字删除该方法) 如果没有这个关键字,那么将方法声明为virtual有什么用?如果签名匹配,则调用最后一个派生类中的方法 我不明白这里有什么。出于代码可读性的目的,“虚拟”是吗? 史密斯 可以重新定义虚拟方法。在C#语言中,virtual关键字指定了一个可以在派生类中重写的方法。这使您能够添加新

可能重复:

在C#中,即使不将基类方法声明为虚拟方法,编译器也总是在方法签名匹配时调用最新的派生类方法。 如果没有virtual关键字,我们只会看到一条警告消息,说明将调用派生方法(现在可以使用new关键字删除该方法)

如果没有这个关键字,那么将方法声明为virtual有什么用?如果签名匹配,则调用最后一个派生类中的方法

我不明白这里有什么。出于代码可读性的目的,“虚拟”是吗? 史密斯

可以重新定义虚拟方法。在C#语言中,virtual关键字指定了一个可以在派生类中重写的方法。这使您能够添加新的派生类型,而无需修改程序的其余部分。因此,对象的运行时类型决定了程序的功能

你可以看到一个细节

这并不是关于“最新的衍生方法”。这是关于使用多态性时会发生什么。当您在预期父类的上下文中使用派生类的实例时,如果您不使用
virtual
/
override
,它将调用父类的方法

例如:

class A
{
    public int GetFirstInt() { return 1; }
    public virtual int GetSecondInt() { return 2; }
}

class B : A
{
    public int GetFirstInt() { return 11; }
    public override int GetSecondInt() { return 12; }
}

A a = new A();
B b = new B();

int x = a.GetFirstInt(); // x == 1;
x = a.GetSecondInt();    // x == 2;
x = b.GetFirstInt();     // x == 11;
x = b.GetSecondInt();    // x == 12;
但有以下两种方法

public int GetFirstValue(A theA)
{
   return theA.GetFirstInt();
}

public int GetSecondValue(A theA)
{
   return theA.GetSecondInt();
}
发生这种情况:

x = GetFirstValue(a);   // x == 1;
x = GetSecondValue(a);  // x == 2;
x = GetFirstValue(b);   // x == 1!!
x = GetSecondValue(b);  // x == 12

你说的是阴影。这与重写不同。请参阅,我了解“虚拟”方法的工作原理。我的观点是,没有这个关键字,除了一条警告信息外,行为是相同的。换句话说,我可以在不使用关键字的情况下获得“虚拟”方法实现的全部好处。使用这个关键词是更好的实践吗?不,事情的运作方式完全不同<代码>虚拟不是语法糖。请阅读我的回复。@user1492518请看一看示例。谢谢您提供了这么好的示例。
x = GetFirstValue(a);   // x == 1;
x = GetSecondValue(a);  // x == 2;
x = GetFirstValue(b);   // x == 1!!
x = GetSecondValue(b);  // x == 12