C#におけるdelegateという仕様って
javascriptやPHPにおける無名関数と同じものとおもってさしつかえないのでしょうか?
たとえば
(1)
var funcObj = function (){
alert("無名関数だよ");
};
funcObj();
ーーーーーーーーーーーーーーーーー
(2)
$func =function(){
print("無名関数");
};
$func();
といった類のもの?
たとえば以下のようなC#のコードだと
using System;
class MainClass{
//delegateの宣言
public delegate void MyMethod(string message);
public delegate void NoneMethod(string aaa);
public static void Main (string [] args){
//delegateの中身を記述
MyMethod methodA = delegate(string messageA){
Console.WriteLine(messageA);
};
//無名関数?として実行
methodA("無名関数?");
//delegateをnewして使用する。
NoneMethod obj =new NoneMethod(OriginalMethod);
obj("newして利用する無名関数");
}
//delegateの中身を記述
public static void OriginalMethod(string aaa){
Console.WriteLine(aaa);
}
}
二種類delegateとおもわれるコードを書いております。
この delegateというキーワードをつかってまさに、冒頭のjsやPHPのようなスクリプト言語の
ような感じで定義するdelegateと
宣言したdelegateを newしてまるでクラスのように扱う方法
のdelegate
この二つの違いはなんでしょうか?
バージョンによる、あたらしいか古いかだけですか?
No.1ベストアンサー
- 回答日時:
まず,デリゲート自体はメソッドの呼び出し機構をオブジェクト化したものです。
イベントハンドラやコールバック関数などに使われることが多いです。
その他,スレッドプールを利用したマルチスレッドの実行にも使うことができます。
で,元々 (C# 1.0~) あるのが,デリゲート型を定義するためのdelegateです。
> public delegate void MyMethod(string message);
> public delegate void NoneMethod(string aaa);
で使っている物です。
C#は基本的に型ベースなので,このような定義が必要になります。
ただし,.NET 3.5以降ではAction<T>やFunc<T, TResult>といったような汎用デリゲート,
さらにはイベントハンドラ用のEventHandler<T>などがあるため,
outやrefなどが不要であれば定義することはないでしょう。
# .NET 4ではAction<T1, T2, ..., T16>なんていうのが追加されました……。
.NET 2.0でPredicate<T>のようなデリゲートが追加されましたが,
.NET 3.5のSystem.Linq.Enumerable.WhereはPredicateではなくFuncを引数にとるようになっていたりします。
ちなみに,C# 2.0でメソッドからデリゲートを生成する場合にnewは不要になりました。
> NoneMethod obj =new NoneMethod(OriginalMethod);
は
NoneMethod obj = OriginalMethod;
と書けます。
delegateを使った匿名関数は,C# 2.0で追加された新機能ですが,C# 3.5でラムダ式が入って不要になりました。
> MyMethod methodA = delegate(string messageA){
> Console.WriteLine(messageA);
> };
は,
Action<string> methodA = messageA => Console.WriteLine(messageA);
または
Action<string> methodA = messageA => { Console.WriteLine(messageA); };
と書けます。
どちらも実体はコンパイラが頑張ってくれる物です。
おそらく,
private void methodA_Impl (string messageA) { Console.WriteLine(messageA); }
なんていうようなメソッドを生成して,
MyMethod methodA = new MyMethod(methodA_Impl);
のように変換してくれています。
この回答への補足
ありがとうございます。
コントロールごとのClickなどのイベントもdelegate(){}
で内容を記述することによって同様の動きができました。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【Java8以降】csvファイルの複...
-
C# ListBoxのアイテムをユーザ...
-
C#でIPアドレスの取得について
-
マルチスレッドで同時にFTPアッ...
-
C#での関数テーブルの作り方
-
ORA-01858: 数値を指定する箇所...
-
javaで質問です。 文字列2023/2...
-
VBAで配列の計算
-
JAVAでの占い
-
1~100までの数字を表示し、か...
-
C言語のポインターに関する警告
-
パソコンキーボードで時分秒を...
-
IF関数でEmpty値を設定する方法。
-
実数からの小数部の取得
-
hiddenの値が期待した値で取得...
-
JSPやサーブレットでSystem.out...
-
getStringの値がNULLの時の処理
-
Log4jで機能毎に別ファイルへ出...
-
System.err. printlnとSystem.o...
-
Path型をString型へ変換する(Java)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
strcmp関数などでの複数の文字...
-
C# ListBoxのアイテムをユーザ...
-
jap実行時のTomcatのエラーに困...
-
特定の文字列が一致する行から...
-
マルチスレッドで同時にFTPアッ...
-
【Java8以降】csvファイルの複...
-
「指定されたキャストは有効で...
-
Delphiで改行文字の置換がうま...
-
C#での関数テーブルの作り方
-
ArrayListを改良したい
-
GridViewで複数のDropDownList...
-
GDI+ DrawString() で指定範囲...
-
C#でIPアドレスの取得について
-
C#での関数テーブルの作り方
-
strtokでの空文字への置き換え
-
c言語
-
PHPのSHA256変換について
-
C# JSONについて
-
C#でプロパティを使わずXMLにデ...
-
C#で型変換
おすすめ情報