文3(2.014)


18 Synchronized文synchronized文は、マルチスレッドの場合に臨界領域内の文を同期させるために使用されます.Synchronized文:synchronized役割ドメイン文synchronized(式)役割ドメイン文synchronizedは、1回に1つのスレッドのみが役割ドメイン文を実行できるようにします.synchronized(式)は、式がObject参照として計算され、同時に1つのスレッドのみがこのObjectを使用して役割ドメイン文を実行できるようにします.式がインタフェースのインスタンスである場合、タイプはObjectに変換されます.
役割ドメイン文でも
異常、gotoまたはreturnが終了したためsynchronizationも解放されます.
サンプル:
synchronized { ... }
これは標準的な臨界領域を実現する.
19 Try文
例外処理はtry-catch-finally文で完了します.
Try文:
try役割ドメイン文複数Catch
try役割ドメイン文複数のCatch Finally文
try役割ドメイン文Finally文
複数のCatch:
最後のキャッチ
Catch
Catch複数のCatch
最後のCatch:
catch無作用ドメイン非空文
Catch:
catch(Catchパラメータ)無作用ドメイン非空文
Finally文:
finally無効ドメイン非空文
Catchパラメータ宣言タイプはTの変数vであり、ここでTはObjectまたはObjectから継承される.v放出された式から初期化され、Tが放出された式と同じタイプまたはそのベースクラスを有する場合.例外オブジェクトのタイプがTまたはTから継承されている場合、catch句は実行されます.
変数vがなくタイプTのみが与えられている場合、catchは依然として実行される.
CatchパラメータタイプT 1が後のタイプT 2のCatchを非表示にしている場合、エラーが発生します.たとえば、
T 1がT 2と同じタイプまたはT 2のベースクラスである場合、これはエラーです.
最後のCatchはすべての異常を捉えます.
Finally文は、goto、break、continue、return、exception、または失敗によってtry役割ドメイン文が終了するかどうかにかかわらず、常に実行されます.
例外がFinally文で生成され、Finally Statementが実行される前にスナップされなかった場合、新しい式は元の式をすべて置き換えます.
import std.stdio;
int main()
{
try
{
try
{
throw new Exception("first");
}
finally
{
writefln("finally");
throw new Exception("second");
}
}
catch(Exception e)
{
writefln("catch %s", e.msg);
}
writefln("done");
return 0;
}
出力:
finally
catch second
done
Finally文はgoto、break、continueまたはreturnのために終了することはできません.
gotoのために入ってはいけません.
Finally文にCatchesを含めることはできません.将来のバージョンでは、この制限は緩和されます.
20 Throw文
異常を投げ出す.
Throw文:
throw式;
式は計算され、結果はObject参照タイプでなければなりません.このObjectの参照は例外として投げ出される.
throw new Exception("message");
21役割ドメイン保護文(Scope Guard Statement)
役割ドメインの保護文:
scope(exit)非空または無作用ドメインブロック文
scope(success)非空または無作用ドメインブロック文
scope(failure)非空または無作用ドメインブロック文
役割ドメインの保護文現在の役割ドメインの
エンドポイントでは、非空または非アクティブドメインブロック文が実行され、アクティブドメインデーモン文が存在する場所では実行されません.
scope(exit)は、正常にアクティブドメインを終了したとき、または異常展開によって終了したときに非空または非アクティブドメインブロック文を実行します.
scope(failure)は、例外展開によって役割ドメインを終了したときに、非空または無役割ドメインブロック文を実行します.
scope(success)は、通常の役割ドメインの終了時に非空または無役割ドメインブロック文を実行します.
1つの役割ドメイン内に複数の役割ドメインデーモン文がある場合、それらの実行順序はそれらと文法的に現れます.
の順になります.autoインスタンスが訪問ドメインの終わりに解析される場合、それらも文法的に逆の順である.
シーケンスは、役割ドメインのガード文と交差します.
writef("1");
{
writef("2");
scope(exit) writef("3");
scope(exit) writef("4");
writef("5");
}
writefln();
出力:
12543
{
scope(exit) writef("1");
scope(success) writef("2");
scope(exit) writef("3");
scope(success) writef("4");
}
writefln();
出力:
4321
class Foo
{
this() { writef("0"); }
~this() { writef("1"); }
}
try
{
scope(exit) writef("2");
scope(success) writef("3");
auto Foo f = new Foo();
scope(failure) writef("4");
throw new Exception("msg");
scope(exit) writef("5");
scope(success) writef("6");
scope(failure) writef("7");
}
catch (Exception e)
{}
writefln();
出力:
0412
scope(exit)文またはscope(success)文がthrow、goto、break、continue、またはreturnによって退くことはできません.
出るgotoで入るわけにもいかない.
  2.014   
