2017-03-01 16 views
4

デリゲート型で識別子をスキップすると、コンパイラはidentifier identifierというエラーをスローします。だから、代理人を宣言するとき、なぜ型の識別子を指定しなければならないのですか?宣言権では型情報だけで十分ですか?なぜデリゲート宣言には識別子を記述する必要がありますか?

public delegate void MyDel(object o, EventArgs e); // accepted by compiler 
public delegate void MyDel(object, EventArgs); // throws error, why? 

注:C++は型のみの宣言をサポートしています。私がC++のバックグラウンドから来ているので、私は同じ動作を期待していました。

+3

オブジェクトとEventArgsの代わりに2つのオブジェクトを取った代理人がいたとします。あなたや他の誰かがデリゲートをどのようにして伝えますか? – BoltClock

+0

インタフェースで宣言されたメソッドからパラメータ名を削除したいのですが、抽象メソッドも削除しますか?基本的に、パラメータリストはどこでも一貫した構文を持っています。 –

答えて

1

documentationを書いている間に、あなたが議論しているパラメータを明確に示すことができます。 (特に、同じタイプの複数のパラメータを持つ代理人の場合)

また、本体を持たない他の領域(抽象メソッドやインターフェイスメソッドなど)とも一致しますが、依然としてパラメータの指定が必要です。

-1

良いプログラマは、どのようなものであるかを明確に示すパラメータ名を定義します。型だけが許されるならば、それは混乱につながります。この混乱は、文書化とそれを注意深く読んで生産性を失うことにつながります。これに対して、言語の設計者は、デリゲートまたはインターフェイスを定義するときに定義されるパラメータ名を持つことに決めました。

想像SqlCommandオブジェクトは、私はこのことについて公式な何かを見つけることができません

SqlCommand(string cmdText, SqlConnection connection) 
0

注対

SqlCommand(string, SqlConnection) 

をDEFN。以下は私の推測です。

まず、パラメータ名を使用すると、そのパラメータが何をするのかを人々が容易に知ることができます。 object senderの代わりにちょうどobjectがある場合、このパラメータの重要性は非常にあいまいです。単語senderをそこに置くと、人々は最初にこのパラメータがイベントの送信者を表すことを知るでしょう。

第2に、これによりIDEで簡単にコードを生成できます。これまでWindowsフォームデザイナでイベントハンドラを生成しようとしましたか?デリゲート宣言のパラメータに従ってパラメータ名を生成します。宣言にパラメータ名を入れないと、IDEは意味のある名前を生成できません。

最後に、この構文をメソッド宣言と似ていると、おそらくコンパイラ開発者にとってはあまり効果がありません。 :)

1

メソッドへの名前の呼び出しの問題もあり

MyDel myDel = MyMethod; 
myDel(o:sender,e: eve); 

C#が、それを可能にし、あなたがこれを行う可能性がどのように名前を持っていなかった場合。

+0

これは良い議論ですが、それはやや歴史的に逆転しています。代議員は最初に(そして彼らは常に名前付きのパラメータを持っていました)、その後名前付きのパラメータが来ました。したがって、明示的に名前を指定した引数を導入すると、代理人の名前付きパラメータがなくても、より難しいと言えるでしょう。とにかく+1に値する。 – Sefe

+0

あなたはそれが同じバージョンであったと誓ったことがあります。 –

0

はすぐに私の心に来て少なくとも二つの理由があります:メソッドの宣言と

一貫

あなたはパラメータ名が署名の一部ではないことを右であり、そのように、それは技術的にありますデリゲートに一致する必要はありません(したがって、デリゲートをメソッドに一致させるときはパラメータ名は無視されます)。しかし、一貫性は言語の重要な特徴です。それは学習をより容易にし、認知的作業負荷を減らし、生産性を向上させます。デリゲートは、メソッドの「プレースホルダ」です。一貫性を持たせるためには、定義を可能な限りメソッド定義に似たものにすることが理にかなっています。この方法は、このように宣言することになります。この方法に

void PropertyChangedHandler(object sender, PropertyChangedEventArgs e) { 
    //... 
} 

デリゲートのように定義することができます:あなたが見ることができるように

delegate void PropertyChangedEventHandler(object sender, PropertyChangedEventArgs e); 

、唯一の違いはdelegateキーワード(そしてもちろんの欠如でありますこれは署名の一部ではないため、ここでは無関係です)。それは学びやすく覚えやすいです。

開発効率向上は、あなたが+=そして、イベント名を入力することができますVisual Studioで

を支援する2回押しタブとイベントハンドラメソッドが自動的に生成されます。デリゲートのパラメータの名前は、生成されたメソッドに使用されます。デリゲートには名前ではなくパラメータ型しかない場合は、パラメータはparam1,param2などの名前にする必要がありますが、これはあまり意味がありません。同じことが他の開発支援にも当てはまります。たとえば、デリゲートを呼び出すコードを記述する場合、IntelliSenseはデリゲートのパラメータの名前を表示します。それは彼らのタイプよりはるかに便利です。

関連する問題