抽象类中方法的extern,abstract和partial之间有什么区别?

Pro*_*ope 22 c# abstract-class

我正在编写一个抽象类,因为我想提供一些常用的方法,需要一些过于具体的方法,并允许一些方法"扩展".遇到编译错误后,我想知道是否有人能解释extern,abstract和partial关键字之间的差异.他们的意思是什么,我应该在何时/何地使用它们?

Ree*_*sey 30

extern不太可能是你想要使用的东西.这意味着该方法已实现,但在外部实现 - 通常用于您在定义外部代码中实现的方法的互操作方案中.

另一方面,抽象意味着您要为方法定义API,但不提供实现.子类必须为标记的任何方法或属性提供实现abstract,或者abstract本身.如果要创建基类并且具有必须由子类实现的方法或属性,则需要使用abstract.

部分类和方法仅仅是一种编译工具.它们允许您使用多个文件来定义类型.这主要用于自动生成的代码(即:设计人员将设计器生成的代码放入定义分部类的单独文件中,因此您可以"填写"缺失的部分而无需查看实现细节).这不太可能直接用于定义类.


Sta*_*ble 6

这里似乎有一些很好的答案,但我仍然会写信以使其更清楚

外部

来自 C# 规范

当方法声明包含 extern 修饰符时,该方法被称为外部方法。外部方法在外部实现,通常使用 C# 以外的语言。由于外部方法声明不提供实际的实现,因此外部方法的方法体仅由分号组成。外部方法可能不是通用的。extern 修饰符通常与 DllImport 属性结合使用,允许 DLL(动态链接库)实现外部方法。执行环境可以支持其他机制,由此可以提供外部方法的实现。当外部方法包含 DllImport 属性时,方法声明还必须包含 static 修饰符。 在此输入图像描述

部分的

分部方法的签名在分部类型的一部分中定义,其实现在该类型的另一部分中定义。部分方法使类设计者能够提供类似于事件处理程序的方法挂钩,开发人员可以决定是否实现。如果开发人员不提供实现,编译器会在编译时删除签名。以下条件适用于部分方法:

  • 部分类型的两个部分中的签名必须匹配。
  • 该方法必须返回 void。
  • 不允许使用访问修饰符。部分方法是隐式私有的。

以下示例显示了在分部类的两个部分中定义的分部方法:

在此输入图像描述

抽象的

在方法或属性声明中使用abstract修饰符来指示该方法或属性不包含实现。

抽象方法具有以下特点:

  • 抽象方法隐式地是虚拟方法。
  • 抽象方法声明只允许在抽象类中
  • 因为抽象方法声明不提供实际的实现,所以没有方法体;方法声明仅以分号结尾,并且签名后面没有大括号 ({ })。
  • 在抽象方法声明中使用 static 或 virtual 修饰符是错误的。

在此示例中,类 Square 必须提供 Area 的实现,因为它派生自 ShapesClass:

在此输入图像描述

来源

希望这有助于更好地理解,祝编码愉快!


Mar*_*ell 5

一个extern方法通常是通过dll-import(P/Invoke)实现的 - 所以它确实有一个实现 - 你只是看不到它.

一种partial方法主要用于代码生成,作为将功能注入生成的代码的方法.它们是可选的,仅限于私有,只有在您提供另一半时才存在.因此,在返回/输出值方面也存在一些限制,以确保明确分配.如果没有实现,编译器将完全省略对部分方法的调用.

一种abstract方法是必须由派生类型提供实现.如果仍有未实现的抽象方法,运行时可确保您不能拥有实例,因此可以确保它们将在运行时存在.