我正在编写一个抽象类,因为我想提供一些常用的方法,需要一些过于具体的方法,并允许一些方法“扩展”。遇到编译器错误后,我想知道是否有人可以解释 extern , abstract 和 partial 关键字之间的差异。他们的意思是什么,我应该在何时/何地使用它们?
答案 0 :(得分:28)
extern不太可能是你想要使用的东西。这意味着该方法已实现,但在外部实现 - 通常用于您在定义外部代码中实现的方法的互操作场景中。
另一方面, abstract意味着您要为方法定义API,但不提供实现。子类必须为标记为abstract
的任何方法或属性提供实现,或者为abstract
本身提供。如果要创建基类并且具有必须由子类实现的方法或属性,则需要使用abstract
。
partial类和方法仅仅是一种编译工具。它们允许您使用多个文件来定义类型。这主要用于自动生成的代码(即:设计人员将设计器生成的代码放入定义分部类的单独文件中,因此您可以“填写”缺失的部分而无需查看实现细节)。这不太可能直接用于定义类。
答案 1 :(得分:5)
extern
方法通常是通过dll-import(P / Invoke)实现的 - 所以它确实有一个实现 - 你只是看不到它。
partial
方法主要用于将代码生成作为向生成的代码注入功能的方法。它们是可选的,仅限私人,如果您提供另一半, 仅存在 。因此,在返回/输出值方面也存在一些限制,以确保明确分配。如果没有实现,编译器将完全省略对部分方法的调用。
abstract
方法是必须由派生类型提供实现的方法。如果仍有未实现的抽象方法,运行时可确保您不能拥有实例,因此可以确保它们将在运行时存在。
答案 2 :(得分:4)
Extern将允许您通过dll-import使用方法,因此您对该方法赋予特殊含义,它来自外部来源
部分:
* 最重要的部分和抽象方法的区别是部分实现是可选的,但抽象方法的实现是强制性的*
抽象方法严格要求在非抽象派生类
中实现抽象方法的基本用法是,它们需要实现才能使用 该类,因为这些方法有助于有效地利用该类
答案 3 :(得分:3)
外部:http://msdn.microsoft.com/en-us/library/e59b22c5%28v=vs.80%29.aspx
将抽象(C#Reference)和extern修饰符一起用于修改同一成员是错误的。使用extern修饰符意味着该方法在C#代码之外实现,而使用abstract修饰符意味着该类中没有提供方法实现。
摘要:http://msdn.microsoft.com/en-us/library/sf985hc5%28v=vs.80%29.aspx
在类声明中使用abstract修饰符来指示一个类仅用于其他类的基类。标记为抽象或包含在抽象类中的成员必须由派生自抽象类的类实现。
部分:http://msdn.microsoft.com/en-us/library/wbx7zzdd%28v=vs.80%29.aspx
部分类型定义允许将类,结构或接口的定义拆分为多个文件。
答案 4 :(得分:1)
这里似乎有一些很好的答案,但我仍然会写得更清楚
外部
根据C#规范
当方法声明包含extern修饰符时,该方法被称为外部方法。外部方法通常是使用C#以外的语言在外部实现的。由于外部方法声明不提供任何实际实现,因此外部方法的方法主体仅由分号组成。外部方法可能不是通用的。 extern修饰符通常与DllImport属性结合使用,从而允许通过DLL(动态链接库)实现外部方法。执行环境可以支持其他机制,从而可以提供外部方法的实现。当外部方法包含DllImport属性时,方法声明还必须包含静态修饰符。
部分
部分方法的签名在部分类型的一部分中定义,其实现在类型的另一部分中定义。部分方法使类设计人员可以提供类似于事件处理程序的方法挂钩,开发人员可以决定是否实现。如果开发人员未提供实现,则编译器会在编译时删除签名。以下条件适用于部分方法:
以下示例显示了在部分类的两个部分中定义的部分方法:
摘要
在方法或属性声明中使用abstract修饰符表示该方法或属性不包含实现。
抽象方法具有以下功能:
在此示例中,Square类必须提供Area的实现,因为它派生自ShapesClass:
希望这有助于更好地理解,祝您编程愉快!