22 Volatile   
[color=red]            volatile      。[/color]

Volatile  :
volatile   
volatile ;

       。                                  
   。                                      
 。

[color=red]volatile          。     ,     synchronized   。[/color]

23 Asm文
asm文は、インラインアセンブリをサポートするために使用されます.
Asm文:
asm { }
asm{Asm命令リスト}
Asm指令リスト:
Asm指令
Asm指令Asm指令リスト
asm文を使用すると、アセンブリ言語コマンドを直接使用できます.これにより,外部のアセンブリプログラムを苦労せずに入手できる.
CPU特殊特性への直接アクセス能力.Dコンパイラが関数呼び出し規則、スタック設定などを管理してくれます
のことです.
命令のフォーマットは、もちろん、ターゲットCPUの命令セットに大きく依存するので、実装によって定義される.ただし、書式
以下の規定に従う必要があります.
•D言語と同じ記号を使用する必要があります.
•注釈の形式はD言語と共通しなければならない.
•Asm命令は';'行の最後ではなく、最後に終わります.
これらの規則は、Dのソースコードが文法的または意味的解析から独立して符号化されることを保証する.
たとえば、Intel Pentiumプロセッサの場合:
int x = 3;
asm
{
mov EAX,x;//xをレジスタEAXにロード
}
インラインアセンブリは、ハードウェアに直接アクセスするために使用できます.
int gethardware()
{
asm
{
mov EAX, dword ptr 0x1234;
}
}
一部のD実装では、DをCに翻訳する翻訳機のように、インラインアセンブリは意味がなく、必要ありません.
それを実現する.バージョン文は、このような状況に対処するために使用できます.
version (D_InlineAsm_X86)
{
asm
{
...
}
}
else
{
/* ... some workaround ... */
}
24 Pragma文
Pragma文:
Pragma無作用ドメイン文
25 Mixin文
Mixin文:
mixin(付与式);
付与式は、コンパイル時に定数文字列に評価する必要があります.この文字列のテキスト内容は1つにコンパイルする必要があります.
有効な文のリストであり、同様にコンパイルされます.
import std.stdio;
void main()
{
int j;
mixin("
int x = 3;
for (int i = 0; i < 3; i++)
writefln(x + i,++j);
");//正解
const char[] s = "int y;";
  2.014
26 Foreach Range Statement

A foreach range statement loops over the specified range. 
ForeachRangeStatement:
    Foreach (ForeachType; LwrExpression .. UprExpression ) ScopeStatement

LwrExpression:
    Expression

UprExpression:
    Expression
ForeachType declares a variable with either an explicit type, or a type inferred from LwrExpression and UprExpression. The ScopeStatement is then executed n times, where n is the result of UprExpression - LwrExpression. If UprExpression is less than or equal to LwrExpression, the ScopeStatement is executed zero times. If Foreach is foreach, then the variable is set to LwrExpression, then incremented at the end of each iteration. If Foreach is foreach_reverse, then the variable is set to UprExpression, then decremented before each iteration. LwrExpression and UprExpression are each evaluated exactly once, regardless of how many times the ScopeStatement is executed. 

import std.stdio;

int foo()
{
    writefln("foo");
    return 10;
}

void main()
{
    foreach (i; 0 .. foo())
    {
	writef(i);
    }
}

Prints:

foo0123456789

....