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

C# 抽象类中方法的extern、abstract和partial之间有什么区别?,c#,abstract-class,C#,Abstract Class,我之所以编写一个抽象类,是因为我想提供一些常用的方法,需要一些过于具体的方法,并允许一些方法“扩展”。在遇到编译器错误后,我想知道是否有人能解释extern、abstract和partial关键字之间的区别。它们是什么意思?我应该在何时/何地使用它们?外部: 同时使用抽象(C#引用)和外部修饰符修改同一成员是错误的。使用extern修饰符意味着该方法在C#代码之外实现,而使用抽象修饰符意味着该类中不提供该方法实现 摘要: 在类声明中使用抽象修饰符来指示一个类仅用于作为其他类的基类。标记为抽象或包

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

外部:

同时使用抽象(C#引用)和外部修饰符修改同一成员是错误的。使用extern修饰符意味着该方法在C#代码之外实现,而使用抽象修饰符意味着该类中不提供该方法实现

摘要:

在类声明中使用抽象修饰符来指示一个类仅用于作为其他类的基类。标记为抽象或包含在抽象类中的成员必须由派生自抽象类的类实现

部分:

部分类型定义允许将类、结构或接口的定义拆分为多个文件。

不太可能是您想要使用的。这意味着该方法是实现的,但是是在外部实现的,并且通常在互操作场景中使用,在互操作场景中,定义在外部代码中实现的方法

另一方面,这意味着您正在为该方法定义API,但没有提供实现。子类必须为标记为
abstract
的任何方法或属性提供实现,或者是
abstract
本身。如果您想创建一个基类并拥有一个必须由子类实现的方法或属性,那么您需要使用
abstract


类和方法只是一种编译工具。它们允许您使用多个文件来定义您的类型。这主要用于自动生成的代码(即:设计器会将设计器生成的代码放入定义分部类的单独文件中,这样您就可以“填充”缺少的部分,而无需查看实现细节)。这不太可能直接用于定义类。

一个
extern
方法通常是通过dll导入(p/Invoke)实现的-因此它确实有一个实现-您就是看不到它

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


抽象方法是必须由派生类型提供实现的方法。运行时确保,如果仍然存在未实现的抽象方法,则不会有实例,因此可以确保它们在运行时存在。

Extern将允许您通过dll导入使用方法,并由此赋予该方法一个特殊含义,即它来自外部源

部分:

  • 分部方法必须在分部类或分部中声明 结构
  • 在分部方法上不能有访问修饰符
  • 分部方法不能具有访问修饰符或虚修饰符、抽象修饰符、重写修饰符、新修饰符、密封修饰符或外部修饰符
  • 分部方法在单独声明之前不能有其实现
  • 只能定义分部方法,不能在同一分部类中声明分部方法
  • *分部方法和抽象方法最重要的区别在于分部方法的实现是可选的,而抽象方法的实现是强制性的*

    抽象方法严格要求在非抽象派生类中实现

    抽象方法的基本用途是,为了使用
    类,因为这些方法有助于有效地利用该类

    这里似乎有一些很好的答案,但我仍然会写一些文章来让它更清楚

    Extern

    来自C#规范

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

    部分

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

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

    摘要

    在方法或属性声明中使用抽象修饰符,以指示该方法或属性不包含实现。