C#, C♯, C#相談室 Part42
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/08/26(日) 12:42:25前スレ
C#, C♯, C#相談室 Part41
http://pc11.2ch.net/test/read.cgi/tech/1184840053/
過去スレは>>2-5あたり。
0388デフォルトの名無しさん
2007/09/06(木) 12:40:05それって匿名メソッドスゲーの例じゃないの。
0389デフォルトの名無しさん
2007/09/06(木) 12:46:03デリゲートが使いやすくなったけど、その前は単体ではあんまり積極的に使われなかったような
0390デフォルトの名無しさん
2007/09/06(木) 13:00:11+=と-=しかできないし
なんに使うんだよ
0391デフォルトの名無しさん
2007/09/06(木) 13:01:53イベントのハンドリングだとおもう。
0392デフォルトの名無しさん
2007/09/06(木) 13:04:04無駄なフェイルセーフだぜ
0393デフォルトの名無しさん
2007/09/06(木) 13:08:040394デフォルトの名無しさん
2007/09/06(木) 13:08:20IDEによるポトペタ
0395385
2007/09/06(木) 13:17:22そうですね匿名メソッドですね
>>387
そうですか…なんかイベントの話になってきてますね
んーデリゲートでこんな風にしたらすっごい便利!
とかいう話ないですかね
0396デフォルトの名無しさん
2007/09/06(木) 13:45:38void Print(int x){ Console.WriteLine(x); }
コレクション関係以外にないかなあ
0397デフォルトの名無しさん
2007/09/06(木) 13:58:02クラスの生成時とかにそのシチュエーションに併せて動作を変えたいとき便利。
0398デフォルトの名無しさん
2007/09/06(木) 14:00:410399デフォルトの名無しさん
2007/09/06(木) 14:55:19interface IHoge<T>
{
void Method(T arg);
}
とだいたい同等で
class A
{
public Action<Foo> Action;
}
class A
{
public IHoge<Foo> Action;
}
これもだいたい同等
a.Action = delegate(Foo foo){
....
};
これと
class FooHoge : IHoge<Foo>{ ... }
a.Action = new FooHoge(...);
これも大体同等
匿名メソッドなら直接かけるから一々定義したクラスを読まなくてすむので見やすい
ラムダ式になるともっと便利になる
匿名メソッド使わなくても、引数さえ合えばどんなメソッドでもはまるから、
いちいちinterface実装したクラスを作らなくて済む分楽
でもやっぱり真価は匿名メソッドで出てくる
0400デフォルトの名無しさん
2007/09/06(木) 15:04:40インタフェースとして実装した場合、同じWidgetを複数個持とうとするとに
インタフェースが衝突する、といった問題が生じる。Javaではこれを解決
するのに一々ゴテゴテと無名クラスを記述する羽目になり、実に馬鹿馬鹿しい限りだ。
ラムダ式が無くとも、delegateであれば上記の問題は普通に解決することが
出来る。
まあ、処理を汎用化したり(例えば描画ルーチンに、PixelをPutする
ルーチンだけdelegateとして与えられるようにすれば、汎用になる)、
テーブルジャンプっぽく使ったり(メニュー等のindexとdelegateの配列を
結びつけたりする)、意思決定と実行のタイミングが分かれている場合に、
意思決定→delegate変数に保存→delegateを用いて実行といったことをやったり
(実行が何度も行われる際に、無駄な条件分岐を完全に取り除くことが出来る)、
色々と応用範囲は多い。
0401デフォルトの名無しさん
2007/09/06(木) 15:17:170402デフォルトの名無しさん
2007/09/06(木) 17:37:05前はもっと少なかった気がするんだけど・・・なぜでしょうか?
0403385
2007/09/06(木) 19:32:29デリゲート道、精進します
ありがとうございました
0404デフォルトの名無しさん
2007/09/06(木) 20:04:16前は少なすぎたせいでスレッドプールが一杯になって例外が起きるケースがあったのでので.NET2.0から事実上無制限といえる値に増やされた。
なにげに呼んだクラスが内部でスレッドプールを使っててスレッドプールの上限で例外吐かれたりしても対処しようがないじゃん。
0405デフォルトの名無しさん
2007/09/06(木) 20:10:45ClassAまでシリアル化できなくなっちゃうけど、これって何か回避方法ないかな?
あと、デリゲートにインスタンスメソッド登録するということは、
デリゲートに参照を持たれる(つまりGCが働かない)こととやっぱり等価になるの?
0406デフォルトの名無しさん
2007/09/06(木) 20:20:37っていうかイベント結びつけたままシリアライズしたいって
いったいどんなときなの?
0407デフォルトの名無しさん
2007/09/06(木) 20:22:28メンバにつける属性で制御できるよ
0408デフォルトの名無しさん
2007/09/06(木) 20:43:280409デフォルトの名無しさん
2007/09/06(木) 20:56:27デリゲートを明示的に宣言してそのデリゲートにNonSerializedつければいいらしい。
↓参照
http://www.thescripts.com/forum/thread245864.html
0410409
2007/09/06(木) 21:01:10こっちのほうがスマートか。
0411デフォルトの名無しさん
2007/09/06(木) 21:09:45ありがと。
しかし、そんなマンマの回答よく短時間に見つけられるもんだね関心しちゃうよ
0412デフォルトの名無しさん
2007/09/06(木) 21:44:51すみません師匠にほしいです。
0413デフォルトの名無しさん
2007/09/06(木) 21:56:13どんな立場の人なのかきになるわ。マイクロソフト直々のサポート部隊が
書き込んでいるんじゃないかと思ってしまうくらいだ。
0414デフォルトの名無しさん
2007/09/06(木) 21:59:52きょうもすごいぷろぐらむをつくる。
int i = new int()
あれ、なにかへんだぞ。
intはたしか・・・
Int16
やまだくんはまだ満足しない。
iというなまえはかぶるかもしれないからあんぜんじゃない!
Int16 _USER_OBJECT_YAMADA_WRITE_200709062156_FOR_COUNTER
完璧なソースコードの誕生だ!
0415デフォルトの名無しさん
2007/09/06(木) 22:02:31そのクラスの人間なんて見たときねーよ
0416デフォルトの名無しさん
2007/09/06(木) 22:02:470417デフォルトの名無しさん
2007/09/06(木) 22:03:480418デフォルトの名無しさん
2007/09/06(木) 22:05:47jが必要になったらどうする。
0419デフォルトの名無しさん
2007/09/06(木) 22:06:120420デフォルトの名無しさん
2007/09/06(木) 22:06:28今日も嫌がらせを部下達にして楽しむ。
「iというなまえはかぶるかもしれないからあんぜんじゃない!
「Int16 _USER_OBJECT_YAMADA_WRITE_200709062156_FOR_COUNTER
「完璧なソースコードの誕生だ!
あれ、山田が何か楽しそうだぞ。
イヂワルしてやれ!
「山田君、このメソッドの名前は[_USER_OBJECT_YAMADA_WRITE_200709062156_FOR_COUNTER]にしてくれ
会議で決まったのだ!
0421デフォルトの名無しさん
2007/09/06(木) 22:06:31じえんはないけどえいえんはあるよ!
0422デフォルトの名無しさん
2007/09/06(木) 22:12:35そうだ。こういうときは・・・おーばーろーどがあるじゃないか!
やまだはそっとたなかのめそっど名のぷれふぃっくすに
OVERROAD_
をつけたした。
これでなまえがかぶることはない。
0423デフォルトの名無しさん
2007/09/06(木) 22:15:090424デフォルトの名無しさん
2007/09/06(木) 22:15:21よくじつにまわすか、ぷれふぃっくすにSTATIC_とかつければかいけつだよ(^^)
0425デフォルトの名無しさん
2007/09/06(木) 22:17:18すまない。ガチでこんなコードの修正依頼にイラついて書いてしまった。
後悔はしていない
0426デフォルトの名無しさん
2007/09/06(木) 22:19:110427デフォルトの名無しさん
2007/09/06(木) 22:22:43{
}
やまだすごくね?
0428デフォルトの名無しさん
2007/09/06(木) 22:23:330429デフォルトの名無しさん
2007/09/06(木) 22:24:510430デフォルトの名無しさん
2007/09/06(木) 22:25:40どちらかというとセンスのないプロ…
0431デフォルトの名無しさん
2007/09/06(木) 22:33:450432デフォルトの名無しさん
2007/09/06(木) 22:35:04普通に発狂するわ
0433デフォルトの名無しさん
2007/09/06(木) 22:39:100434デフォルトの名無しさん
2007/09/06(木) 22:39:56スイッチFALSEとコメントある。
わからない事もない
0435デフォルトの名無しさん
2007/09/06(木) 22:44:320436デフォルトの名無しさん
2007/09/06(木) 22:45:540437デフォルトの名無しさん
2007/09/06(木) 22:48:140438デフォルトの名無しさん
2007/09/06(木) 22:48:380439デフォルトの名無しさん
2007/09/06(木) 22:49:42それかOLD BASICの名残。
0440デフォルトの名無しさん
2007/09/06(木) 23:08:580441デフォルトの名無しさん
2007/09/06(木) 23:56:29どの辺確認すればいいのでしょう?構成はDebugでやってますが
0442デフォルトの名無しさん
2007/09/07(金) 00:01:030443デフォルトの名無しさん
2007/09/07(金) 00:08:400444デフォルトの名無しさん
2007/09/07(金) 00:10:56性格にはブレークポイントに到達して、デバッグモードになるのに凄い時間がかかって
デバッグモード後はF10で1ステップ進ませると、デバッグモード解除されてしまいます
0445デフォルトの名無しさん
2007/09/07(金) 00:21:14デバッグモード解除されるんだったら、
多分VSがぶっ壊れてるんだと思うよ
再インスコじゃね
0446デフォルトの名無しさん
2007/09/07(金) 00:31:52とりあえず朝一で再インストールしてみます
0447デフォルトの名無しさん
2007/09/07(金) 00:37:35デバッグのオプションのネイティブのチェックを外して.NETのみをデバッグするようにしたらどうなる?
0448デフォルトの名無しさん
2007/09/07(金) 00:40:18すんません。ソースが会社なんで、明日やってみます。thx
0449デフォルトの名無しさん
2007/09/07(金) 01:27:48デバッグ開始が異常に遅くなるときあるよね。
0450デフォルトの名無しさん
2007/09/07(金) 13:13:13kwsk
0451デフォルトの名無しさん
2007/09/07(金) 15:01:140452デフォルトの名無しさん
2007/09/07(金) 16:39:100453デフォルトの名無しさん
2007/09/07(金) 19:05:00TextBoxコントロールの枠線の色は変更できますか?
できそうにない感じなのですが、そうすると自分で線を描くしかないかと
思うのですが、
Graphics g = this.CreateGraphics();
と取得してコレに対してDrawLineをしてみているのですが、
線が表示されません。
アプローチが間違っているのか、足りないおまじないがあるのか…。
どなたかお知恵をお貸しいただければ幸いです。
0454デフォルトの名無しさん
2007/09/07(金) 19:49:42まずその描画はOnPaintでやるべき。
なんとなく、Panelとかの上にTextBoxを載っけてPanelとかに枠線描いた方が楽じゃない?
0455デフォルトの名無しさん
2007/09/07(金) 19:59:40いわゆるオーナードローっぽいことがやりたいのならControlPaintを使うようだから
詳細はMSDNを見るといい
が、>>454に同意だな
0456デフォルトの名無しさん
2007/09/07(金) 20:19:15> まずその描画はOnPaintでやるべき。
TextBoxBase 以下は OnPaint が無視されたような気がする。
0457デフォルトの名無しさん
2007/09/07(金) 20:52:072003までのCPPはマネージとアンマネージはクラス分けされ、同一コード内にはかけても、そこからメモリへの受け渡しが辛かった。
2005はマネージとアンマネージを並べてかける。
つまり
int A=42
printf(A.Tostring());
みたいな事ができる。
0458デフォルトの名無しさん
2007/09/07(金) 20:56:410459デフォルトの名無しさん
2007/09/07(金) 21:15:38やってみると意外と面倒だね。
枠の幅が1でよければ、BorderStyle =BorderStyle.FixedSingleにしておいて
WM_PAINT捕まえてそこで枠を描画すればできる。
0460デフォルトの名無しさん
2007/09/07(金) 21:44:08文字列をこさえたい。リフレクション使えばできるかと思ったら、
Type.GetFileds() はフィールドの宣言順を保証しないと言う。
どうすればできる? あきらめるしかない?
0461デフォルトの名無しさん
2007/09/07(金) 21:44:35ピクチャボックスに色を塗る。
テキストをフラット枠線無しにしてピクチャの上に載せる
これが一番時間がかからない。
グラフィックで書くのも良いけど、速度は体感できない程度しか変わらない
0462デフォルトの名無しさん
2007/09/07(金) 21:47:44そもそもCILにコンパイルされた時点で宣言順なんて保証されないと思うが。
まああきらめた方がいいと思うよ(仮にできたとしても)。
0463デフォルトの名無しさん
2007/09/07(金) 21:50:44ぴったり1ピクセル分ずらすのって、むずかしくない?
0464デフォルトの名無しさん
2007/09/07(金) 21:55:20Order属性とか自分で定義して全部のフィールドに[Order(2)]みたいに付けといて
その順番で連結すれば?
それなら余計なメンバを増やしたり動作をいじったりせずにリフレクションだけでできるよ
0465デフォルトの名無しさん
2007/09/07(金) 21:58:07サイズプロパティに打つんだよ。
マウスだとちょっとズレるかもだから
0466デフォルトの名無しさん
2007/09/07(金) 22:01:35ヒント
IList
delegate
0467デフォルトの名無しさん
2007/09/07(金) 22:07:41そんなめんどくさいことするくらいなら初めから連結メソッドを定義するだろw
0468460
2007/09/07(金) 22:10:44カスタム属性か。まあ今も Excel から自動生成してるクラスなんで、
それならできそうです。
>>466
plz one more.
0469デフォルトの名無しさん
2007/09/07(金) 22:12:06確かに宣言順は保証されないんだが、
宣言順に初期化されるという保証があるので事実上宣言順に並んしまうという状態。
それを利用してリフレクションを使って順番通りに文字列をなんかするなんてソースが会社に大量にあって動いている困った状態。
どうにかして宣言順に並んでいないケースって意図的に作れないかな?
順番は保証されてないから動かない可能性があるって言っても動いてるからって理由で修正を拒まれて困ってる。
0470デフォルトの名無しさん
2007/09/07(金) 22:14:45自動生成クラスなら文字列連結メソッドも自動生成した方がいい。
自動生成クラスが何かのケースで実際に動かして動かないことが発覚するリフレクションより
コンパイル時に動かないコードになってることが分かる方がいいよ。
0471460
2007/09/07(金) 22:56:31んんん。良くわからんのだが、リフレクションは信用ならないということ?
連結メソッドにしろリフレクションしろ、コンパイルを通した上で、テスト
ケースもこなすと思うのだが。
0472453
2007/09/07(金) 23:33:24やっぱり重ねるのが楽でしょうか…。
ありがとうございました^^
>>455
了解しました、MSDN見てみます。
ありがとうございました^^
>>456
な!?
マジですか!?
処理追ってみます。
>>459
おお、その方法よさそうですね、試してみます^^
ありがとうございました^^
>>461
やはり載せる案多数ですね…。
ありがとうございます^^
とりあえず今日は退勤してまいりましたので、明日にでもいろいろやってみようかと思います。
みなさんありがとうございました^^
0473デフォルトの名無しさん
2007/09/07(金) 23:36:50メソッドは保障されてるってことだろ?
わざわざリフレクション使う内容かどうかわからないし。
0474デフォルトの名無しさん
2007/09/07(金) 23:47:590475デフォルトの名無しさん
2007/09/08(土) 00:00:35アセンブリしかできませんが、挑戦してみようかな
0476デフォルトの名無しさん
2007/09/08(土) 00:03:320477デフォルトの名無しさん
2007/09/08(土) 00:05:03今の流れはどちらかと言うと不毛な話ばっかりだと思ったが。
どこらへんが面白かったか教えてちょ!
正直c#は面白い。
0478デフォルトの名無しさん
2007/09/08(土) 00:08:330479デフォルトの名無しさん
2007/09/08(土) 00:42:40ある日、誰かがメンテをしてそのクラスを手でちょっとだけ修正を入れて
何気なくフィールドを追加しただけなのに挙動が変わったなんてことが起きるかもしれない。
せっかくの連番の属性も意味もわからないままコピペされて番号が重複したりするかもしれない。
そういうときに限ってテストケースの存在も無視される。
普通のメソッドになってれば少なくともそのメソッドの挙動は直接メソッド自体を書き換えられないと変わらないだろ。
マクロで普通のコードを生成できるのに、
リフレクションで処理しやすいようなクラスを用意するってのは本末転倒だろ。
C#のリフレクションはJavaなんかより割と速いけど普通にメソッドを叩くよりかは明らかに遅くなるだろうし。
0480デフォルトの名無しさん
2007/09/08(土) 01:09:540481デフォルトの名無しさん
2007/09/08(土) 01:46:22この表示された値(2バイト文字)をコピーしてエクセルに貼り付けると文字化けしています。
(テキストファイルなどへのコピーは平気)
エクセルへのコピーも問題なく行うにはどうればいいのでしょう?
0482480
2007/09/08(土) 02:55:090483デフォルトの名無しさん
2007/09/08(土) 03:42:070484460
2007/09/08(土) 08:26:15自動生成クラスを手でいじったり NUnit かけずに済ます文化がこちらには
ないんだが、言わんとしてることはわかった。ありがとう。
0485デフォルトの名無しさん
2007/09/08(土) 10:06:40等値比較演算子を自分で実装しないといけないの?
試してみたら自動でやってくれてるみたいだけど
0486デフォルトの名無しさん
2007/09/08(土) 10:59:150487デフォルトの名無しさん
2007/09/08(土) 13:14:240488デフォルトの名無しさん
2007/09/08(土) 13:37:18デフォルトだとValueType.Equalsが使われる。
ValueType.Equalsだが、プリミティブ型のみから構成される構造体なら
ビット比較を使うっぽい。
参照型を含んでいたりするとリフレクションでメンバごとに再帰比較してる模様。
これが遅いと言われている。
http://pc11.2ch.net/test/read.cgi/tech/1173763436/161-185
■ このスレッドは過去ログ倉庫に格納されています