DelphiPrism

Delphi Prism vs. CSharp

原文:Delphi Prism vs. CSharp。補足修正あり。

注意:CDN など DelWiki 以外に転載される可能性があります。承諾できない人は編集しないでください。

Delphi PrismとC#が明らかに違うのは、Delphi機能パック(Blackfish SQLなど)の追加機能とオブジェクト・パスカルに基づく文法です。これらはDelphi for Win32に慣れた開発者にとっては非常に魅力的です。しかしながら、コンパイラは広範に渡る非常に有用な拡張もまた追加しています。

以下はDelphi Prismでは利用可能で、C#では利用できない言語機能のリストです:

Sets

Setは同じ型の順序数のコレクションです。Setsはグループを成す値を格納しアクセスする便利な方法です。

Type
  MySet1 = set of 1000; // set with elements 0..999
  MySet2 = set of (Abc, Def, Ghi);  // implicit enums

並列サポート

  • Futures?
  • Parallel Loops?

あるメソッドにAsync?ディレクティブを設定すると、それは自動的に他のスレッドで実行されます。もしそのメソッドが値を返したら、それらはfuturesになります。

method ThreeNode.Sum: Int32;
begin
  var l: future Int32 := async Left.Sum;
  var r: Int32 := Right.Sum;
  result r+l;
end;

コロン演算子

これは私達がnullableをサポートする為に欠かせません。しかし、これは一般的なコーディングに驚くほど有用な機能でもあります。つまり、"."を使ってメンバーにアクセスして、nilだった時はNullReferenceExceptionを取得する代わりに、":"を使うとその呼び出しではnilはスキップされます(返り値はnil自身になります)。例えば:

IDisposable(SomeObject):Dispose; // インターフェースが実装されている場合だけdisposeが呼び出されます。
x := Button:Parent:Parent:Parent // あるコントロールの3番目のParerntにアクセスする。階層のどれかがnilの可能性があります。

プロパティ・アクセッサのインライン化

クラス宣言の中でシンプルなプロパティを定義します。余分なsetterやgetterはありません。

property Foo: String; // ローカルフィールドが暗示されています。
property Right: Int32 read Left+Width; // リーダーの表現はこの行で与えられます。

クラス契約

"public invariants"(パブリックな不変式)をクラスに宣言できます。これは毎回、非Privateメソッドがexitする時にクラスの内部構造の検査を強制します("private invariants"(プライベートな不変式)も定義出来ます。これはPrivateメソッドがexitする時に検査を強制します)。不変式はboolean形式のリストです。正常な状態である為には、クラスに対して全て"true"でなければなりません。

type
  MyClass = class;
  public
    ... some methods or properties
  public invariants
    fField1 > 35;
    SomeProperty = 0;
    SomeBoolMethod() and not (fField2 = 5);
  private invariants
    fField > 0;
  end;

メソッド本体の前に"require"、後に"ensure"を追加できます。事前・事後条件を定義する為です。この場合もやはり、それらはtrueである事をチェックされるbooleanステートメントです。

method MyObject.Add(aItem: ListItem);
require
  assigned(aItem);
begin
  InternalList.Add(aItem);
ensure
  Count = old Count +1;
End;

クラス参照

"class of X"型と仮想クラスメソッドを定義します(Delphi for Win32と似ています)。

"implies" 演算子

これが主に役に立つのは不変式や事前/事後条件に対してです。基本的に、一番目がtrueの場合だけ、二番目の部分はtrueである必要があります。もし最初がfalseなら、全体の表現はtrueです。これはおかしな事に聞こえます、しかし検討すると

require
   assigned(Customer) implies Customer.CreditRatio > 5;

これを翻訳します。

require
   (NOT assigned(Customer)) OR (Customer.CreditRatio > 5);

上記はずっと読みやすくなります。

"case type of"

特定のオブジェクトの型によって異なるケースを実行するswitch/caseステートメントを書いてみましょう。例えば。

case type MyControl of:
  Edit: // 何かをします。
  Button: // 何か他の事をします。
end;

プロパティ通知

これは定型的なコードを省略します。"notify"キーワードをプロパティにディレクティブとしてくっつけると("virtual"のように)、コンパイラはプロパティ通知の動作に必要な全てのインフラとインターフェースを生成します(C#では、開発者はgetters/settersを実装して、クラスへのインターフェースを追加するなどの必要があります)。訳者注:具体的にはPropertyChangedイベントが発動します。

type
  ValueClass = class
  public
    property Value: Integer; notify;
    property Name: string; notify 'ValueName';
  end;

拡張されたNullable型

C#と違って、Delphi PrismのコンパイラはNullable型を完全サポートします。開発者はそのメンバーを呼び出して、式の中で使う事が出来ます。Nullable式の拡張サポートがあります。算術式を導く部分が"nullable"だったら、式全体がnullableになります。nullの部分があれば、式全体はnullになります。例えば:

x: nullable Int32;
y: Int;
var a := x+y; // 結果はnullableなInt32です。
var b := 5*x; // xがnullなら、bはそーです。

改良された'for each'ループ

for each matching x: Button in Controls do    // buttonのループだけ実行します。
// use i to count; also type of x is inferred automatically from type of "Controls", if its a generic enum for each x in Controls index i do    

'locked'ディレクティブ

lockedディレクティブによってメソッド、イベントやプロパティを暗黙的にスレッドセーフと宣言する事が出来ます。

method DoItSafely; locked;

拡張されたコンストラクタ呼び出し

constructor呼び出しの一部としてプロパティを設定します。これは開発者がローカル参照を割り当てていないなら、とても役に立ちます。例えば:

Controls.Add(new Button(Width := 100; Height := 50));

これがなかったら、開発者はbuttonの一時変数を必要とします。

Booleanの二重比較

if 0 <= x < Count then //...

イテレータの委譲

yieldキーワードは2番目のシーケンスへのイテレータの委譲をサポートします。

var MoreValues := [3,4,5,6]; // Int32配列。シーケンスとして作動可。

method MyIterator: sequence of Int32;
begin
  yield 1; // "1"をシーケンスに追加します。
  yield 2; // "2"をシーケンスに追加します。
  yield MoreValues; // "3"から"6"をシーケンスに追加します。
  yield 7; // "7"をシーケンスに追加します。
end;

Emptyメソッド

メソッドのインターフェース宣言に'empty'ディレクティブを用意しました。開発者はemptyメソッド本体を定義する必要はありません。

method ImplementMeIfNeeded; virtual; empty;

例外フィルタ

型だけでなく任意の条件に基づいて、例外を選択してCatchします(VB.NETではサポートされていますが、C#ではサポートされていません)。

try
  // ..ここでコードを実行..
except
  on E: SocketException where E.ErrorCode = 10054 do begin
    // connection was closed gracefully
  end;
end;

イベントの起動・実行

開発者はイベントの起動/実行を眼に見える形で指定できます。C#では、イベントを定義したクラスだけが実行できます(開発者が外部から出来るのはハンドラを追加/削除だけです)。Delphi Prismでは、開発者は以下のように記述できます。継承したクラスはイベントを実行します:

public
  event Foo:EventHandler protected raise;

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-11-09 (日) 15:16:07 (666d)