トップページ⇒tech
1001コメント298KB

ふらっとC#,C♯,C#(初心者用) Part65

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/11/09(火) 21:57:30
このスレッドは
「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からない場合など、勇気をもって書き込んでください。
内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。

なお、テンプレ2行目が読めない回答者は邪魔なので後述のC#相談室に移動して下さい。

>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

■前スレ
ふらっとC#,C♯,C#(初心者用) Part64
http://hibari.2ch.net/test/read.cgi/tech/1286890729/

■関連スレ
C#, C♯, C#相談室 Part62
http://hibari.2ch.net/test/read.cgi/tech/1284775031/
VB.NET質問スレ(Part35)
http://hibari.2ch.net/test/read.cgi/tech/1284423653/
くだすれC++/CLI(初心者用)part2
http://pc12.2ch.net/test/read.cgi/tech/1268613679/

■備考
コードの量が多い場合は下記サイトを使うなどしたほうがいいかも
http://ideone.com/
コードを貼り付けてRun codeのチェックをはずしてsubmitボタンを押すと
コードを鯖側にアップして専用のアドレスが発行されます。

直接貼る場合は下記サイトなどを利用してhtmlエンコードした方が
インデントも残って見やすいです
http://kawama.jp/php/encode_html.php
0153デフォルトの名無しさん2010/11/12(金) 23:57:56
ようるすに、

AがBから呼ばれたいのだけどBはA専用には設計できない(設計したくない)、というとき
デリゲートかイベントを使う(と良い)
(さもなくば呼び出される側の詳細を隠蔽するためだけに継承と多態を使う、みたいなアホらしい設計になる)

で、BからAを呼び出すにあたり、呼び出し先がA一つで良いときはデリゲート、
Aだけとは限らず、Aがあずかり知らない不特定多数(CやDやE)も同じタイミングでの
Bからの呼び出しを必要としているかもしれない(Aにはわからない or わからせたくない)場合はイベントを使う

前者は昔はコールバックと呼ばれていたしくみ
0154デフォルトの名無しさん2010/11/12(金) 23:58:15
>>152
つLINQ
0155デフォルトの名無しさん2010/11/13(土) 00:01:06
>>152
class Form1 : Form {
 // ...

