C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: WPFのStoryboard.Completedで質問


(過去ログ 106 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■63341 / inTopicNo.1)  WPFのStoryboard.Completedで質問
  
□投稿者/ はつね (1回)-(2012/08/17(Fri) 08:14:00)
はつね さんの Web サイト

分類:[C#] 

C#でわからない実行文があります。

_Storyboard.Completed, delegate {_Storyboard.Stop(Me)}


Q1.この文法がMSDNのどこにのっていますか?
Q2.もっと平素に書いたらどうなりますか?

よろしくお願いします。
引用返信 編集キー/
■63342 / inTopicNo.2)  Re[1]: WPFのStoryboard.Completedで質問
□投稿者/ Azulean (17回)-(2012/08/17(Fri) 10:00:37)
2012/08/17(Fri) 10:01:36 編集(投稿者)

No63341 (はつね さん) に返信
> _Storyboard.Completed, delegate {_Storyboard.Stop(Me)}

逆質問になってしまうのですが、この一文はどこから来たのでしょうか?
Me キーワードが使われている、Completed イベントの後に , でつなげているあたり、C# として成り立っていないように見受けられたためです。


> Q1.この文法がMSDNのどこにのっていますか?

私の知る限り、この一文は通らないと思います。
実際、VS2010/2012 ともに試しましたが、コンパイルエラーになります。

// _Storyboard.Completed += delegate { _Storyboard.Stop(this); }; ならいけるけれど。


> Q2.もっと平素に書いたらどうなりますか?

どの部分を疑問とされているのかわからないので、何とも言えません。
(匿名メソッド? , で区切られた謎の一文?)
引用返信 編集キー/
■63343 / inTopicNo.3)  Re[2]: WPFのStoryboard.Completedで質問
□投稿者/ はつね (2回)-(2012/08/17(Fri) 12:43:56)
失礼しました。Azulean さんが書かれている
_Storyboard.Completed += delegate { _Storyboard.Stop(this); }; ならいけるけれど。
が質問したかったものになります。

ヘルプファイルで一項目として説明されているとではなく
+=の後が別の書き方があるのでは?
と想定しています。

引用返信 編集キー/
■63344 / inTopicNo.4)  Re[3]: WPFのStoryboard.Completedで質問
□投稿者/ Azulean (18回)-(2012/08/17(Fri) 13:10:03)
2012/08/17(Fri) 13:11:12 編集(投稿者)

No63343 (はつね さん) に返信
> ヘルプファイルで一項目として説明されているとではなく
> +=の後が別の書き方があるのでは?
> と想定しています。

改めて探してみると、1 ページで説明されていますね。
以下のページに、普通のメソッドのやり方、ラムダ式でのやり方、匿名メソッドでのやり方が列挙されています。

方法 : イベント サブスクリプションとサブスクリプションの解除 (C# プログラミング ガイド)
http://msdn.microsoft.com/ja-jp/library/ms366768.aspx

上記のページでは匿名メソッドのパラメーターリストの省略について言及されていないので、以下のページも合わせる形でしょうか。

匿名メソッド (C# プログラミング ガイド)
http://msdn.microsoft.com/ja-jp/library/0yw3tz5k.aspx

これで求めていたものに対して足りるのかどうかはわかりませんが…。

-----
(念のため)
+= の後に EventHandler 型として解釈できる要素であれば変数でも、メソッドでも、ラムダ式でも、匿名メソッドでもできます。

_StoryBoard.Completed += new EventHandler(メソッド名);
_StoryBoard.Completed += メソッド名;
EventHandler eh = メソッド名;
_StoryBoard.Completed += eh;
_StoryBoard.Completed += delegate { /* 処理 */ };
_StoryBoard.Completed += delegate(object sender, EventArgs e) { /* 処理 */ };
_StoryBoard.Completed += (sender, e) => { /* 処理 */ };

// メソッド名 は void (object sender, EventArgs e) という形であること。


ぱっと思いつく範囲でこれぐらい書けます。
いずれも右辺(+= の右)は EventHandler 型として解釈できるものですね。

-----
_StoryBoard.Completed += delegate { _StoryBoard.Stop(this); }; の単純な展開例としては以下ですね。

public void SampleMethod()
{
 _StoryBoard.Completed += CompletedMethod;
}

public void CompletedMethod(object sender, EventArgs e)
{
 _StoryBoard.Stop(this);
}

ただ、匿名メソッドの内のコードによっては、コンパイラが独自のクラスを生成します。
このあたりは C# 言語仕様書に書いてありそうです。Visual Studio のインストール先の VC# の Specification あたりに。4.0 向けであれば「6.5.1 デリゲート型への匿名関数の変換の評価」。
引用返信 編集キー/
■63345 / inTopicNo.5)  Re[4]: WPFのStoryboard.Completedで質問
□投稿者/ はつね (3回)-(2012/08/17(Fri) 16:52:49)
はつね さんの Web サイト
No63344 (Azulean さん) に返信

ありがとうございます。
匿名メソッドの項目に得たい情報が記載されていました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -