特征
特征指示器: 特征 : 特征 声明定义块 编译器指令 ; 其他特征指示器: 其他特征: 其他特征 声明定义块 其他特征 声明定义块 else 声明定义块 特征: 链接特征 对齐特征 编译器指令 deprecated private package protected public export static final override abstract const auto 其他特征: 调试特征 版本特征 声明定义块 声明定义 { } { 声明定义 }
AttributeSpecifier: Attribute : Attribute DeclDefBlock Pragma ; AttributeElseSpecifier: AttributeElse : AttributeElse DeclDefBlock AttributeElse DeclDefBlock else DeclDefBlock Attribute: LinkageAttribute AlignAttribute Pragma deprecated private package protected public export static final override abstract const auto AttributeElse: DebugAttribute VersionAttribute DeclDefBlock DeclDef { } { DeclDefs }特征用来修饰所声明的一个或多个方法。通常的形式是:
attribute declaration; // 影响这个声明 attribute: // 影响直到下一个‘}’的所有声明 declaration; declaration; ... attribute // 影响语句块中所有的声明 { declaration; declaration; ... }对于出现在可选的 else 子句中的声明:
attribute declaration; else declaration; attribute // 影响语句块中所有的声明 { declaration; declaration; ... } else { declaration; declaration; ... }
链接特征
链接特征: extern extern ( 链接类型 ) 链接类型: C D Windows Pascal
LinkageAttribute: extern extern ( LinkageType ) LinkageType: C D Windows PascalD 提供了一种方便的调用 C 函数和操作系统 API 函数的方法,因为对这两者的兼容都是必要的。 链接类型 是大小写敏感的,并且可以由实现扩展(它们不是关键字)。 C 和 D 是必须提供的,其他的含义由实现定义。 实现注记:对于 Win32 平台来说,应该支持 Windows 和 Pascal 。
通过下面的方式指定 C 函数调用约定:
extern (C): int foo(); // 使用 C 约定调用 foo()D 调用约定是:
extern (D):或者:
extern:Windows API 调用约定是:
extern (Windows): void *VirtualAlloc( void *lpAddress, uint dwSize, uint flAllocationType, uint flProtect );
对齐特征
对齐特征: align align ( 整数 )
AlignAttribute: align align ( Integer )指定结构成员如何对齐。如果只有 align ,则设为默认值,即使用同对应的 C 编译器相同的默认对齐值。 整数 指定了对齐的值,它的行为同对应的 C 编译器使用非默认的对齐值时相同。如果值为 1 就表示不进行对齐;成员将紧挨在一起。
废弃特征
我们经常会将库中的某一特征标记为废弃,同时仍然保留它以保持向后兼容。这类声明可以被标记为废弃,这意味着可以通过设置编译器选项,在遇到引用这类声明的代码时产生错误:deprecated { void oldFoo(); }实现注记: 编译器应该有一个选项用来指定是否被废弃的特征可以通过编译。
保护特征
用于保护的特征有 private、 package、 protected、 public 和 export 。private 意味着只有本类内的及本类所在模块内的成员可以访问被保护的成员。私有成员不能被重写。私有模块成员等价于 C 程序中的 static 声明。
package 扩展了 private 的访问权,这样包中的成员就可以访问位于同一包内的其他的模块内的成员。如果包是嵌套的话,这条规则只应用于最内层的包。
protected 意味着只有本类内或者派生类内的成员或者本类所在模块内的成员可以访问被保护的成员。protected 不能用于模块成员。
public 意味着可执行程序中的任何代码都可以访问这个成员。
export 意味着可执行程序外的任何代码都可以访问这个成员。export 的意思也就是从 DLL 中导出定义。
Const 特征
constconst 特征声明可以在编译时估值的常量。例如:
const int foo = 7; const { double bar = foo + 6; }
Override 特征
overrideoverride 特征用于虚函数。这意味着必须用具有同基类中相同的名字和参数覆盖这个函数。当某个基类的成员函数的参数变化的时候,override 特征可以用来捕获错误。这样所有派生类会得知必须更新它们的覆盖函数。
class Foo { int bar(); int abc(int x); } class Foo2 : Foo { override { int bar(char c); // 错误,Foo 中没有 bar(char) int abc(int x); // ok } }
Static 特征
staticstatic 特征用于函数和数据。这意味着这个声明不会应用于一个对象的特定实例,而应用于对象的类型。换句话说,这意味着没有 this 引用。当用于其他声明时, static 会被忽略。
class Foo { static int bar() { return 6; } int foobar() { return 7; } } ... Foo f = new Foo; Foo.bar(); // 得到 6 Foo.foobar(); // 错误,没有 Foo 的实例 f.bar(); // 得到 6 f.foobar(); // 得到 7静态函数决不会是虚的。
在整个程序中,静态数据只有一个实例,而不是每个对象有一个。
static 与在 C 中不同,它并不同时意味着它的作用域局限在本文件中。你可以使用 private 特征做到这一点。例如:
module foo; int x = 3; // x 是全局的 private int y = 4; // y 是 foo 中局部的static 可以被应用于构造函数和析构函数,这样就得到静态构造函数和静态析构函数。
Auto 特征
autoauto 特征用于局部变量和类声明。对于类声明来说,auto 特征创建了一个 auto 类。对于局部声明来说, auto 实现了 RAII(资源获得即初始化)协议。这意味着当指向对象的 auto 引用脱离作用域的时候会自动调用它的析构函数。即使是由于抛出了异常而脱离作用域也会调用析构函数,因此 auto 用来保证清除。
auto 不能被用于全局的、静态的数据成员或者用 inout 或 out 修饰的参数。auto 的数组是非法的,函数返回值也不允许是 auto 的。如果不是初始化的话,是不允许对 auto 赋值的。注记:如果将来出现了某种强制性的要求,这些限制可能会放松。