首页 后端开发 C#.Net教程 C# 2.0 Specification (四)

C# 2.0 Specification (四)

Jan 03, 2017 am 10:19 AM

这段比较短就先干掉了:)

23不完整类型

23.1不完整类型声明

新类型修饰符partial 用于在多个部分中定义一个类型。为了确保和现存程序的兼容性,这个修饰符和其他修饰符(比如get和set)是不同的,它不是一个关键字,并且它必须紧邻出现在关键字class ,struct或者interface之前。

l class-declaration(类声明)
attributes opt class-modifiers opt partialopt class identifier type-parameter-list opt
class-base opt type-parameter-constraints-clausesopt class-body ;opt
(特性 可选 类修饰符 可选 partial可选 class 标识符
类型参数列表 可选 :基类 可选 类型参数约束语句 可选 类体;可选)
l struct-declaration:(结构声明)
attributesopt struct-modifiersopt partialopt struct identifier type-parameter-listopt
struct-interfacesopt type-parameter-constraints-clausesopt struct-body ;opt
(特性 可选 结构修饰符 可选 partial 可选 struct 标识符
类型参数列表 可选
结构接口 可选 类型参数约束语句 可选
结构体;可选 )
l interface-declaration:(接口声明)
attributesopt interface-modifiersopt partialopt interface identifier type-parameter-listopt
interface-baseopt type-parameter-constraints-clausesopt interface-body ;opt
(特性可选 接口修饰符 可选 partial 可选 interface 标识符
类型参数列表 可选
基接口 可选 类型参数约束语句 可选
接口体 ;可选)
登录后复制

不完整类型声明的每个部分都必须包含partial修饰符,并且和其他部分必须被声明在相同的命名空间。partial修饰符表明该类型声明的附加部分可以存在于其他某个地方,但这种附加部分的存在并不是必需的;在一个单一类型声明中包含partial修饰符也是合理的。



不完整类型的所有部分必须放在一起编译,这样它们就可以在编译时被融合。特别的是,不完整类型不容许对已经被编译的类型进行扩展。



嵌套类型(nested type)可以通过使用partial修饰符而声明在多个地方。典型的情况是,包含类型(也就是包含嵌套类型的类型)同样使用partial声明,而嵌套类型的各个部分也在包含类型的不同部分中声明。

partial修饰符不能用在委托或枚举声明中。

23.1特性

不完整类型的特性通过以不定的(unspecified)顺序组合各个部分的特性而确定。如果一个特性被放在不完整类型的多个部分,它等价于在该类型上多次指定该特性。例如,这两个部分

[Attr1, Attr2("hello")]
partial class A {}
[Attr3, Attr2("goodbye")]
partial class A {}
等价于如下声明。
[Attr1, Attr2("hello"), Attr3, Attr2("goodbye")]
class A {}
登录后复制

类型参数上的特性也以相同的风格组合。

23.1.2修饰符

当不完整类型声明包含访问说明(public,protected,internal和private)时,它必须与其它部分的访问说明一致。如果不完整类型的各个部分都不包含访问说明,该类型将被赋予适当的默认可访问性(§3.5.1)。

如果嵌套类型的一个或多个不完整声明包含new修饰符,并且如果嵌套类型隐藏了一个继承成员,将不会有任何警告。(§3.7.12)



如果类的一个或多个不完整声明包含abstract修饰符,那么这个类就是抽象的(§10.1.1.1),反之就是非抽象的。



注意,一个类不能同时既是抽象的又是密封的(sealed)。


当unsafe修饰符被用于一个不完整类型声明时,只有特定的部分被认为是不安全上下[unsafe contex(§18.1))]。

23.1.3类型参数和约束

如果泛型类型在多个部分被声明,每个部分都必须说明类型参数。每个部分都必须有相同数量的类型参数,并且对于每个类型参数必须有相同的名字和顺序。

当不完整泛型声明包含类型参数约束(where 语句),该约束必须和其他部分的约束一致。特别的是,包含约束的每个部分必须具有相同集合类型参数的约束,并且对于每个类型参数,

类、接口和构造函数约束的集合必须是相同的。如果不完整泛型的任何部分都没有指定约束,类型参数就被认为是不带约束的。
示例

partial class Dictionary<K,V>
where K: IComparable<K>
where V: IKeyProvider<K>, IPersistable
{
...
}
partial class Dictionary<K,V>
where V: IPersistable, IKeyProvider<K>
where K: IComparable<K>
{
...
}
partial class Dictionary<K,V>
{
...
}
登录后复制

是正确的,因为这些包含约束的部分有效地指定了类、接口的相同集合,以及相应相同集合的类型参数的构造函数约束。

23.1.4基类

