我应该在C#中显式地将`GetObjectData`方法设置为虚拟吗?

我应该在C#中显式地将`GetObjectData`方法设置为虚拟吗?,c#,serialization,interface,deserialization,virtual,C#,Serialization,Interface,Deserialization,Virtual,我应该在C#中显式地使GetObjectData方法虚拟吗 在CLR via C#一书中,我遇到了以下摘录: 如果派生类型中没有任何附加字段,因此没有特殊的 序列化/反序列化需要,那么您根本不必实现ISerializable像所有人一样 接口成员,GetObjectData是虚拟的,将被调用以正确序列化对象。在里面 此外,格式化程序将特殊构造函数视为“虚拟化”。也就是说,在反序列化过程中,格式化程序将检查它试图实例化的类型。如果该类型不提供特殊构造函数,那么格式化程序将扫描基类,直到找到一个实现

我应该在C#中显式地使
GetObjectData
方法虚拟吗

CLR via C#一书中,我遇到了以下摘录:

如果派生类型中没有任何附加字段,因此没有特殊的 序列化/反序列化需要,那么您根本不必实现
ISerializable
像所有人一样 接口成员,
GetObjectData
是虚拟的,将被调用以正确序列化对象。在里面 此外,格式化程序将特殊构造函数视为“虚拟化”。也就是说,在反序列化过程中,格式化程序将检查它试图实例化的类型。如果该类型不提供特殊构造函数,那么格式化程序将扫描基类,直到找到一个实现特殊构造函数的基类


正如我所知(),默认情况下接口方法不是虚拟的。那么,为什么我们要说下面的像所有接口成员一样,
GetObjectData
是虚拟的?这是否意味着当存在任何与序列化/反序列化相关的接口方法时,我们应该将其设置为虚拟的,还是它意味着不同的东西?

这意味着该接口上的
GetObjectData
方法是虚拟的。默认情况下,C#接口上的所有方法都是虚拟的

例如,如果有一个接口:

interface IMyInterface
{ 
    void MyMethod();
}
.class interface nested private auto ansi abstract IMyInterface
{
    // Methods
    .method public hidebysig newslot abstract virtual 
        instance void MyMethod () cil managed 
    {
    } // end of method IMyInterface::MyMethod

} // end of class IMyInterface
接口的IL:

interface IMyInterface
{ 
    void MyMethod();
}
.class interface nested private auto ansi abstract IMyInterface
{
    // Methods
    .method public hidebysig newslot abstract virtual 
        instance void MyMethod () cil managed 
    {
    } // end of method IMyInterface::MyMethod

} // end of class IMyInterface
MyMethod
默认标记为
virtual

这并不意味着当接口由类实现时,类方法仍然是虚拟的。如果方法需要是虚拟的,则必须显式地将
virtual
关键字添加到实现类的方法中,使其成为虚拟的

更新

MyMethod
的默认实现的IL:

.method public final hidebysig newslot virtual 
        instance void MyMethod () cil managed 
    {
        // Method begins at RVA 0x2050
        // Code size 2 (0x2)
        .maxstack 8

        IL_0000: nop
        IL_0001: ret
    } // end of method MyClass::MyMethod

默认情况下,实现是final和virtual,这意味着默认情况下,在派生类中无法重写该方法。将
virtual
关键字添加到实现方法将删除
final

Oh。非常感谢。关于接口方法在实现之前是虚拟的,而在实现时是非虚拟的(默认情况下),这一部分确实令人困惑。:)Hm.作者在摘录语句中以这样一种方式进行加粗,就好像这些方法在实现之后仍然是虚拟的(默认情况下)。这让我更加困惑。也许你碰巧理解了这句话到底传达了什么?:)好。。。这也是事实。该方法一旦实现,默认情况下为
final
virtual
。如果您对此感兴趣,可以使用ILSpy反编译一些C代码:)