1

VB には、Handles 句があり、ハンドラーを xaml ファイルに (直接 VB ファイルに) 配置せずに、コントロールのイベントに追加できます。

xaml:

<Button x:Name="myButton" />

VB:

Private Sub Button_Click() Handles myButton.Click

End Sub

これを使用して実行できる良いことの 1 つは、Visual Studio のドロップダウンを使用して、xaml ファイルに移動して変更することなく自動的にイベントを追加できることです。この質問(および回答)を読んで、私が話していることをよりよく理解してください。

コード ビハインドから利用可能なイベントを示す Visual Studio 2010

その質問の答えは、C# が Visual Studio 内でこの機能を持たない理由を特定していませんが、私には明らかです。C# には、Handles 句を使用して CodeBehind にイベントを追加するため、この機能がありません。

+= を使用して、InitializeComponent の下のコンストラクターに手動でイベントを追加できることはわかっていますが (これはほとんど同じことです)、VB には、コンストラクター (および他の場所) にイベントを追加できる AddHandler もあります。 、そしてそれは自動ではなく、(私にとって) Handles 句よりも信頼性が低くなります。

私の質問は:

なぜそれが実装されていないのですか?頼りにならない?安全でない?回避策はありますか?

4

1 に答える 1

5

Microsoft の誰も、努力を正当化するのに十分有用であるとは考えていなかったため、実装されませんでした。正確な理由は、C# チームの誰かだけが答えることができます。C# と VB がそれぞれの機能を同期させようとしているのは事実ですが、VB 固有のすべての機能をさかのぼって C# に導入したり、その逆を行ったりするという意味ではありません。Handles(句は常に VB.NET に存在することに注意してください)

ただし、言語としての VB の歴史に基づいて、VB が導入された理由を推測することはできます。つまり、NET 以前の VB イベントは常にこのように機能していたので、VB 開発者はおそらくそれに慣れているでしょう。

従来の VB では、イベントは名前によってオブジェクトに関連付けられていました。があり、Formという名前のサブルーチンを定義するとForm_Load、フォームのLoadイベントとして実行されます。この伝統は ASP に引き継がれ、AutoEventWireup構成オプションとして残っています。VB 開発者は、どのイベントに対してどのメソッドを実行すればよいかを、コンパイラーに「説明」しなくてもわかる言語に慣れていました。

.NET 言語では、イベントは、他のプロパティと同様に割り当てる必要がある特殊な型 (デリゲート型) を持つ特定の種類のプロパティにすぎません。ただし、VB 開発者が VB.NET に簡単に移行できるようにするためには、イベント、デリゲート、およびハンドラーについて (少なくともすぐには) 学ばなくても、簡単に移行できる方法を提供することが理想的です。Handlesキーワードはこれを実現します。サブに追加するだけで、Handles LoadイベントForm_Loadハンドラーになります。

一方、C# には、維持する必要のある従来の動作はありません。C# の対象ユーザーは多くの言語の人々で構成されていましたが、そのほとんどはイベントの概念が組み込まれておらず、VB の自動ワイヤアップ動作を持っていませんでした。したがって、この動作を言語に導入する必要はありませんでしたが、代わりに、新しい C# 開発者は、最初から物事を行うための "正しい方法" を学ぶだけでした。

WPF と MVVM のビュー/モデルの分離が導入され、コード ビハインドが最小限に抑えられるようになったことで、handlesキーワードは少し魅力的になりましたが、それでも C# がイベントを処理する方法の一般原則に反しているようです。実装する価値があることを C# チームに納得させるには、非常に強力な議論が必要になると思います。

于 2013-09-18T18:28:48.447 に答える