 void Foo() {
  if (InvokeRequired) {
    Invoke(new Action(Foo));
  } else {
    label1.Text = "Hello World!";
  }
}
0156デフォルトの名無しさん2010/11/13(土) 00:01:33
>>152
Cで関数ポインタを使うぐらいの頻度。
要するに使う分野では使うけど、必用ない分野では殆ど使わない。

川俣はC#2.0の連載で匿名メソッドを「デザートじゃなくご飯」って書いてたけど、
あれは誇大広告もいいところでむしろデザートそのもの。

川俣はデタラメを言う「トンデモさん」ではないと俺は思うけど、
大げさで偏ってるのは確か。
0157デフォルトの名無しさん2010/11/13(土) 00:01:51
非同期関係はデリゲート必須だよな
0158デフォルトの名無しさん2010/11/13(土) 00:05:14
>>152
List<int> list = new List<int>();
list.Add(10);
list.Add(20);
list.ForEach(Console.WriteLine);
0159デフォルトの名無しさん2010/11/13(土) 00:05:27
非同期では必須なのに、
「スレッドとかわかりにくい」と言われた・・・

そりゃ、「わからないからスレッド使わない、だからデリゲートも使わない」
と言われれば、「うん、使う必要ないね」としか言いようがなく。
0160デフォルトの名無しさん2010/11/13(土) 00:07:27
あとデリゲートをクロージャとして使う手がある。
非同期局面でシグナルでなくデリゲートじゃなきゃヤダ、というのは大概このケース
つまんり、
  int[] result = new int[10];
  for (int i = 0; i < 10; ++i) {
    Action<int> act = new Action<int>((x) => { result[i] = x; })
    B.LetsCallback(act);
  }
みたいな、
0161デフォルトの名無しさん2010/11/13(土) 00:08:21
スマンスresultのlock忘れたorz
0162デフォルトの名無しさん2010/11/13(土) 00:10:46
>>152
デリゲートというか、ラムダ式はC#3.0以降は必須。
Linqの使い方を学べばデリゲートの有効な使い方ってのがよくわかる。
2.0以下だったらピンと来ないのも当然かもしれない。
0163デフォルトの名無しさん2010/11/13(土) 00:15:41
>>152
正直、デリゲートの概念なかった頃は冗談抜きで面倒よ。
簡単に説明してくれといわれて簡単に書く気になれないレベル。
だから例が出てこないのよ。
0164デフォルトの名無しさん2010/11/13(土) 00:16:00
>>159
たしかにw
0165デフォルトの名無しさん2010/11/13(土) 00:17:56
さらにいうと、デリゲートはC#テンプレートの機能不足を補うのにも使わざるおえない
すわなち、引数付きコンストラクタしかないクラスTを型引数とし、内部でnewするテンプレートは
Tのファクトリをデリゲートで渡すようなテンプレートにするしか手がない、
ハズ…!
(引数なしのコンストラクタで生成するならnew()制約で良いが、引数付きを扱う構文が無い)
0166デフォルトの名無しさん2010/11/13(土) 00:18:30
>>163
仮にデリゲートがなかったとしたら
全部インターフェースとクラスで代用?
0167デフォルトの名無しさん2010/11/13(土) 00:22:32
>>151
そういう言い方されても俺には理解できない
>>151
List<T>もソートの意味もそれぞれわかるけど「List<T>のソート」とはどういうことかわからない
T比較用もよくわからない
よくある解説で、条件式のところにデリゲートを入れると便利的なことを書いているが
どうもピンと来ないんだよね
>>153
ちょっとまって、List 13-1でいうと呼び出し側はclass1で呼び出される側はclass2ですよね?
なんで「class1(classA)がclass2(classB)から呼ばれたい」という書き方しているの?
classABがどういうのか書いてくれないとわからない
ていうか、呼び出し側と呼び出され側の区別ってどうやってするの?もうわけわかんないよ。
>>156
その使う場面がわからない
>>157
それはわかりますよ
デリゲート使わないと無理だから
でも、そうでない場合の使い方がわからない
>>158
ForEachno定義が無いとしてエラーがでますが?なんですかそれは。
>>159
てことは、非同期以外では使わないというご意見ですね?
>>162
それって匿名メソッドとかそういうことなんでしょ
やっぱり2.0じゃ有用性説明できないってことですか

なんだろな、解説サイトあらゆるところみて一通り読んだのに
使われる場面が違うとさっぱりわからないな
頭がプログラマ向きじゃないのかなー
0168デフォルトの名無しさん2010/11/13(土) 00:22:44
>>165
ありがとう、いままでその方法に気づかなかった
0169デフォルトの名無しさん2010/11/13(土) 00:23:50
>>166
Java の場合は匿名クラスってのが実質的にデリゲートの役目担ってて、まだマシ。
ものすっごいコード量増えるけど。

C++ とかだと悲惨。
インスタンスメソッドでなければ、関数ポインターっての使えば簡単っちゃ簡単なんだけど、
インスタンス持たせようとした瞬間酷いことに。
あと、循環参照つきものだからメモリ管理がすごく面倒になる。
0170デフォルトの名無しさん2010/11/13(土) 00:25:40
>>167
>>146 に書かれてる例、ものすごい頻出パターンよ。
それみて、使いどころ分からないとなると、頻出パターンすらわかってないことになる。
0171デフォルトの名無しさん2010/11/13(土) 00:25:53
今更気づいたけど、こいつは、いつかのWPFがどうのこうのとか言ってた奴か?
「解説サイトあらゆるところみて一通り読んだ」のに「何一つ頭に入ってない」ね。
0172デフォルトの名無しさん2010/11/13(土) 00:27:55
>>169
C#選んでよかった

ところでWPFのコンバーターなんかもクラスじゃなくてデリゲート渡せたらなあって思うんだよね
0173デフォルトの名無しさん2010/11/13(土) 00:28:09
>>171
多分そうじゃないかな。
WPFの時もデリゲートわかんないって言ってて、
周りから「デリゲートもわからないってやばい」って言われて、
それで今に至ってるっぽい?

普通にやってたら頻出するはずのパターン見て「何が便利かわからない」って言ってる辺りもそっくり。
0174デフォルトの名無しさん2010/11/13(土) 00:29:03
>>167はもうコテ半つけてもいいレベルの名物キャラクターです
0175デフォルトの名無しさん2010/11/13(土) 00:30:16
>「List<T>のソート」とはどういうことかわからない
マジでいってんの?
0176デフォルトの名無しさん2010/11/13(土) 00:31:41
>>172
XAML って仕組み的に、シリアライズ可能なものでないと書けないからね。
デリゲートは相性よろしくない。
0177デフォルトの名無しさん2010/11/13(土) 00:33:21
>>174
WPFスレではコテハンになったぞw
0178デフォルトの名無しさん2010/11/13(土) 00:36:48
例えばさ、DelegateCommandがなぜ必要かといったら
これがなかったら、ICommandインターフェースを使った
クラスをそれぞれのコマンドごとに作らなくてはいけなくなる

だから、ICommandインターフェースを実装したDelegateCommandクラスを作って
デリゲートを通して、実処理部分のVMのメソッドはここですとDelegateCommandクラスに渡して
DelegateCommandクラスから、VMのメソッドを呼びなおしてもらうと
そのことによって、イベントハンドラごとにクラスを作らなくても良いようにしている

つまり、共通的な処理部分をデリゲートで呼び出したほかのクラスのメソッドに処理させて
相違部分は呼び出し元で処理する場合に便利ってことなんだろうけど
これも、インターフェースが必要としない場合だと、ただ共通機能をまとめた
メソッドを作って直接呼び出せばいいだけだし
0179デフォルトの名無しさん2010/11/13(土) 00:40:53
>>176
それはわかってるんだけどコンバータクラスが大量に増えてしまう現状は何とかしてほしい
なんかうまい方法とかないかな
0180305 ◆Jzt/EX0TGY8T 2010/11/13(土) 00:50:19
>>179
それこそDelegateCommandと同じ要領でいけるでしょ
コンバータークラスを1つ作っておいて
デリゲートでVMなどの実処理するメソッドを呼び出してもらう
01811532010/11/13(土) 00:53:32
>>167
言った手前返事しとこうとぞ思う、
>153は、List 13-1(>129のさらにリンク先)と異なる記号を使って無用の混乱を招いた点はお詫びしとく

List 13-1は非常に単純化されたサンプルなので、>153に当てはめて解釈するのは無理がある
Class2のインスタンスinstanceはClass1から呼び出されてはいるものの、instanceが特にそういう要求を持っているわけではない。
すなわち、instanceはClass1から呼ばれようが呼ばれまいが自己不整合を起こして破綻したりしない。
このような、Class2を知っているClass1が一方的にClass2を呼び出す場合はデリゲートを使うまでもない。
実際、List 13-1の19〜20行目はただ単に instance.method(2, 3); と1行書けば済む

だがそうは済まないケースがあり、それが>153だったり>157だったりするというしくみ
わからないのは必要に迫られていないからかもしれない、
0182デフォルトの名無しさん2010/11/13(土) 00:55:05
>>180
なんだ、わかってるじゃないか
0183 ◆Jzt/EX0TGY8T 2010/11/13(土) 01:04:50
ttp://ufcpp.net/study/csharp/misc_delegate.html
ここ見ても、イベントと非同期はわかりますよ
デリゲートなければできないですから。
イベントの場合、ボタンクリックで例えると
イベントハンドラを作る我々開発者はクリックイベントが起きた場合に
このメソッドを呼び出してほしいとイベントハンドラを代入して呼び出してもらう
でも、イベントハンドラを書かないでクリックされても無反応であってもいい構わないわけで
こちら側にすべての処理を委ねられているって感じがします。

でも、List 13-2にしても、上記のURLの図2にしても
普通に処理するメソッドを直接書けばいいだけなのを
わざわざデリゲートで呼び出している理由がわからない
>>181さんの言うとおり「必要に迫られていないからかもしれない」ってことなんだろうけど

>>181
その説明はすごくわかりやすかったです。
で、その説明で>>153を説明するとどうなりますか?
0184 ◆Jzt/EX0TGY8T 2010/11/13(土) 01:09:18
>>182
いやでも、それはインターフェースを実装しなければいけないという
制約があるから、デリゲートするしかないってのはわかるけど
例えば、インターフェースなくてもいいってのなら・・・
あれ?やっぱりクラスが増えることになるか・・・

いやいや、違うな
この場合は、呼び出し側がマイクロスフトの設計によるものだから
つまり、ボタンを設計したマイクロソフトであり、コンバーターやコマンドを作ったマイクロソフトが呼び出し側

呼び出し側も呼び出される側も自分で設計する場合は
やっぱり普通に直接メソッド呼び出すよね
だからデリゲートの有用性がわからないんです
0185デフォルトの名無しさん2010/11/13(土) 01:18:40
http://ideone.com/yQFdh
これならデリゲートのありがたみがわかるんじゃないか?

わざわざ自分で実行しなくても下のほうに結果も表示されるようになってるからね
0186デフォルトの名無しさん2010/11/13(土) 01:18:44
なんかウダウダ雑談がしたいだけなのか、本当にアタマ悪いのかどっちなんだろ....
0187デフォルトの名無しさん2010/11/13(土) 01:22:09
両方じゃない?
0188デフォルトの名無しさん2010/11/13(土) 01:24:38
それが必要な場面に直面しないと、本当の意味で必要性を感じない。
必要性を感じない人に理解させるのは難しい。
0189デフォルトの名無しさん2010/11/13(土) 01:25:56
そうそう
無理して教える必要はないw
どうせ聞く方も身に付かないだろうし
教える方も疲れるだけw

会社の後輩だったら業務命令等あるだろうけどw
0190デフォルトの名無しさん2010/11/13(土) 01:27:45
なんだかんだいってみんな暇なんだよ
0191デフォルトの名無しさん2010/11/13(土) 01:47:19
>>183
>イベントハンドラを作る我々開発者はクリックイベントが起きた場合に
>このメソッドを呼び出してほしいとイベントハンドラを代入して呼び出してもらう
これは、「開発者のコード」が、ボタンクリック時の処理を、我=「開発者のコード」に属するイベントハンドラに委譲せよ、と「ボタン」迫るケース。
しかし「ボタン」を実装したコード自体はマイクロソフト謹製でかつビルド済みだから、開発者側はそれを改変できない。
だから「「ボタン」が「開発者のコードを直接呼び出せばいいのに!」という系の願いは叶えられようがない。
こういうとき、イベントハンドラのコードをデータのごとく「ボタン」に渡せて初めて解決する。デリゲートはその入れ物。

なお、「ボタン」を作るのがマイクロソフトでなくて今日の漏れで、「開発者のコード」を書くのが3000年後の漏れだとしても約同じ事
これが>153の説明。「ボタン」は「開発者のコード」専用には設計できない。

>>184
>呼び出し側も呼び出される側も自分で設計する場合は
>やっぱり普通に直接メソッド呼び出すよね
例えばだが、switch文x=1,2,3,...,10000に応じて自作関数1万個のどれかに分岐する1万行のコードのかわりにデリゲート1万個の配列をつくっておけば
呼び出しは1行で済むし、
一方、デリゲートに収容するコードはデータとして生成もできる(>160)から、初期化には1万行要らない(かもしれない)
0192デフォルトの名無しさん2010/11/13(土) 01:52:49
いやいや、説明がなんか哲学じみてきたね^^
(デリゲートは使ってる立場ですけど)
0193 ◆Jzt/EX0TGY8T 2010/11/13(土) 01:57:08
>>185
これはデリゲート使ってないやり方ですよね?
このままでいいと思いますけど、何がだめなんでしょうか?
persons.Sort(compareAge).Select(s=>Console.WriteLine(s));

DelegateCommandに習うとするなら
実装を変えたくないClassAがあるという大前提で
ClassAのプロパティであるClassBの処理で計算結果が出される場合
ClassBの処理をいくつか変更したくなった場合に
ClassBにデリゲートを設けて、C,D,Eを呼び出して処理を変更するために
デリゲートを使うというのならわかる
でも、これはあくまで一部の使い方なんだよね

ラムダとかでデリゲート使ってるのみると、上記のようなことを
頭に浮かべながら考えるなんて大変すぎる
0194デフォルトの名無しさん2010/11/13(土) 01:57:18
みんなデリゲートが大好きなのさ
0195デフォルトの名無しさん2010/11/13(土) 01:58:08
>>193
いやいやいやいや
デリゲートつかってますよ?
0196デフォルトの名無しさん2010/11/13(土) 02:00:10
哲学じみてるんじゃなくて説明下手なだけ。

デリゲートなんて一次接近としてはただの関数ポインタだと理解すればいいわけで、
そんな難しい概念じゃないんだけどね。

機械語だったら今まで
CALL #label
と即値のアドレスしかコールできなかったのが、
CALL funcPtr
と、メモリーのどこかに入ってるアドレス値を参照してコールできるようになりましたよ、
とそれだけの話。

実行時に呼び出しアドレスを動的に変えたい場合があるって、そんな高尚な話か?
0197デフォルトの名無しさん2010/11/13(土) 02:05:25
俺のデリゲートに対する最初の理解は
「関数ポインタが安全に使えるようになりました」だった。
0198デフォルトの名無しさん2010/11/13(土) 02:05:54
それはデリゲートの本来の使い方とは違う。
アプリケーションに取っては、スレッド間通信が本来の使い方でしょ。
参照コールの機能もあるけどね。
0199 ◆Jzt/EX0TGY8T 2010/11/13(土) 02:07:09
>>191
>例えばだが、switch文x=1,2,3,...,10000に応じて自作関数1万個のどれかに分岐する1万行のコードのかわりにデリゲ>ート1万個の配列をつくっておけば
>呼び出しは1行で済むし

1行で済みますか?
デリゲートは
Sample sample = new Sample(instance.method);
こんな風に直接メソッドを指定してデリゲートに登録するんですよね?
つまり、分岐の数だけ、別クラスの特定のメソッドをデリゲートに登録する記述を書かなくてはいけないですよね?

例えばDelegateCommandのようにプロパティとして渡して置くというのなら
1行で済むでしょうけど
0200デフォルトの名無しさん2010/11/13(土) 02:07:20
C++/CLIでdelegateを使うと関数ポインタとの違いというかデリゲートの正体が理解できるかも。
0201デフォルトの名無しさん2010/11/13(土) 02:07:39
>>196
デリゲートは関数ポインタよりも高尚な概念なんですよ^^
クロージャでもあるっていうのがその証拠

デリゲート=関数ポインタ、は正しくない
デリゲート=関数ポインタ+無名関数、は冗長
0202デフォルトの名無しさん2010/11/13(土) 02:08:03
>>193
persons.Sort(new Comparison<Person>(compareAge));
こう書けばわかる?
Comparison<T>はデリゲートね

ちなみにSortの返り値はVoidだし
Selectも遅延実行だから何も表示されない
0203 ◆Jzt/EX0TGY8T 2010/11/13(土) 02:13:38
>>196
>>197
こういう説明の仕方が一番嫌いです。
わざとなんでしょうけど。

ある未知の機能を説明するのに、未知の機能を例にする説明ってよくないと思うの
読んでる側は0の知識の可能性があるのに。

>>195
デリゲートの宣言ないですけど
0204デフォルトの名無しさん2010/11/13(土) 02:15:05
例えば
Select(x => x * x) ってのは
Select(new Func<int,int>(x => x * x) であり

static int Hoge(int x) { return x * x; } // というメソッドが外に定義してあって
Select(Hoge) とも同じであり
Select(new Func<int, int>(Hoge)) でもあり

var delg = new Func<int, int>(Hoge); // 代入して
Select(delg); // こう使ってもいい

になる。
匿名関数じゃないデリゲートがビミョーって主張なら、まあ分かる。
0205デフォルトの名無しさん2010/11/13(土) 02:15:22
デリゲート=関数ポインタ+オブジェクトへの参照 // static関数の場合参照はnull

クロージャになったのは.NET2.0から。
0206デフォルトの名無しさん2010/11/13(土) 02:18:05
>>203
未知って、だから関数ポインタがどういうものかもちゃんと説明してるじゃん。

デリゲートより関数ポインタの方が具体的だから、そっちをまず理解するんだよ。
関数ポインタがわからないのにより抽象度が高いデリゲートが分かるわけないだろう。
0207デフォルトの名無しさん2010/11/13(土) 02:18:13
>>203
一番単純な概念から説明しようとしてるだけだろ。
>こういう説明の仕方が一番嫌いです。
なんて言い訳して逃げるからいつまで経っても理解できないんだろうがw
0208デフォルトの名無しさん2010/11/13(土) 02:19:47
>>203
ごめんね、そこまで書かないとわかんないとは思わなかったんだよ
>>202にも書いてあるけど
public delegate int Comparison<T>(T x, T y);
っていうデリゲートがSystem名前空間に定義されてるんですよ

で、SortはこのComparison<T>を引数にとる。
persons.Sort(new Comparison<Person>(compareAge));

で2.0からはわざわざnewする必要がなくなったから
persons.Sort(compareAge);
って書き方になるわけです。
0209デフォルトの名無しさん2010/11/13(土) 02:23:58
◆Jzt/EX0TGY8T にわかるように説明できたら勝ち
そんなゲームに思えてきた
0210 ◆Jzt/EX0TGY8T 2010/11/13(土) 02:24:36
>>202
うーんわからないです

Sort()メソッドの実態は
Array.Sortを使ってある条件に基づいてソートすると
そのソート条件をcompareAge(Person a, Person b)で示していると

で、デリゲートがなければ、Array.Sortを直接呼び出してソートすればいいだけですよね?
0211デフォルトの名無しさん2010/11/13(土) 02:26:17
まだやってるのかw
0212デフォルトの名無しさん2010/11/13(土) 02:27:23
>>210
「直接呼び出してソートすればいい」
どうやって条件を指定するの?
デリゲート使ったのは
「そのソート条件をcompareAge(Person a, Person b)で示している」
ためなのに。
0213デフォルトの名無しさん2010/11/13(土) 02:35:10
>>210
じゃあ仮にデリゲートを使わないとしたら
Persons.Sort()の実行結果はどんな並び方になると思う?
0214 ◆Jzt/EX0TGY8T 2010/11/13(土) 02:43:13
>>206
関数ポインタって関数が書かれているメモリアドレスじゃないんですか?
よくわかりません。

>>204
なんとなくわかるんですが、
それなら、Hogeを改名してSelectにして直接使えばよかったのでは?と思うのです

つまり、Selectメソッドの実態には、hoge(int x)を呼ぶかhoge(int y)を呼ぶかの選択肢があるってこと?
でも、それはオーバーロードでいいですよね?

>>207
いやでも、自分で調べろよじゃ解説になってないってことを宣言していることだと思いますよ

>>208
ってーことは
内部がList 13-2みたいなことになっているってことですよね?
calcがSortみたいな感じですか?
つまりSortを利用する側は記述が少なくて済むと・・・
sortを利用する側は呼び出し側ということでいいですか?
0215 ◆Jzt/EX0TGY8T 2010/11/13(土) 02:45:13
>>213
?
デリゲート使う使わないに関係なく
Sortメソッドが利用しているアルゴリズムを直接使えば同じことでは?
0216デフォルトの名無しさん2010/11/13(土) 02:46:16
>>214
掲示板の少ない分量で、知識0で理解する気のない奴に解説しろ って無理ゲーにもほどがあるだろ。
0217 ◆Jzt/EX0TGY8T 2010/11/13(土) 02:46:33
つまりこれですよ

>>139
0218デフォルトの名無しさん2010/11/13(土) 02:48:07
まあ今日は一旦置いて落ち着いて勉強しろ
0219 ◆Jzt/EX0TGY8T 2010/11/13(土) 02:50:03
頭が回らなくなってきたしそうします
0220デフォルトの名無しさん2010/11/13(土) 02:51:23
イーノック「一番良いデリケートを頼む」
0221 ◆Jzt/EX0TGY8T 2010/11/13(土) 02:52:42
さっきつい、ポロっとすごいアイデア言っちゃった
おれもDelegateConverterクラス作ってみよ
0222デフォルトの名無しさん2010/11/13(土) 02:52:54
>>215を見る限り、デリゲートの前にソートについて考えたほうがいいかも。
根本的に何もかも分かってないのに、あれこれ調べたお陰なのか、
ご立派な言葉だけは並べられるみたいでよくないね。
0223デフォルトの名無しさん2010/11/13(土) 02:53:50
あと、というか考える前にとりあえず手を動かせよって感じでもある。
少しでも実行してみれば自分がどれだけ変なこと言ってるか気づくと思うのだけど。
0224デフォルトの名無しさん2010/11/13(土) 02:56:06
>>214
そうですSortはcalcに相当しています
ソート用のアルゴリズムと、要素の比較方法が分離可能なら
いろいろなところで使いまわせるでしょ?
0225デフォルトの名無しさん2010/11/13(土) 02:57:12
>>203
>>210
やっぱあほ杉わろた
0226デフォルトの名無しさん2010/11/13(土) 03:04:54
◆Jzt/EX0TGY8T は間違いなくナルシスト系
自分は頭いいのに理解できないのは説明がよくないからって考えてる。
だからここに書かれた説明にちょっとでもわからない部分があるとすぐ攻撃的になって、
あらさがしや、わからないのはお前の説明が悪いからという態度になる。
そうやって自分の無能さから目をそらしているだけ。
0227デフォルトの名無しさん2010/11/13(土) 03:07:19
Sortの例で理解できないのはおかしい
0228デフォルトの名無しさん2010/11/13(土) 03:08:10
分かった上で暇な俺らにネタ供給してたんじゃなかったの?
0229デフォルトの名無しさん2010/11/13(土) 03:11:04
>>228
それなら◆Jzt/EX0TGY8T は天才的な才能の持ち主だな
0230デフォルトの名無しさん2010/11/13(土) 03:14:53
◆Jzt/EX0TGY8Tは無事チューリングテストにパスしたようで何より
0231デフォルトの名無しさん2010/11/13(土) 03:18:39
◆Jzt/EX0TGY8Tって人工知能だったの!?
まじかー、そりゃいっぱいやられたな
開発者マジすげー、尊敬するよ
0232デフォルトの名無しさん2010/11/13(土) 03:23:24
そこで式ツリーですね
0233デフォルトの名無しさん2010/11/13(土) 03:25:28
式ツリーって使ったことないんだけど、
ユーザーに簡単な数式みたいなやつを入力させて、
プログラムの動作を変更するみたいなことできる?
0234デフォルトの名無しさん2010/11/13(土) 03:28:47
http://msdn.microsoft.com/ja-jp/library/bb397951.aspx
式ツリーをビルトできるんだから出来る
0235デフォルトの名無しさん2010/11/13(土) 03:29:12
デリゲートに好きして
0236デフォルトの名無しさん2010/11/13(土) 03:39:11
>>234
ありがと、ちょっと調べてみるよ

しかし何でこの記事真っ白なんだ?
http://msdn.microsoft.com/ja-jp/library/bb882637.aspx
0237 ◆Jzt/EX0TGY8T 2010/11/13(土) 03:58:05
くっそ、DelegateConverterをやっと作ったのに
ConverterはBindingできませんとかww
どうすりゃいいんだよー
0238 ◆Jzt/EX0TGY8T 2010/11/13(土) 04:05:05
あ、イベントでやればいいのか
0239デフォルトの名無しさん2010/11/13(土) 04:53:29
ちょっと質問
イベントを発生させるメソッドの命名規則としてOn〜ってするのは割とよくあると思うんだけど
(protected virtual OnLoaded(){ this.Loaded(〜); })
イベントを受け取る側のメソッドの名前ってどんなふうにつけてる?
標準ライブラリ見ると受け取る側もOn〜って名前になってたりするんだけど
なんか一緒っていうのも気持ち悪いし
0240 ◆Jzt/EX0TGY8T 2010/11/13(土) 05:01:14
>>239
CallBackとかじゃないのHandlerとか


寝ようとしたが閃いた
例えば、サイトから画像をダウンロードするソフトを作る場合
サイトによってダウンロードの仕方が違う
その相違部分をダウンロードするクラスに教えてやるためにデリゲートを使うって感じかな
でも、多態性でもできそうだよね・・・・うーん
0241デフォルトの名無しさん2010/11/13(土) 06:00:57
ページ内の画像を一括保存するようなのだと
不要な画像(広告とか)のURLをフィルタリングするデリゲートを後から注入できるように設計しとくと便利かもね。

外から後で実装を注入できるのはデリゲートの重要な使い方の一つ。
例えばコレクションのソートでは、並び順を中身のクラスや状況によって変えたいケースは多いと思う。
そんな時にデリゲートが使えないとIComparerを実装したクラスを何度も作る羽目になっちゃうでしょ

>多態性でもできそう
単純な処理を各クラスに割り振ると数が増えすぎて複雑になってしまう。
でも複雑な処理ならクラスにする方が見通しがいい。
その辺のさじ加減はやっぱり経験になるけど、目安としては多態性で抽象化されるメソッドが複数ならインターフェイス、単一ならデリゲート
0242デフォルトの名無しさん2010/11/13(土) 06:11:40
コテハンつけてくれたので嬉しい
0243 ◆Jzt/EX0TGY8T 2010/11/13(土) 06:46:24
>>241
その説明すごくわかりやすい
要は汎用的に使えるクラスがあるという大前提に基づいて
話を進めていかないとだめなんですよ
汎用的なクラスに固有の機能をつけて利用するためにデリゲートを使うと
クラスライブラリを作るとかさ、そういう前提の話じゃないこれって
それを@ITはMAINクラスを汎用クラス的な扱いにしているからわかりにくかったんだよ
それに、calcメソッドをclass1に入れているのもよくないね
あれはclass2にするべき、そしてclass2のメソッドをclass1でやらないとだめでしょ
例えるとclass2を電卓として、class1が入力する側という感じでコードを書けばわかりやすい

説明するのに専門用語でずらずらっと並べられてもわからないんですよね
初心者はすべてのライブラリや文法を理解しているわけじゃないんだから
できるだけ日常使うような言葉だけで説明してほしい
0244デフォルトの名無しさん2010/11/13(土) 06:49:33
ごめんちょっと何言ってるのかわからない
0245 ◆Jzt/EX0TGY8T 2010/11/13(土) 06:58:03
ちょっとレベルが高すぎたかな?
もっと簡潔にいうと

@ITのサンプルコードは
IDEやアドオン、プラグイン対応のアプリを開発するための雛形なんだよ
初心者がそんなこと想定して作るかっつーの
0246デフォルトの名無しさん2010/11/13(土) 07:02:31
@ITの記事にはIDEやアドオンっていう単語は書かれて無いケド・・・
やっぱり何考えてるのか分からない
0247デフォルトの名無しさん2010/11/13(土) 07:07:53
>>209の勝者は>>241かw
0248デフォルトの名無しさん2010/11/13(土) 07:14:58
>>240
Callbackとイベントは混同したくない
Handlerはデリゲートの名前に使うからかぶらせたくない
何かほかにありませんか?
0249デフォルトの名無しさん2010/11/13(土) 07:31:20
わざわざそこまで説明されなくても
>>146の「述語: 条件式を外から挿す」を読んだだけで
汎用的なものに具体的な処理を注入するって発想にいたると思うんだけどなぁ
0250デフォルトの名無しさん2010/11/13(土) 07:38:24
サイト紹介しても
「そこ読んだけどわかりづらい、解説されてない、例えが悪い」
ばっかりだもん。説明してる人、お疲れさまです。
0251 ◆Jzt/EX0TGY8T 2010/11/13(土) 07:54:04
>>249
その考え方が既にプログラミングがわかる人のものの考え方であって

例えば、全く知らない分野について、汎用的なものって言われてもわからないでしょ?
汎用的という言葉の意味はわかっていても、分野によってまったく内容が違う
CAD設計において汎用的なやり方って言われてイメージできますか?
汎用的なものすらプログラミングしたことのな初心者にとっては理解できないんですよ

今で作ったソフトは、ソートも必要ないし、イベントに対して直接動作を書き込んで
できちゃうようなプログラミングばかりだったので、デリゲートの概念なんて意識しないで使っていた
0252デフォルトの名無しさん2010/11/13(土) 08:01:10
>>251
汎用的って表現はあなたの>>243から借りて使ってるんだよ
■ このスレッドは過去ログ倉庫に格納されています