当不完整类声明包含基类说明时,它必须与包含基类说明的所有其他部分一致。如果不完整类声明的任何部分都不包含基类声明,那么基类将是System.Object(§10.1.2.1)。

23.1.5基接口

在多个部分中声明的类型的基接口集合,是在各个部分中指定的基接口的联合。一个特定的基接口在每个部分中只能被命名一次,但可以在多个部分中命名相同的基接口。但对于任何给出的基接口成员只能有唯一的实现。
在例子

partial class C: IA, IB {...}
partial class C: IC {...}
partial class C: IA, IB {...}
中类C的基接口是IA,IB和IC。
登录后复制

通常,在接口声明的部分中提供接口的实现;但这不是必需的。一个部分可以为声明在另一个部分中的接口提供实现。

partial class X
{
int IComparable.CompareTo(object o) {...}
}
partial class X: IComparable
{
...
}
登录后复制

23.1.6成员

声明在多个部分中的类型的成员只是在各个部分中声明的成员的联合。类型声明的所有部分的内容共享相同的声明空间(§3.3),并且每个成员(§3.7)的作用域扩展到所有部分的内容。任何成员的所有可访问域总是包含封闭类型的所有部分;在一个部分中声明的private成员可以随意的在另一个部分访问。在一个类型的多个部分中声明相同的成员将造成编译时错误,除非该成员是一个带有partial修饰符的成员。

partial class A
{
int x; // 错误, 不能多次声明x
partial class Inner // Ok, Inner 是不完整类型
{
int y;
}
}
partial class A
{
int x; // 错误,不能多次声明x
partial class Inner // Ok, Inner是不完整类型
{
int z;
}
}
登录后复制

尽管一个类型中成员的次序对于C#代码并不是太重要,但在面对其他语言和环境时却可能是很重要的。在这样的情况下,在多个部分中声明的类型内成员次序将是未定义的。

23.2名字绑定

虽然可扩展类型的每个部分必须声明在相同的命名空间,但这些部分也可以写在不同的命名空间中。为此,对于各个部分可以使用不同的using指令(§9.3)。当在一个部分中解释简单名字(§7.5.2)时,只有包含该部分的命名空间using 指令被考虑。这将使得在不同部分的相同标识符表示不同的意义。

namespace N
{
using List = System.Collections.ArrayList;
partial class A
{
List x; // x具有类型 System.Collections.ArrayList
}
}
namespace N
{
using List = Widgets.LinkedList;
partial class A
{
List y; // y 具有类型 Widgets.LinkedList
}
}
登录后复制

以上就是C# 2.0 Specification (四)的内容,更多相关内容请关注PHP中文网(www.php.cn)!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

使用 C# 的活动目录 使用 C# 的活动目录 Sep 03, 2024 pm 03:33 PM

使用 C# 的 Active Directory 指南。在这里,我们讨论 Active Directory 在 C# 中的介绍和工作原理以及语法和示例。

C# 序列化 C# 序列化 Sep 03, 2024 pm 03:30 PM

C# 序列化指南。这里我们分别讨论C#序列化对象的介绍、步骤、工作原理和示例。

C# 中的随机数生成器 C# 中的随机数生成器 Sep 03, 2024 pm 03:34 PM

C# 随机数生成器指南。在这里,我们讨论随机数生成器的工作原理、伪随机数和安全数的概念。

C# 数据网格视图 C# 数据网格视图 Sep 03, 2024 pm 03:32 PM

C# 数据网格视图指南。在这里,我们讨论如何从 SQL 数据库或 Excel 文件加载和导出数据网格视图的示例。

C# 中的模式 C# 中的模式 Sep 03, 2024 pm 03:33 PM

C# 模式指南。在这里,我们讨论 C# 中模式的介绍和前 3 种类型,以及其示例和代码实现。

C# 中的质数 C# 中的质数 Sep 03, 2024 pm 03:35 PM

C# 素数指南。这里我们讨论c#中素数的介绍和示例以及代码实现。

C# 中的阶乘 C# 中的阶乘 Sep 03, 2024 pm 03:34 PM

C# 阶乘指南。这里我们讨论 C# 中阶乘的介绍以及不同的示例和代码实现。

c#多线程和异步的区别 c#多线程和异步的区别 Apr 03, 2025 pm 02:57 PM

多线程和异步的区别在于,多线程同时执行多个线程,而异步在不阻塞当前线程的情况下执行操作。多线程用于计算密集型任务,而异步用于用户交互操作。多线程的优势是提高计算性能,异步的优势是不阻塞 UI 线程。选择多线程还是异步取决于任务性质:计算密集型任务使用多线程,与外部资源交互且需要保持 UI 响应的任务使用异步。

See all articles