09/03/05 03:34:04
なんで荒らしがわいてんだ?
323:デフォルトの名無しさん
09/03/05 03:35:05
>>322
なんで荒らしがわいてんのかわからない
324:デフォルトの名無しさん
09/03/05 03:36:49
>>322
自称エレガントな解法を示したつもりが、
誰にも相手にされなかった可哀想な一般人らしい
325:デフォルトの名無しさん
09/03/05 03:38:30
>>324
なんで必死なのかわからない
326:デフォルトの名無しさん
09/03/05 03:41:02
>>324
とりあえずNG登録だな
番号飛ぶけど
327:デフォルトの名無しさん
09/03/05 03:42:19
日曜プログラマ、まだ粘ってたんか
328:デフォルトの名無しさん
09/03/05 03:44:14
なんで文系という言葉に反応するんだろう?
329:デフォルトの名無しさん
09/03/05 03:45:51
>>325
>>326
>>327
>>328
これだから文系は
330:デフォルトの名無しさん
09/03/05 03:48:55
いいえ短小包茎です
331:デフォルトの名無しさん
09/03/05 03:51:50
string.Format("\"{0}\"", path);
332:デフォルトの名無しさん
09/03/05 07:26:57
ToolStripMenuItem で選択後、自動で閉じないようにしたいのですが
どうしたらいいのですか?
333:デフォルトの名無しさん
09/03/05 09:37:28
その奇抜なUIの設計思想を変える
334:デフォルトの名無しさん
09/03/05 10:08:16
自分でパネルにでもラベルとか作って完全に自作して実装すれば?
というかクリックして閉じないとか・・・どうやって閉じるんだ?
Windowsライクな実装の方が使い手も違和感ないと思うんだけど?
335:デフォルトの名無しさん
09/03/05 11:03:21
継承してWndProcをフックすればいけそうな気はする
336:デフォルトの名無しさん
09/03/05 11:23:00
DataGridViewにDataTableをバインドしています。
DataTableの更新が終わるまで描画処理を止めたいのですが、
ListBoxで言うところのBeginUpdate()のようなメソッドってありますか?
337:デフォルトの名無しさん
09/03/05 11:43:50
データソースをBindingSource使うようにして
RaiseListChangedEventsプロパティで一時的にイベント通知無効化して
最後にResetBindingsで更新
338:デフォルトの名無しさん
09/03/05 11:56:13
>>337
ありがとうございます。試してみます。
339:デフォルトの名無しさん
09/03/05 11:58:30
>>293-296
varの最強の用途は、コレクションの要素の型が分かりづらい場合だろう。
例えば、Dictionaryはキーとアイテムの型パラメタ<foo,bar>をとるけど、
要素型はKeyValuePair<foo, bar>。
そこで、まず、
foreach(var a in dic){
}
って書いてvarにマウスポインタを当てる。すると、ツールチップでaの型が
出てくる。この場合KeyValuePair<foo,bar>。それを書き写して
foreach(KeyValuePair<foo,bar> a in dic){
}
とする。これが最強。
varの存在意義を語って存在意義を否定してしまった。
340:デフォルトの名無しさん
09/03/05 12:00:30
>>339
あれって良し悪しだよな・・・・
341:デフォルトの名無しさん
09/03/05 12:02:58
varを右クリックして「実際の型名に置換」とかできたら、バリバリ使っちゃう。
342:デフォルトの名無しさん
09/03/05 12:04:14
>>341
グッドアイデア!
343:デフォルトの名無しさん
09/03/05 12:05:15
それヘジたんがC#3.0についてのインタビューで言ってたことだけどなぜか実装されなかった
344:デフォルトの名無しさん
09/03/05 12:05:53
リファクタメニューに「ソリューション内のvarを実際の型名に置換」機能があったら、バリバリ使っちゃう。
345:デフォルトの名無しさん
09/03/05 12:08:21
VSってアドイン作れるよね?しかも.NETで。誰か作ってよ。(他力本願)
346:デフォルトの名無しさん
09/03/05 12:10:28
IDEの問題で解決できるなら、入力候補の推測機能ってことで実装すればいいのに。
? total = 0m;
という入力を許可し、;を入力した段階でIDEが?を推論した型に置き換える。
上の例だと、自動的に
decimal total = 0m;
に置き換わる。駄目?
347:デフォルトの名無しさん
09/03/05 12:14:06
型を書くかvarを書くかという極端な判断が必要だから
その場に応じて使い分けるというのがどうしてもしづらいんだよな
var total : decimal = 0m;
はじめからこういうスタイルにしとけば型を省略しても誰も違和感を抱かなかった
今作り直したらこうなりそう
348:デフォルトの名無しさん
09/03/05 12:16:44
なるほど、varを変数宣言の開始句として、:の後に型を書くのか。
で、:を入力した時点でInteliSenseが働くと。
でも、そこを弄ったらもう、"C"#じゃないんじゃ。
349:デフォルトの名無しさん
09/03/05 12:20:23
よし、:はクラスやインタフェースの継承に使うし、最近は冗長でも
IDEの入力支援頼みでコードを英語の文章に近付けるのが流行だから、
var total as decimal=10m;
で行こう。あれ?どっかで見たことあるぞ。
350:デフォルトの名無しさん
09/03/05 12:23:23
varの存在で一歩またVBに近づいた!
閣下、我々の陰謀は成功を収めつつあります。
351:デフォルトの名無しさん
09/03/05 12:24:48
実際その点についてはVBのほうが自然だと思うよ
CスタイルのメリットはCやJavaと同じであることくらい
352:デフォルトの名無しさん
09/03/05 12:29:11
型名 変数名;
って、
Animal dog;
でしょ?どう考えても英文法的におかしい。やっぱり、英文との類似性
よりも構文の単純さやキーワードの短さが尊ばれた時代の名残だよね。
353:デフォルトの名無しさん
09/03/05 12:33:53
でも、VBのdimキーワードも、配列宣言からの流用だったりして
英単語的には怪しかったりする。やっぱキーワードはvarで。
354:デフォルトの名無しさん
09/03/05 12:36:43
省略は良くない
今はIDEがあるのだからvarもvariableにするべきだ
355:デフォルトの名無しさん
09/03/05 12:40:50
define a variable dog which is an Animal and let it be a new instance of Animal whose name is "dog";
356:デフォルトの名無しさん
09/03/05 12:47:22
おいおい、文末はピリオドに決まってるだろ
357:デフォルトの名無しさん
09/03/05 12:50:52
そうすると、フィールド、プロパティ参照のピリオドを取りやめないとな。
let the name of the dog be "ポチ".
358:デフォルトの名無しさん
09/03/05 12:50:54
文頭に挨拶を書くのが礼儀だろ
dear my computer
359:デフォルトの名無しさん
09/03/05 12:57:28
Animal myDog=new Animal("dog");
myDog.name="ポチ";
と以下が等価ってわけですね。こんなのの入力もIDEの支援で余裕だぜ!
Dear my computer. Can you please define a variable myDog
which is an Animal and let it be a new instance of Animal
whose speciesName is "dog". And then please let the name
of the myDog be "ポチ".
360:デフォルトの名無しさん
09/03/05 13:03:34
それじゃ面倒だから、これでいいよ
a d = n a("d")
d.n = "ポ"
361:デフォルトの名無しさん
09/03/05 16:10:12
C#ってC++の一種とかんがえていいの?
362:デフォルトの名無しさん
09/03/05 16:28:10
C++とC#は伯父と甥ぐらいの位置
とても一種とはいえない
363:デフォルトの名無しさん
09/03/05 16:36:58
.NET言語は、CLRありきだから、多言語との親戚関係とかの議論は意味が
ないと思う。とりあえず、C++のサブセットでもスーパーセットでもない。
シンタックスがC由来の別物言語と捉えるべき。
それに、Cを拡張して言語仕様を肥大化させてオブジェクト指向を取り入れる
C++的なアプローチとは違い、JAVAを意識した自由度より構造性を優先させた
言語になっている。そのために、JAVA的な、やりたい事に対して解法が唯一つ的
な部分がある。
のわりに、P/Invokeなど泥臭いアプローチをしてでも自由度を確保する貪欲さもあって、
やりたい事ができないという事態も滅多に生じないようになっている。
良い所だけ挙げるならば、こんな感じでバランスの取れた構造的な言語。
プリプロセッサで変態マクロが定義できるC++なんか、もう見たくもないやい。
364:デフォルトの名無しさん
09/03/05 16:53:35
VSのウイザードで作るCOMやらMFCの雛形はひどかった
365:デフォルトの名無しさん
09/03/05 16:55:21
たまたまwin32のAPIと自分が作った関数名が衝突したので
名前空間で分けたらそれでも衝突して、調べて見たらマクロ定義
だった時の憤りといったら・・・
366:デフォルトの名無しさん
09/03/05 16:57:39
C++でマクロを使う奴は馬鹿
367:デフォルトの名無しさん
09/03/05 18:34:26
だからと言って避けて通れないのがC++のどうしようもない点なわけで。
368:デフォルトの名無しさん
09/03/05 18:38:31
なにしろwin32APIが・・・MFCが・・・
369:デフォルトの名無しさん
09/03/05 18:39:26
過去を引きずるのは大変だねとだけ
370:デフォルトの名無しさん
09/03/05 19:01:25
10の位を切り上げる処理をするのに
y= Math.Ceiling (x / 10) * 10;
と書いてるんですが他にいい書き方とかありますか
括弧の使い方とかなんか不安なんですが・・・
371:デフォルトの名無しさん
09/03/05 19:29:09
>>370
>>210をリスペクトして
y = Int32.Parse(String.Format("{0:d}0", (x + 9) / 10));
とか。
(ごめん、冗談だ、念のため。別に>>370の通りで問題ないよ)
372:デフォルトの名無しさん
09/03/05 19:35:17
xが整数以外なら問題あるでしょ。
っていうか整数なら9足すだけなんだけど。。
さて質問。
Windows Form のOnLoadとか適当な場所に
DayOfWeek[] ar = (DayOfWeek[])Enum.GetValues(typeof(DayOfWeek));
listBox1.DataSource = ar;
comboBox1.DataSource = ar;
のようなコードを書くと、コンボボックスとリストボックスの選択が相互に
連動するんだけど、この仕組みと、こういう仕様の意図が知りたい。
373:デフォルトの名無しさん
09/03/05 19:46:27
データバインディング
GUIなんてデータ表示するだけなんだからわざわざTextだのItemsだの使うより
データを汎用的な形で関連付けられた方がいいよねという考え
カレント行の共有はCurrencyManager使ってコントロールの親子関係に基づいて行われる
374:デフォルトの名無しさん
09/03/05 19:54:30
>>373
ごめん、その思想自体はよくわかるんだけど、知りたいのは
2つのまったく無関係のコントロールの選択されているアイテムが連動する仕組みと、
そのような仕様にしてある意図なんだ。
375:デフォルトの名無しさん
09/03/05 19:56:20
windows formsだとそうなんだ。
WPFの場合
DayOfWeek[] ar = (DayOfWeek[])Enum.GetValues(typeof(DayOfWeek));
list1.DataContext = ar;
list1.SetBinding(ListBox.ItemsSourceProperty, "");
list2.DataContext = ar;
list2.SetBinding(ListBox.ItemsSourceProperty, "");
だと選択行は共有されないね。
376:デフォルトの名無しさん
09/03/05 22:41:17
>>341
>varを右クリックして「実際の型名に置換」とかできたら、バリバリ使っちゃう。
それ似たのがReSharperにあるよ。
377:デフォルトの名無しさん
09/03/05 22:42:44
似たようなのじゃためなんだ
僕らはC#に汚染されているんだ!
378:デフォルトの名無しさん
09/03/05 22:46:21
>>377
ReSharperはVS用のアドインだよ。確か。
まあこちとら趣味プログラマのexpress edition使い。
たっかいツールなんか使う機会なんざねーんだけどね。
379:デフォルトの名無しさん
09/03/06 00:03:40
>>268
ダメポ 続きは明日・・・・
380:デフォルトの名無しさん
09/03/06 00:09:08
ちょっと最後に質問SQL serverでLanやりたい場合一般的にDBの配置は
C:\Program Files\Microsoft SQL Serverの配下ですか?
自分で作ったC:\aaaみたいなフォルダでもいいんですかね・・・・
381:デフォルトの名無しさん
09/03/06 00:21:34
>>380
SQLサーバが自分のPCとは異なるPCにある場合、
c:\とか、ファイルを直接指定することはないよ。
接続する側→(LAN)→接続されるSQLServer
という関係で接続しているとき、
接続する側は、単に接続されるSQLServerのIPアドレス(とインスタンスと接続するDB名)を指定するだけ。
実際の物理ファイルのパス指定は接続されるSQLServerのほうで指定するので、
ConnectionStringでパスを指定することはない。
少なくとも自分が経験したスタンドアロンのSQLではそんな感じ。
382:デフォルトの名無しさん
09/03/06 00:24:32
ASP.NETの話になっちゃうんだけど
Web画面上にあるボタンをクリックするとクリックイベントが走りますよね。
でもWebだとクリックイベントの前にPage_Loadイベントが実行されますよね。
ちょくせつクリックイベントに飛ばす方法はないのでしょうか?
またPage_Loadイベントの処理の中で、Page_Loadイベントを抜けたら
次はクリックイベントが走るよというのを知る方法はありますか?
383:デフォルトの名無しさん
09/03/06 00:52:34
>>382
初期化したいのに、PostBackしたときもPage_Loadが呼ばれるから、
ボタンを押した時はPage_Loadは呼んで欲しくないということだろうけど、
そのためのIsPostBackだから、それで判断すればいいのでは?
ASP.NETの場合は、表示するたびに、そのページの新しいインスタンスが生成される。
これはwebという仕組み上仕方のないことなので、Page_Loadを実行せずに
インスタンスが生成する方法は基本的にはない。
クリックイベントが発生するということは、IsPostBackが必ずTrueだから、
それで判断すれば?
・・という意味でなかったら、contextとかみれば、イベントがあるかどうか
わかったほうほうがあるはず・・
384:デフォルトの名無しさん
09/03/06 10:01:27
>>374
無関係じゃないよ。同じ親コントロールに属して同じデータソースを参照してるじゃん。
無関係だと主張したいなら明示的にしないとだめ(Control.BindingContextプロパティ)。
仕組みはCurrencyManagerとかBindingManagerBaseとか調べれ。
意図? MSの人じゃないから答えられん。
まあ親とデータソースが同じなら現在行共有できた方が便利じゃねと思ったんじゃない?
.NET 2.0になってBindingSourceが追加されてデータソース主導になったけどな。
385:デフォルトの名無しさん
09/03/06 11:57:01
web上にあるファイルのサイズを簡単に取得する方法はありますか。
ダウンロードする前に知りたいのです。
386:デフォルトの名無しさん
09/03/06 12:00:40
簡単かどうかはその人次第だからなんとも
取得方法はそのファイルがどういうプロトコルで公開されているのかによるからなんとも
サイズ情報が公開されているかどうかはサーバ次第だからなんとも
387:デフォルトの名無しさん
09/03/06 12:04:25
HTTPならHEADで返してくれればいいけどな
388:デフォルトの名無しさん
09/03/06 15:00:26
HttpWebResponseのContent-Length
駄目な場合もあるけど
389:デフォルトの名無しさん
09/03/06 17:33:22
匿名メソッドと、ジェネリクス(Listなどのコレクション以外)で
うまいこと使用している例や、より利点がわかりやすく紹介されている
サイトがあったら教えてください教えてください。
390:デフォルトの名無しさん
09/03/06 17:43:46
>389
宿題?
391:デフォルトの名無しさん
09/03/06 17:49:54
MSDNでいいんじゃね?
392:デフォルトの名無しさん
09/03/06 18:06:45
匿名メソッドは自分だけが見るソースなら短いイベントハンドラの
定義に使うけど、推奨はできないなあ。
Button1.Click+=delegate{MessageBox.Show("Clicked!");};
とか。
処理の一部をカスタムできるメソッドを作るために使う例を
示せれば良いんだけど、できるだけLINQとか標準機能に落とし
込むようにしているので良い例がない。
ジェネリクスはやっぱり、独自のコレクションを作るとかが
多いんじゃない?
あと、幾つかデータの種類があって、それらのデータが更新された
時に更新値を受け取るコールバックを登録するメソッドが、
データの型をパラメタにとるジェネリックメソッドになっていた
のを見た事ある。でもこの場合、データの種類毎にメソッドを
用意するのと比べた場合の利点がさっぱり分からないコードだった。
393:デフォルトの名無しさん
09/03/06 18:17:46
Regex.Replaceなんかまさに匿名メソッドとかラムダ式の出番
394:デフォルトの名無しさん
09/03/06 19:08:52
>>390
宿題ではないです。
>>391
MSDNではサンプルが少ないのと、こういう時に使うと便利というのが、
イマイチよくわからないので。イベント的なコールバック用途というのは
意味はわかります。
>>392
ありがとうございます。
なるほど。自分も匿名メソッドにあまり利点を見いだせない一人です。
そのためサンプルがみたいと思ったのですが、
いいものがないということで残念です。
ジェネリクスもやはり独自コレクションがメインですか・・
コレクション以外の便利な使い方がイマイチ思いつかないので、
サンプルをお聞きしました。
395:デフォルトの名無しさん
09/03/06 19:30:11
前に複素数のジェネリック型なんて議論されていたよね。
それは特殊でかつ有用な使い方なんじゃないかな。
396:デフォルトの名無しさん
09/03/06 20:34:37
別に無理に利点を発見する必要は無いんじゃないの
必要に迫られたら使えばいい程度のものじゃないかね
397:デフォルトの名無しさん
09/03/06 21:38:25
System.Linq.Enumerableで嫌と言うほど出てくるよ
結局はコレクション操作だから微妙だけどな
くだらない例だけどEventHandler<TEventArgs>とか
398:デフォルトの名無しさん
09/03/06 21:49:34
Hoge a = 共通の前処理();
//aを使った固有の処理
共通の後処理(a);
こういうのが各所に出てきたから
void 共通の処理(Action<Hoge> action) { Hoge a = 共通の前処理(); action(a); 共通の後処理(a); }
こんなメソッドを定義して
共通の処理(a => { /*aを使った固有の処理*/ });みたいにしたことがある
399:デフォルトの名無しさん
09/03/06 21:56:13
>>394
・とくめいめそっど
Win Forms やら WPF の非同期部分で大活躍?
・じぇねりくす
基本、型を爆発させないためにある。これを踏まえると
Func<T> とかなかなかに便利な使い方じゃないか?
400:デフォルトの名無しさん
09/03/06 22:02:27
class HogeCache<T> { public static readonly Hoge Hoge = new Hoge(typeof(T)); }
これだけで型ごとに対応するインスタンスのキャッシュが作れる
Dictionary<Type, Hoge>使うよりも遥かに効率がいい
Comparer<T>.DefaultやEqualityComparer<T>.Defaultなどで使われてるパターン
401:デフォルトの名無しさん
09/03/06 22:19:30
>Button1.Click+=delegate{MessageBox.Show("Clicked!");};
こういう使い方って何でするんですか?
デザイン画面でボタンをダブルクリックするとクリックイベントのソースが出てきますが
そこにMessageBox.Show("Clicked");って記述すればいいと思っちゃうんだけど
わざわざこのように書く理由を教えてください。
402:デフォルトの名無しさん
09/03/06 22:21:19
短く書けるからって言ってんじゃん。アホかよ。
403:デフォルトの名無しさん
09/03/06 22:21:48
それだけかよw糞じゃん。
404:デフォルトの名無しさん
09/03/06 22:22:19
だから推奨はできないって言ってるだろw
405:デフォルトの名無しさん
09/03/06 22:24:25
糞すぎじゃん。
何でこんな機能つけたんだ。
406:デフォルトの名無しさん
09/03/06 22:26:37
つLINQ
ラムダ式で同じことがもっと簡潔に書けるから匿名メソッドは不要になった
そのうち非推奨だとコンパイラが警告出すようになってもおかしくない
407:デフォルトの名無しさん
09/03/06 22:28:19
状態によって、異なるクリックイベントを割り当てるのに便利かも。
状態をどこかのメンバ変数に保存して、同じメソッド内でメンバ変数の値によって分岐させるより、
処理そのものを差し替える感じ。
特に汎用できて処理を委譲できる場合なら尚更。
408:デフォルトの名無しさん
09/03/06 22:30:25
C#3.0以降なら
Click += (sender, e) => { MessageBox.Show("Clicked!") };
と書くべき
匿名メソッドと違って引数省略できないのが時々不便に感じるけど
409:デフォルトの名無しさん
09/03/06 22:52:26
匿名メソッドは List<T> 周りのメソッド眺めてみりゃどういう
感じに使うのかわかる気もするが…あえてイベントハンドラなら
一時オブジェクトに使う。WebClient とか
410:デフォルトの名無しさん
09/03/06 22:55:40
>>401
デバッグ用途で一時的に作ったようなボタンなんかだと、
それ用のイベントハンドラも短くなりがちになる。そこで、
Loadedイベントハンドラだけはxamlエディタで定義&割り当て
をしてもらって、そのLoadedイベントハンドラの中で
Button1.Click+=delegate{MessageBox.Show("Clicked!");};
って書いた方がゴミメソッドが増えなくて見やすいんだよね。
まあでも、書いたとおり、推奨はできない。
ただ、ある程度複雑なプログラムを書くと、デザイナもxamlも
あまり頼りにならなくて、コードでGUIをアレコレする必要が
出てくる場面は頻繁にある。特に動的な処理が必要な場合。
例えば、StackPanel1の子にButton1がなっているとして、
Button1のClickイベントハンドラで
Button1.IsEnabled = false;
Button Button2 = new Button() { Content = "Click Me!" };
Button2.Click += delegate {
Button1.IsEnabled = true;
StackPanel1.Children.Remove(Button2);
};
StackPanel1.Children.Add(Button2);
こんなの。これだと、Button2のVisiblityなりIsEnabledなり
をいじるイベントハンドラを書く方が自然なのでちょっと
人為的かな。
411:デフォルトの名無しさん
09/03/06 22:59:54
何の断りもなく当然のようにWPFw
初心者が混乱するよ
412:410
09/03/06 23:06:04
>>408
むしろ、その引数を省略できるという性質があるために、
引数を必要としないイベントハンドラの定義にはdelegate{}を
使っている。推奨はしない。あんまり、
void foo(object sender, EventArgs e){...}
みたいなのが増えるの好きじゃないんだよね、個人的に。
そんなわけだからイベントハンドラをメソッドとして作る場合にも
void Button1_Clicked(){
MessageBox.Show("Clicked!");
}
と引数なしのメソッドを書いて
Loadedイベントハンドラの中とかで
Button1.Click+=delegate{Button1_Clicked();};
とか書く事すらある。これも推奨はできない。
413:410
09/03/06 23:08:40
>>412と類似しているけれど唯一推奨できるのは、次のケースかな。
void 処理1(){
ほにゃらら
}
void 処理2(){
ほにゃらら
}
みたいな処理の単位であるメソッドがあって、それをボタンから
呼び出させる場合。
Button1.Click+=delegate{処理1();処理2();};
みたいに書く。
VBでもWindows FormsでもWPFでも、
入門書に書いてある事を実践すると、イベントハンドラに
何でも書くスタイルを身に着けてしまう人が多いけれど、
本来は処理を適当な粒度で分割したメソッドを定義して、
イベントハンドラはそれらを呼び出すだけの簡潔なもので
あるべき。
Model-Viewスタイルとか良くは知らない趣味プログラマだけど、
こんな感覚でやっています。
414:デフォルトの名無しさん
09/03/06 23:10:40
WPFに限った話をすると,
デザイナでイベントハンドラ追加するのがちょっとだけ面倒だったり
動的にコントロールを追加することが多かったり
基底クラスのイベントでもオーバーライドじゃなくてイベントハンドラ使うことが多かったりするから
Button1.Click+=delegateみたいなことは比較的よくやる
415:410
09/03/06 23:18:53
ごめん、なんか脇に逸れすぎてた気がする。匿名メソッドorラムダ式
を用いて処理を委譲する時の一番の利点は文句なしに「継続」だった。
でも、LINQ以外でうまい例を作れないや。
とりあえず、
void Sum10(){
int s=0;
for(int i=1;i<=10;i++){
s+=i;
}
Button1.Click+=delegate{
MessageBox.Show(s.ToString());
}
}
ってやって、どこかでSum10()を呼び出すと、Sum10からは
ちゃんと処理が戻るんだけど、その後Button1をクリックすると
sの値55が表示される、って事を知っておいて。
匿名メソッドで一番重要なのはこれなんだけど、脇に逸れ過ぎた。
非同期処理なんかをする場合には超超超~重要なはずなので
誰か例を書いてくれ。
416:デフォルトの名無しさん
09/03/06 23:29:48
わかりづらいんであんまりそういうのは多用しない方がいいと思うよ
>>415の中でs++したりするとわけがわからなくなる(サンプルとしては面白いけどね)
ローカル変数を取り込めるメリットは,>>398のようなパターンが自然に使えること
417:デフォルトの名無しさん
09/03/06 23:36:52
引継でC#やる事になったんだけど、1ファイル5000行を越えるようなものがざらにあります。
一カ所直すのにも不要なものが目に付いて頭がグワングワンしてきます。
プロパティ、イベント、その他のメソッドという分類でファイル分割しようと思ってるんだけど、君らはどうしてるの?
418:デフォルトの名無しさん
09/03/06 23:40:42
#regionでよくね
419:410
09/03/06 23:45:31
うん、>>415は意図は何もないただのサンプル。
とりあえずUIの話の続きとして「継続」の利点を書いておくと
UI以外のスレッドで何か計算して、その結果を用いてUIを更新する場合、
匿名メソッドを使うのが一番素直に書ける。コードの流れがぶった切ら
れない的な意味で。
例えば
//UIと別スレッド
while(円周率の計算精度>閾値){
円周率の計算の途中経過をtempPiに代入
Window1.Dispatcher.Invoke((MethodInvoker)()=>{
Window1.Label1.Content=tempPo.ToString();
});
}
こういう場合にメソッド定義とInvokeの引数ありバージョンを使っていたら
訳がわからなくなる。
>>417
自分の場合は#region-#endregionで
・変数定義とコンストラクタ
・プライベートメソッド
・パブリックなメソッドとプロパティ
・(あれば)カスタム可能なメソッド、プロパティ
と分けている。Ctrl+M-M, Ctrl+M-O等のショートカットは知っておくと吉。
420:デフォルトの名無しさん
09/03/06 23:51:42
>>413
> 本来は処理を適当な粒度で分割したメソッドを定義して、
> イベントハンドラはそれらを呼び出すだけの簡潔なもので
> あるべき。
理念的にはその通りだと思うんだけど、若干反発も感じるのは
その基本に忠実な書き方をすると、ベタにイベントハンドラに書いた場合と比べて
「その処理」がイベントハンドラからのみ実行される処理だという明示性が
失われるんだよね。
421:デフォルトの名無しさん
09/03/06 23:59:16
>>420
多分、その、”「その処理」がイベントハンドラからのみ実行される”
という事を前提としたコーディングが、設計の柔軟な変更などを将来的に
阻害してしまう、っていうのが、Model-View-Controlerモデルとか
その派生系とかが繰り返し提案される理由なんじゃないかな。
シンプルなプログラムだと却って変な事になってしまう事が多いのも
確かだと思うけど。
422:419
09/03/07 00:09:11
419を1から100までの和を計算し、途中経過を表示するコードに書き直し
てみた。あと、MethodInvokerはWindows Formsのだから(デリゲート
だからシグネチャが正しいので通るけど)よくなかったのでActionにして
みた。このコードは、はじめのお題の、匿名メソッドの利用例としては、
”良い”利用例だと思う。他の方法だとめちゃめちゃごちゃごちゃになる。
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Thread sum100Thread = new Thread(new ThreadStart(sum100));
sum100Thread.Start();
}
private void sum100()
{
int s = 0;
for (int i = 1; i <= 100; i++) {
s += i;
this.Dispatcher.Invoke((Action)delegate{
this.Label1.Content = s.ToString("0000");
});
}
}
xamlは
<Window x:Class="WpfApplication1.Window1" ほにゃらら
Loaded="Window_Loaded">
<Label Name="Label1"/>
</Window>
だけ。
423:デフォルトの名無しさん
09/03/07 00:30:28
それ全部100にならない?
424:423
09/03/07 00:33:36
100じゃなくて5050か
425:423
09/03/07 00:52:09
確認したけどやっぱり意味的に間違ってる
匿名メソッドは現在のスコープの変数そのものを取り込むんだ
ループ内で生成される全ての匿名メソッドが同一のsを参照してるから
ただ一つのsのインスタンスを共有することになる
ループの中でint ss = s;みたいに宣言し直してそっちを取り込むようにしないとだめ
426:デフォルトの名無しさん
09/03/07 00:56:32
え、ちゃんとくるくると1から5050まで行くけど。
コンピュータが速過ぎるんじゃない?
こういう、継続を必要とするデリゲートの場合
インナークラスが暗黙に定義されて、それがメソッドと
フィールドを持っている。デリゲートのインスタンス作成時には
このインナークラスのインスタンスが作成されて、フィールドに
必要な変数がコピーされる。これが参照型だと話がまたややこしく
なるけれど、値型ならば問題はないはず。
427:デフォルトの名無しさん
09/03/07 01:02:18
いや>>422のコードだと確実にsのインスタンス(sを保持する自動生成されたクラスのインスタンス)は
一つしか作られないよ。IL見ればわかる。
何でうまくいくのかは知らないけど意味的には確実に間違ってる。
428:デフォルトの名無しさん
09/03/07 01:12:10
ごめん、BeginInvokeじゃないから同期実行になっていた。
なんじゃこのオチ。
429:デフォルトの名無しさん
09/03/07 01:24:19
スレッドの非同期処理しか役に立たないってのもなんか寂しいな
430:428
09/03/07 01:45:16
というわけで
private void sum100()
{
int s = 0;
for (int i = 1; i <= 100; i++) {
s += i;
int s_ = s;
this.Dispatcher.BeginInvoke((Action)delegate{
this.Label1.Content = s_.ToString("0000");
});
Thread.Sleep(0);
}
}
としてみたら希望通りの動作になったんだが、
Thread.Sleep(0);
をコメントアウントすると、最後の5050しか表示されないんだけど、
ディスパッチャスレッドの優先度って低いの?
431:デフォルトの名無しさん
09/03/07 02:02:54
ようはメソッド内で使用するだけの、クラスのメンバに加えるまでもないメソッドを定義するのに便利ってこと?
432:デフォルトの名無しさん
09/03/07 02:03:06
タイムスライス内で終わってしまうからだろ。
ループもっと長くしろよ
433:デフォルトの名無しさん
09/03/07 02:06:09
あいからわずLanでつながらない…
ところで>>155さんのIPアドレスってつなぎたいSQL SERVERのPcでコマンドプロンプトIPCONFIGででる
IP アドレスですか?
おれは一体何週間これをやってるんだろうか
いろんなスレ放浪して迷惑掛けまくりで
>>170 SQL Serverのポート番号は Express Edition場合動的で コンフィグレイションマネージャーで固定する遺体です
434:デフォルトの名無しさん
09/03/07 02:12:48
>>433
まず、SQLSMSEで接続できるのか確かめなさいってば。
できた?
435:デフォルトの名無しさん
09/03/07 02:17:55
えっと・・ちょっとまって
436:デフォルトの名無しさん
09/03/07 02:19:38
サーバ名にIPアドレス、
SQLServer認証で、
設定したログイン名とパスワードで接続できる?
437:デフォルトの名無しさん
09/03/07 02:28:35
MS server management studio expressで
ファイル-オブジェクトエクスプローラで接続を選択
サーバー名を
コマンドプロンプトipconfigで得たipV4のアドレスを入れる
認証を:SQL Server認証する
ログイン:コントロールパネルのシステムにでてるフルコンピュータ名
パスワード:パソコンにログインするパスワード
でやったら・・・だめでした・・・
どこが違うのでしょう?
438:デフォルトの名無しさん
09/03/07 02:31:24
むむむ:設定した<<ログイン名>>これが、よくわかってない気がします・・・
439:デフォルトの名無しさん
09/03/07 02:33:17
フォームに関してです、BackColorにTransparencyKeyに設定した色を設定した場合、
同じバイナリを実行したときにwindows XPでは透明部分をクリックするとその背後にある別のアプリケーションをクリックすることができます。
windows vistaでは透明な部分をクリックするとそのフォームをクリックします。
vistaでxpと同様にするためにはどうすればいいでしょうか?
440:デフォルトの名無しさん
09/03/07 02:34:25
>>437
SQL Server認証は、SQL Server自体に設定する、
Windows認証(パソコンのコンピュータ名と、パソコンにログインするパスワード)とは別。
SQL ServerにSQL Server認証用のアカウントを別途設定して、
そのアカウントでログインする必要がある。
Windows認証でログインするのは、なんていうのかな、
アクティブディレクトリとか組んで、社内のネットワークに接続するのに必要な認証のことで、
それを認証の変わりと見なすってこと。
(SQLとネットワークの両方で認証したら面倒だから、ネットワークにログインする認証を
ユーザとして認めるっていうこと。Windows認証で今自分のアカウントで接続できるのはそういうこと。)
今は普通に家で勉強しているような感じだと思うので、
ネットワーク越しに接続するのにはWindows認証は関係ない。
441:デフォルトの名無しさん
09/03/07 02:43:13
SQL Server自体に設定する<<ここがよくわからないところです
MS server management studio expressで設定するのでしょうか?
442:デフォルトの名無しさん
09/03/07 02:45:14
わ もう3時か!
付きあわえて申し訳ない
もう少しググッテみます
でわっ
443:デフォルトの名無しさん
09/03/07 02:45:52
>>432
和を取るの100000までににしてみたら、ずっとマウスポインタが砂時計に
なって、最後の結果だけが表示された。
タイムスライスってそんなに長いの?数10ms単位で切り替わるんじゃないの?
444:デフォルトの名無しさん
09/03/07 02:48:48
>>441
SQL SMSEの左ペインのツリービューで、セキュリティ-ログインから設定する。
ログインを右クリして、新しいログインを作って、ログイン名を入力して、
SQL Server認証を選択して、パスワードを設定する。
さっきのリモートでのSMSEの接続には、ここで設定したSQL Server認証の
ログイン名とパスワードを設定すると接続できるということ。
バーチャルPCは、あなたのPCとは別のPCだから、
あなたのPCにログインするアカウントで、バーチャルPC内のSQLに接続はできないということ。
ただし、あなたのPCにインストされてるSQLServerは、あなたのPCにログインしているユーザを
SQLServerのユーザとしても認める設定をしているので、自分のPCのアカウントでも
ログインできましたってこと。
445:デフォルトの名無しさん
09/03/07 03:03:59
自PcからSQL Server認証試したけれどだめでした
Ipv6じゃないと だめなのかな?
446:デフォルトの名無しさん
09/03/07 03:07:40
だめですねー
V4V6同様に下記エラー
Microsoft SQL Server、エラー: 18452
444さんの通り新しいログイン作ったんですが
ミスったかな
試行錯誤してきます
447:デフォルトの名無しさん
09/03/07 03:09:37
V4でいける
SQL Server認証で通らないのなら、なんかの設定がおかしいんでしょ
バーチャルPCのファイアーウォール機能が働いていて、そもそも接続できないとか、
SQLの設定でTCP/IPの接続をそもそも許可していないとか、考えるときりがない。
448:デフォルトの名無しさん
09/03/07 03:11:16
>>446
その前にバーチャルPC上のSMSEで、そのSQLServerのアカウントでログインできる?
サーバ名に、そのバーチャルPCに割り当てられたIPアドレスを入力して。
449:デフォルトの名無しさん
09/03/07 03:14:55
いや今は自Pc(ローカル)でチャレンジ中
>>448 ハイ ちょいとおまちを
450:デフォルトの名無しさん
09/03/07 03:21:14
うは バーチャルpcにSMSEないや・・・・
ごめん
451:デフォルトの名無しさん
09/03/07 03:23:03
バーチャルPCにSMSEがないのに、
どうやってアカウントを設定できるんだ?
452:デフォルトの名無しさん
09/03/07 03:29:38
ベースのVISTA、ほうでアカウント設定したので 汗;
環境(Vista アルティメット(SMSEあり) <= (ヴァーチャルPC Xp home (SMSEなし))
453:デフォルトの名無しさん
09/03/07 03:35:08
VirtualPCのSQLServerにアカウント設定しなきゃ、
UltimetのSMSEから接続できないでしょうよ
VirtualPCは、まったく別のところにあるPCだと思わなきゃだめよ
454:デフォルトの名無しさん
09/03/07 03:44:49
いや
VirtualPCのPGからUltimetのフォルダにあるMDFにコネクトしたいので・・・
うーん
VirtualPC側にアカウント必要なんですか?
455:デフォルトの名無しさん
09/03/07 03:46:06
遅くまでありがとう
もう少し頑張る気力がわきました
456:デフォルトの名無しさん
09/03/07 04:00:16
まだ起きてるなら、しばらく付き合ってやるけど?
457:デフォルトの名無しさん
09/03/07 04:01:38
>>454
SMSEをクライアントにみかけて、
TCP/IP経由でSQLServerに接続するテストをしてみなっていってるわけだから、
その例で言えば、VirtualPCのSMSEでUltimetのSQLServerに接続するってこと。
だから、設定用のSMSEと、接続実験用のSMSEの両方ないとだめでしょうよ。
UltimetにだけしかSMSEがないということは、UltimetのSQLServerにアカウント設定してたわけで、
それでUltimetからVirtualPCのSQLServerに接続できるわけないでしょ。
やってることが、どうもちぐはぐだな。
458:443
09/03/07 04:35:32
>>430の問題解決しました。
ディスパッチャのノーマルプライオリティのキューが一杯になってしまって、
和を取っているスレッドの処理が終わってからようやくキュー内の処理が
全て完了する、という形になっていたためでした。ディスパッチャスレッド
での処理の優先順位を下げる事で、ディスパッチャがキュー内の処理を全部
やっつけようとせず、順次こなしていくようになりました。
ディスパッチャスレッドでの処理の優先順位を上げなければならないと
全く逆に勘違いして大はまりしてしまった。
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Thread sum100Thread = new Thread(new ThreadStart(sum100));
sum100Thread.Start();
}
private void sum100()
{
int s = 0;
for (int i = 1; i <= 100; i++) {
s += i;
int s_ = s;
this.Dispatcher.BeginInvoke((Action)delegate {
this.Label1.Content = s_.ToString("0");
}, DispatcherPriority.Background, null);
}
}
これでようやく、UIを非同期的に更新する処理を匿名メソッドの
「継続」の利点を生かして簡潔に書く例になりました。
459:デフォルトの名無しさん
09/03/07 04:39:04
>>443
切り替わっても Dispatcher キュー処理するほうが時間かかってる
だけだろそれ。WPF は基本保持モード
460:デフォルトの名無しさん
09/03/07 05:36:38
>>459
そうです。マウスポインタが砂時計に変わることから、ようやく、
これ、UIスレッドの方が滞っているんじゃん、と気が付けました。
461:デフォルトの名無しさん
09/03/07 06:27:10
>>458
引数いらないなら、こっちの方が良いんじゃないか。(インテリセンスに出ないけど)
Dispatcher.BeginInvoke(DispatcherPriority, Delegate)
あと、DispatcherExtensions クラスにある拡張メソッド使うと、
Dispatcher.BeginInvoke(Action, DispatcherPriority)
が使えるらしい。(型推論が効く)
462:デフォルトの名無しさん
09/03/07 08:23:33
>>457 了解SMSEインストールしてきま・・
463:デフォルトの名無しさん
09/03/07 10:19:21
>>458
知らんかった。
[EditorBrowsable(EditorBrowsableState.Never)]
[Browsable(false)]
になっているBeginInvokeがあるのね。
public DispatcherOperation BeginInvoke(DispatcherPriority priority, Delegate method);
public DispatcherOperation BeginInvoke(DispatcherPriority priority, Delegate method, object arg);
public DispatcherOperation BeginInvoke(DispatcherPriority priority, Delegate method, object arg, params object[] args);
と三つも。なんでこんな事になっているんだ?
464:デフォルトの名無しさん
09/03/07 16:22:37
疑問に思ったんだが、WPF の Dispatcher.Invoke には WinForms の
EventHandler、MethodInvoker、WaitCallback みたいに、
特別扱いされてるデリゲートは無いのかな
今夜にでもソース読んでみるか
465:デフォルトの名無しさん
09/03/07 16:41:02
>>389の質問に立ち戻る
まず、ジェネリクスに関しては、ある本でこんな例を見つけた(わりと一般的?)
タブベースのUIで、そのタブの中身はそれぞれ異なるビューであるときのベース。
namespace ContactManager.Presenters
{
public class PresenterBase<T> : Notifier
{
private readonly string _tabHeaderPath;
private readonly T _view;
public PresenterBase(T view)
{
_view = view;
}
public PresenterBase(T view, string tabHeaderPath)
{
_view = view;
_tabHeaderPath = tabHeaderPath;
}
public T View
{
get { return _view; }
}
public string TabHeaderPath
{
get { return _tabHeaderPath; }
}
}
}
466:デフォルトの名無しさん
09/03/07 16:46:03
匿名メソッドに関しては、別スレッドで画像がロードされたときに
メインのUIのサムネールを更新する例として(これはいままで議論されてたのと
基本的に同等のものだが)
Application.Current.Dispatcher.Invoke(
DispatcherPriority.Normal,
(Action)delegate { OnPropertyChanged("Thumbnail"); }
467:デフォルトの名無しさん
09/03/07 17:19:16
>>457
SMSEインスト完了 く^^
アカウント作れない・・・
このバージョンの Microsoft Windows では、MUST_CHANGE オプションはサポートされません。
がーん
468:デフォルトの名無しさん
09/03/07 17:21:16
SMSEはインストできたんだから、アカウントつくれる方に接続すればいいじゃん
469:デフォルトの名無しさん
09/03/07 18:51:15
>>468
むむむ諦めていたところに
良意見
試行錯誤中
470:デフォルトの名無しさん
09/03/07 19:05:47
C#になんの関係もないことに、そろそろ気付けよ・・・
471:デフォルトの名無しさん
09/03/07 19:07:45
C#でネットワーク越しにDBに接続できないから始まって、
ならまずはManagement Studioで接続できる?の話になってるから、
関係無いとも言えるし、継続してるから関係あるとも言える。
472:469
09/03/07 19:13:04
Vistaで作成したアカウントでXpのSEMSから接続
サーバーの種類 データーベースエンジン
サーバー名 IPアドレス 999.999.999.999(IPconfigでvistaから得た)
SQL Server 認証
ログイン名 ja
パスワード *****
結果
サーバーへの接続を確立しているときにエラーが発生しました。SQL Server 2005 に接続しているときときに
このエラーが発生した場合は、SQL Server の既定の設定がリモート接続を許可しないようになっていることが
エラーの原因である可能性があります。 (provider: 名前付きパイプ プロバイダ,
error: 40 - SQL Server への接続を開けませんでした) (Microsoft SQL Server、エラー: 1326)
・・・で、もって
Vistaのセキュリティー構成をリモート接続をTcpipのみしてみたが
だめだったので(Tcptip及びパイプ)へ戻すが・・・ここでひらめいたXpのリモート接続を(Tcptip及びパイプ)変更
サービス停止再起動
結果 上記と同じ・・・・だああああああああああああああああ<<<今ここ
473:デフォルトの名無しさん
09/03/07 19:15:11
他の方法でちゃんとつながるようになってから来い、ってことだわな。
474:469
09/03/07 19:15:50
>>470
それはすっごく気にしてる
申し訳ない
今まで(一週間位)指摘されないこともすごく感謝してました
「ありがとうそしてごめんなさい」としか言えない
475:469
09/03/07 19:17:24
>>473
ローカルでは繋がるんですけどね
今日でわからなかったら諦めるから
目をすぶってくれ
476:469
09/03/07 19:20:11
つぶってくれ ・・・
477:デフォルトの名無しさん
09/03/07 19:23:50
>>472
他の要因が原因に成りにくい方法から、一つずつ確実にテストしなくちゃだめだな。
なんで、VistaのSQLSMSEで、VistaのSQLに、SQL認証で、そのアカウントで接続できるかどうかが第一点。
1)接続できなかったら、アカウントの設定が間違ってる。
2)接続できたら、アカウントの設定は正しいので、ネットワーク越しの接続に不備がある。
・この場合、VistaやXPのファイアーウォールやアンチウィルスのファイアーウォールの可能性
・SQLServerの設定でTCP/IP越しの接続ができなくなってる
・SQLServer2005だと、Advanveなんちゃらをインストしてないと、リモート接続が許可されないとか、
そんなのもあった気がする。
478:デフォルトの名無しさん
09/03/07 19:26:07
アカウントってなんだよ・・・
SQL Server 認証に NT アカウントは関係ないぞ。(TCP/IP なら)
479:デフォルトの名無しさん
09/03/07 19:33:24
ログイン名:ja
↑こんなログイン作ったのか? 最初からあるのは「sa」だぞ?
あとは、ポート 1433 を開けてあるのか確認すれ。
480:469
09/03/07 20:25:54
うん
簡単にできたから面白くて
maとjaとか作った
vistaの
コンフィグレーションマネージャーで動的ポート消して
IPALLを1433に変えて再起動
ダメ
というより
ローカル(vista内)でさえSQLserver認証できてないような信頼がどうのかとか
481:デフォルトの名無しさん
09/03/07 20:30:31
もういいでしょ。SQLサーバの設定正しくできるようになってから、またおいで。
482:469
09/03/07 20:33:56
わかった
すまなかったごめんな
皆さん急がしいところ2週間もありがとうございました
483:デフォルトの名無しさん
09/03/07 20:52:54
>>481
本当に役立たずだなお前
484:デフォルトの名無しさん
09/03/07 21:06:56
在日がイライラしてんだろ察してやれ
485:デフォルトの名無しさん
09/03/07 21:09:32
うわ・・・
486:デフォルトの名無しさん
09/03/08 00:18:13
スレ違いは別にいいんだけどさ、勝手な略語を書き込みまくるのはやめれ
URLリンク(msdn.microsoft.com)(SQL.90).aspx
487:デフォルトの名無しさん
09/03/08 01:42:23
C#でWindows Formアプリーケーションを作成し、WebBrowserコンポーネントを
乗せています。
そこにSVGファイルを表示させたいのですが、実行するとコンポーネント内には
--------------------------------------------------------------------
取り消されたアクション
Internet Explorer は、要求された Web ページにリンクできませんでした。
要求された Web ページは現在、利用できない可能性があります。
--------------------------------------------------------------------
と表示され、別途IEが起動します。
別途起動したIEには「セキュリティ保護のため、コンピュータにアクセス
できる・・・」といういつものメッセージが表示され、
「ブロックされているコンテンツを許可」を選択すると正常に表示されます。
そのファイルをHTMLでラップするとIEの起動は止められますが、
コンポーネント内には空白と赤×のアイコンが出るだけです。
恐らくブラウザコンポーネントのセキュリティ設定の問題だと思うのですが
Windows Formアプリケーションから呼び出したときだけセキュリティの
レベルを下げることは可能なのでしょうか?
それとも別の開放があるのでしょうか?
ちなみに読み込ませるファイルはローカルにあり、自分で書いた安全な物です。
488:デフォルトの名無しさん
09/03/08 01:58:59
>>487
URLリンク(codezine.jp)
489:464
09/03/08 02:16:10
URLリンク(msdn.microsoft.com)
> ディスパッチャ操作にこのデリゲートを使用する必要はありませんが、
> DispatcherOperationCallback と SendOrPostCallback は動的な呼び出しを使用します。
この文章がまじで意味不明だったんだが、大体分かった。
DispatcherOperationCallback と SendOrPostCallback *以外は* DynamicInvoke() される。
で、>>461の DispatcherExtensions クラスの拡張メソッド BeginInvoke() を使うと、
Action を DispatcherOperationCallback でラップしてくれる。
490:デフォルトの名無しさん
09/03/08 02:30:09
>>488
COMですか・・・。
と言うことはWebBrowserコンポーネントじゃなく、COMのaxWebBrowserを
使うということでしょうか?
後、これは.Net 3.5、Visual Studio 2008でも通用するテクニックなのでしょうか?
明日試してみます。ありがとうございました。
491:488
09/03/08 03:15:24
>>490
ごめん、自分で実装したことはないから詳細は不明
とりあえず、
webbrowser IInternetSecurityManager
のキーワードで検索するといろいろ引っかかるから使えるかどうか調べてみてください
492:デフォルトの名無しさん
09/03/08 03:23:31
>>491
はい。とりあえずやってみます。
正直COMはあんまり良く理解してないのでWebBrowserコンポーネントで
何とかできるとありがたいのですが・・・。
493:デフォルトの名無しさん
09/03/08 12:47:41
>>489
型推論が効くって説明は誤っていると思っていたので気になって
いたんだけど、了解した。
Dispatcher.BeginInvoke((Action)delegate{},優先度);
って書くと呼び出しが高速になるって事だね。それで引数が必要ならば
拡張メソッドじゃない標準のBeginInvokeを使って
DispatcherOperationCallbackかSendOrPostCallback
を使えば良いと。
ところで、
using System.Windows.Threading;
しても、この拡張メソッドがInteliSenseに出てこなくて拡張メソッドが
有効になっていない気配だったので気になって調べて見たら
System.Windows.Presentation
への参照を追加するのが必要なのね。これでめでたくInteliSense
に出てきました。
494:デフォルトの名無しさん
09/03/08 13:45:57
C#2.0、ジェネリクスメソッドで、型のインスタンスを生成して返すことってできますか?
できるのなら、どうすればいいでしょうか。こんなことをやりたいです。
public T Hoge<T>()
{
return new T();
}
495:デフォルトの名無しさん
09/03/08 13:53:14
public T Hoge<T>() : where T : new() { return new T(); }
ちなみにこのnew T()はActivator.CreateInstance<T>()のシンタックスシュガー
496:デフォルトの名無しさん
09/03/08 14:48:35
おお、できたありがとう!
497:デフォルトの名無しさん
09/03/08 19:56:56
GenericなFactory ですね
498:デフォルトの名無しさん
09/03/08 22:31:15
ジェネリックコレクションに格納されているデータで
引数で渡した値が存在するかをチェックしたいのですが
パフォーマンスが良いやり方を教えていただけないでしょうか?
↓こんなんじゃあパフォーマンス悪すぎですよね・・・
private bool Search(string keyword)
{
foreach(string value in this._data)
{
if(value == keyword)
{
return true;
}
}
return false;
}
499:デフォルトの名無しさん
09/03/08 22:35:47
一般にはそれしかない
_dataがList<T>や配列ならFindとか使えばいい
500:デフォルトの名無しさん
09/03/08 22:39:21
std::setみたいのって無いの?
501:デフォルトの名無しさん
09/03/08 22:39:44
.NET3.5で要素が重複しないならHashSet<T>使えば速いかも
502:デフォルトの名無しさん
09/03/08 22:47:37
_dataについてIEnumerable<T>型であること以上のことがわからないのであれば,
asでICollection<T>にキャストしてnullなら>>498方式,nullでなければICollection<T>.Contains
を使うのが一般に速いはず
LINQが使えるなら何も考えずEnumerable.Containsを使えばいい
(こういう小細工は中でやってくれるから)
503:デフォルトの名無しさん
09/03/08 23:59:18
main()があるクラスの名前ってどうしてる?
IDEの吐くスケルトンのデフォのProgramのままが普通なんだろうか。
あと、グローバルなシングルトンを取得する静的メソッドを寄せ集めたクラスって
定番の名前とかあるのかな。
504:デフォルトの名無しさん
09/03/09 00:01:24
どっちも絶対にinternalにするので名前なんてどうでもいい
505:デフォルトの名無しさん
09/03/09 00:05:15
>>503
クラス名・変数名に迷ったら書き込むスレ。Part14
スレリンク(tech板)l50
506:デフォルトの名無しさん
09/03/09 00:06:35
>>505
なにこの俺にぴったりのスレ。
507:デフォルトの名無しさん
09/03/09 00:21:07
>>504
コードを書く人にとってはそうでも、コードを読む人(3ヶ月後の自分を含む)
にとってはそういう考え方は困る。
少なくとも普通はクラスファイルが数十以上になる、
ある程度実用的なコードを書いてる場合は。
前にも書いたけど、やっぱり2chってトリビアルな知識はなぜか妙に詳しいが
大きなプログラムは書いたことないし書けない人間が多いのかな。
508:デフォルトの名無しさん
09/03/09 00:22:48
最後の2行がなければ全面的に同意したのに
509:デフォルトの名無しさん
09/03/09 00:25:42
大きいの作るときにグローバルインスタンス寄せ集めクラスはそもそもどうかと
510:デフォルトの名無しさん
09/03/09 00:57:31
>>507
個人的には C# だと名前変えるのそんなに大変じゃない場合が
多いから >>504 とは別の理由で結構無頓着だなぁ
名前ってウダウダ考えるより書いてないときにひょんと来たり
整理してから思いついたりするから後回しにしてそういう時間を
とるほうを優先するかな。
511:デフォルトの名無しさん
09/03/09 09:40:54
どうでもいいというのは、その状況で適切な名前をつければいいと言うことであるわけで
何か固定の名前を付けるなんて小規模で1人でやってる場合ならいいが
512:デフォルトの名無しさん
09/03/09 16:55:32
C#からFlashをocxで呼び出して表示させると、
Microsoft OEM Readyプログラムのテスト5で
バッファーアンダーランのようなエラーで止まってしまうんですが、
何か良い方法はないのでしょうか。
FlashはAS2とAS3で、それぞれステージだけある空のswfファイルです。
---
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Windows\system32\Macromed\Flash\Flash10b.ocx -
Flash10b+0x3ef4a:
673fef4a 8a08 mov cl,byte ptr [eax] ds:0023:11012000=??
513:デフォルトの名無しさん
09/03/09 17:42:59
rubyでMechanize使って実装していた処理をC#に移植中なんですが
「Webページのテキストボックスに文字列を入力してsubmitボタンを押す」
というような処理をするときWebBrowserクラスを使うしかないんでしょうか
できればDocumentCompleteで待つように別スレッドが発生しないクラスがあればうれしいのですが・・・
514:デフォルトの名無しさん
09/03/09 17:49:00
多分IronRubyとか使ってRubyのを使えるだけそのまま使った方がいい
515:デフォルトの名無しさん
09/03/09 17:50:47
なんでC#なんだろ
516:デフォルトの名無しさん
09/03/09 18:38:40
Linqについて勉強しようと思っているのですが、何かお薦めの本があれば教えてください
517:デフォルトの名無しさん
09/03/09 19:13:43
もしかしたら、.NET Frameworkのバグ(?)を見つけたかもしれないんですが、
本物か勘違いか、皆さんのご意見を伺いたいです。まずはサンプルコードを。
-----------------------
Type type = typeof(List<string>); // 型は何でもいいです
type.GetInterfaces(); // .NET Framework 1.1以降のメソッド
type.GetGenericArguments(); // 2.0以降のメソッド
Type delegator = new TypeDelegator(type);
delegator.GetInterfaces(); // 無問題
delegator.GetGenericArguments(); // NotSupportedExceptionをthrow
type.Equals((object)delegator); // false <= ???
type.Equals((Type)delegator); // true
delegator.Equals((object)type); // true
delegator.Equals((Type)type); // true
-----------------------
解説は次のレスで。
518:デフォルトの名無しさん
09/03/09 19:16:00
勘違い
以上
519:デフォルトの名無しさん
09/03/09 19:25:00
URLリンク(msdn.microsoft.com)
> TypeDelegator クラス
> Type オブジェクトをラップし、すべてのメソッドをこの型にデリゲートします。
という継承用のヘルパークラスなんですが、以下の二点について。
(1) Typeクラスのメソッドのうち、.NET 2.0以降でサポートされたメソッドをサポートしていない?
きちんと確かめたわけではないのですが、TypeDelegatorでは.NET 1.1の時点で
Typeがサポートしていたメソッド以外について委譲(デリゲート)を実装していないように見えます。
通常は、Type.GetGenericArguments()を呼ぶと、実行時にはSystem.RuntimeTypeの実装を呼ぶので
問題ないのですが、TypeDelegatorから呼ぶと、継承元のメソッドであるType.GetGenericArguments()
が呼ばれます
また、SSCLIにあるコードによれば、Typeでの実装は
URLリンク(labs.developerfusion.co.uk)
> public virtual Type[] GetGenericArguments()
> {
> throw new NotSupportedException(Environment.GetResourceString("NotSupported_SubclassOverride"));
> }
となっているらしいので、TypeDelegator.GetGenericArguments()を呼ぶと
NotSupportedException(「派生クラスには実装を指定しなければなりません。」)が投げられてしまうようです。
520:デフォルトの名無しさん
09/03/09 19:38:51
ジェネリクスでも、メソッドの引数としてType typeof(T)を渡すとSystem.RuntimeTypeが渡されるけど
同じ場所でtypeof(T).ToString()を渡すとTのクラス名が渡される
なぜだ?
坊やだからさ
521:デフォルトの名無しさん
09/03/09 19:39:16
(2) Type.Equals((object)TypeDelegator)の判定が正常でない?
Type.Equals(object)の方を呼んでTypeDelegatorのインスタンスを渡した場合のみ、
同じTypeを指していてもfalseが戻るようです。
こちらは原因がさっぱり分かりませんが、正常な判定ではないような気がします。
---------------------
というのが私の意見なのですが、勘違いぽかったらツッコミをお願いします。
522:デフォルトの名無しさん
09/03/09 19:48:26
>>520
すいません、もう少し詳しくお願いします。
523:デフォルトの名無しさん
09/03/09 20:04:35
とあるジェネリクスメソッドGeneticMethod<Nullpo>内で
public void Method(Type type)としてMethod(typeof(T))とすると、
MethodにはSystem.RuntimeTypeが渡される
同じジェネリクスメソッド内から
public voix Method(string typeName)としてMethod(typeof(T).ToString())とすると、
Methodには、Nullpoが渡される
524:デフォルトの名無しさん
09/03/09 20:11:34
>>523
申し訳ない、その場合どこが問題なのか分からないです。。
525:デフォルトの名無しさん
09/03/09 20:18:10
引数として渡しているのは、同じNullpoなのに、片方はなぜかSystem.RuntimeTypeが返るんだぜ
なぜだ
526:デフォルトの名無しさん
09/03/09 20:59:00
.NET版のwikipediaってないですか?
C#とMSDEとかで作られてるやつ。
社内のシステムに取り入れたいんです。
527:デフォルトの名無しさん
09/03/09 21:04:23
>>526
Wikipedia はないだろ。Wiki はあるけど。
528:デフォルトの名無しさん
09/03/09 21:10:32
>>527
wikiを教えてください。
529:デフォルトの名無しさん
09/03/09 21:17:58
ぐぐったら 三番目にでてきた
URLリンク(csharp-source.net)
DotNetNuke(DNN) にも、Wiki の機能はあったはず。
530:デフォルトの名無しさん
09/03/09 21:24:08
>>525
typeof(T)がSystem.RuntimeTypeなのは、もちろん当然ですよね。
typeof(T).ToString()がstringなのも、やはり当然ですよね。
具体的に、どの辺が問題だというお話なんでしょう?
531:513
09/03/09 21:27:58
>514 >515
.NETの機能を使えと上に言われて組んでる感じです
何でなのかは・・・よくわかりません・・・w
このレスの感じだとWebBrowser使うしかな下げな感じですかね
レスポンスありがとうございました
532:デフォルトの名無しさん
09/03/09 21:29:13
>>530
typeof(T).ToString()はstringだけどNullpoだって
typeof(T)をTypeとして渡してType(T).ToString()がSystem.RuntimeTypeなら、
typeof(T).ToString()がSystem.RuntimeTypeでないのはなんでだぜ?
533:デフォルトの名無しさん
09/03/09 21:39:39
>>531
ううん。
HttpWebRequest でリクエストして、結果を受け取って、
さらに Post する。
atmarkIT とかにサンプルあるよ。
534:デフォルトの名無しさん
09/03/09 21:41:48
話がかみ合ってないんだから、へんなたとえ話するのやめろよ
535:デフォルトの名無しさん
09/03/09 21:43:19
>>531
WebBrowserはGUIありきなので表示しないのなら使うべきでない
標準ライブラリにはスクレイピング用ライブラリは存在してない
自前で実装するかCodeProjectあたりから拾うかしないと駄目だな
あ、IEを非表示で使う? でもIE7から面倒になったような気がする
536:デフォルトの名無しさん
09/03/09 21:49:42
URLリンク(www.atmarkit.co.jp)
基本はこの辺かな?
537:デフォルトの名無しさん
09/03/09 21:50:16
>>532
private static void GenericMethod<T>()
{
Method(typeof(T));
Method(typeof(T).ToString());
}
private static void Method(Type type)
{
Console.WriteLine(type);
}
private static void Method(string type)
{
Console.WriteLine(type);
}
GenericMethod<Nullpo>() の出力結果:
Nullpo
Nullpo
538:デフォルトの名無しさん
09/03/09 22:17:06
>>537
パソコンから「ガッ」って音がしました!
539:デフォルトの名無しさん
09/03/09 22:21:04
>>537
いやいや
private void Method<T>()
540:デフォルトの名無しさん
09/03/09 22:21:26
>>537
まだ私が何かわかってないのかもしれませんが、
Type型インスタンスをstring型の引数に渡したら、暗黙にToString()が呼ばれる以上、
両方とも"Nullpo"というstring型インスタンスとしてWriteLine()に渡るのは、
特に不思議ではないのでは。
私が>>517-521で疑問視しているのは、Type型のスーパークラスであるobject型を引数に取る、
Equals(Type)のオーバーロードであるEquals(object)の結果が、Type型のそれと異なっている
のは不自然だし、そもそもEquals()の常識的に考えられる結果と齟齬しているのではないか、
ということなのですが。
541:デフォルトの名無しさん
09/03/09 22:32:15
>Type型インスタンスをstring型の引数に渡したら、暗黙にToString()が呼ばれる以上
呼ばれません。WriteLineの引数の型はobject型で中でToStringを呼んでます。
542:デフォルトの名無しさん
09/03/09 22:40:03
コネクションプーリングってやつはado.netが勝手にやってくれるもんなんすか?
プログラムでは、DBに接続してSQL発行して切断するというロジックを組んでも
内部的には切断されずに次の処理のためにセッションを保持しててくれるの??
543:デフォルトの名無しさん
09/03/09 22:41:51
RuntimeTypeがType.Equals(Object)の実装をオーバーライドして
単純な参照比較に変更してるのが原因みたい
どう考えても明確な意図があってやってると思われるのでたぶん仕様なんだろう
544:デフォルトの名無しさん
09/03/09 22:46:23
>>542
はい。設定は、接続文字列でやります。
545:デフォルトの名無しさん
09/03/09 23:01:38
>type.Equals((object)delegator); // false <= ???…(1)
>type.Equals((Type)delegator); // true…(2)
>delegator.Equals((object)type); // true…(3)
(1)と(2)はともかく,(1)と(3)で結果が違うのはObject.Equalsの要求仕様に反してるね
だけど今更こんな基礎的なとこを変えるのはありえないので仕様と考えるしかないな
546:デフォルトの名無しさん
09/03/09 23:17:48
動的にイベントを追加するときに
もう既に追加されているかどうか確認してから
追加されてないときだけ、イベントを追加したいのだけど
どうすればいいのですか?
547:デフォルトの名無しさん
09/03/09 23:18:08
2ちゃんねる風の掲示板で.net版ってありますか?
548:デフォルトの名無しさん
09/03/09 23:18:48
>>541
なるほど。
どちらにせよ、該当メソッドの実装意図から考えても不自然な挙動ではないように思います。
>>543
>>545
確かに、これは仕様と考えて対処した方が良さそうですね。
いちおう、TypeDelegatorの件(>>517)も気になるので合わせて報告しておきたいのですが、
こういうのってどこに報告すればよいんでしょうか。
549:デフォルトの名無しさん
09/03/09 23:37:06
>>546
直接には無理。追加したらフラグ立てとくしかない。
イベントというのはそういうもの。
>>548
いやTypeDelegatorは継承して必要なメソッドをオーバーライドするものなので
好きにオーバーライドして使えということだろ
NotSupportedExceptionを投げるのが既定の実装なんだから何もおかしくない
550:デフォルトの名無しさん
09/03/09 23:45:09
TypeDelegatorってTypeの派生クラス作るときにabstractメンバ全部実装するの面倒だから
既定の丸投げ実装を提供してるだけなんだと思う
GetGenericParametersはabstractじゃないんだから当然そのまま
GetGenericParametersに限らずTypeの他のvirtualメンバもTypeDelegatorでは実装されてない
551:550
09/03/09 23:46:01
GetGenericArgumentsだった
552:デフォルトの名無しさん
09/03/09 23:46:13
>>517
これって、type.Equals()はRuntimeType.Equals()を呼んでいて、delegator.Equals()はType.Equals()を呼んでるから
結果が違うんじゃないの?
RuntimeType.Equals()は
obj == this
だし、Type.Equals()はUnderlyingSystemTypeを比較してるみたいだけど。
TypeDelegatorのUnderlyingSystemTypeはコンストラクタで代入したTypeのインスタンスのUnderlyingSystemTypeを
返してるみたい。
>>545
>Object.Equalsの要求仕様
今まで特に気にして無くて初めて知ったので読んでみたい。詳細キボン
553:デフォルトの名無しさん
09/03/09 23:50:24
>>549
確かにそれも一理あると思います。
ただ、ドキュメントの一行目に
Type オブジェクトをラップし、『すべての』メソッドをこの型にデリゲートします。
と書いてあるわけで、実際には委譲されないメソッドが存在するのは、
ドキュメントを読んだライブラリ利用者が期待する挙動に即しているとはいえないのでは。
554:デフォルトの名無しさん
09/03/09 23:52:09
>>552
MSDNのObject.Equalsのページに載ってる
>>553
そういうのは九割九分ドキュメントの方が悪いw
よくあること
555:デフォルトの名無しさん
09/03/09 23:55:44
>>546
別に重複して登録されたりはしないよ。
556:デフォルトの名無しさん
09/03/10 00:00:24
重複して登録されるよ。
557:555
09/03/10 00:02:27
試してみたら重複して登録される...orz。
558:555
09/03/10 00:05:30
ちょうどObject.Equalsの話が出ているのでついでに書いておくと
デリゲートってインスタンスが違くても参照先のメソッドが等しければ
等価って判定されるんだよね。いわゆる値比較ってやつ。
だから、イベントの登録、削除もそれを反映していると勘違いしていた...orz.
559:デフォルトの名無しさん
09/03/10 00:05:40
>>552
どうもそういうことみたいですね。
>>554
これのせいで2~3日潰した方としてはかなり文句が言いたい感じですがw
むぅ~
560:デフォルトの名無しさん
09/03/10 00:12:39
>>554
thx
今回引っかかってるのは
・x.Equals(y) は y.Equals(x) と同じ値を戻します。
ってやつか。
561:デフォルトの名無しさん
09/03/10 03:16:14
>>546
remove して add すればいい
562:デフォルトの名無しさん
09/03/10 07:13:11
+=は?
563:デフォルトの名無しさん
09/03/10 07:53:07
>>546
どこで追加したかわかってないような設計をまずやめろ
564:513
09/03/10 09:04:58
>533 >535-536
遅くなったけど ありがトン
勉強してみます
565:デフォルトの名無しさん
09/03/10 10:06:00
デリゲートが理解できずに苦しんでるんだけど、
昔のvbでいうと、evaluate関数みたいな使い方ができるってこと?
566:デフォルトの名無しさん
09/03/10 10:16:56
うんにゃ
567:デフォルトの名無しさん
09/03/10 10:17:25
URLリンク(up2.viploader.net)
自宅にあるVS2008expressから別パソコンにソリューションファイルを移して
これまたVs2008expressで起動したんだけど
こういう表示がでて、上手くプログラムが動かないんだが・・・。
具体的にはgmailのサーバーにつなげるセッションが完了しない。
解決法ご存じの方いますか。
568:567
09/03/10 10:18:26
あ、言い忘れてました。
ソースファイルのパスは自宅パソコンのパスになってるので
このパスを実行パソコンのソリューションファイルのパスに変更できれば
直るのかなーと思っているんだけど・・・。
569:デフォルトの名無しさん
09/03/10 10:20:31
Mail.csを追加するときに「リンクとして追加」やってない?
普通にプロジェクトに追加しないと
570:567
09/03/10 10:21:30
あああ・・・すみません。
もう一つ言い忘れが。
自宅のPCはVistaで.slnを移動して実行しようとしている環境はXPです。
571:デフォルトの名無しさん
09/03/10 10:22:22
リビルドしたか?
572:デフォルトの名無しさん
09/03/10 10:23:27
>>567
ソリューションのプロパティ→構成プロパティ→構成
でビルドすべきプロジェクトにチェック入ってる?
573:567
09/03/10 10:27:18
>>569
早速の解答ありがとうございます。
slnファイルから起動しているので
既にプロジェクトに組み込まれている感じなんですが・・・。
ソリューションエクスプローラー上にもファイルの表示がされているし
Mail.csのプロパティの完全パスっていう項目も
現在のPCのパスになっているから、問題はなさそうなんですが。
一応既存の項目の追加でもう一度Mail.csを読み込んでみましたが
改善はないようです・・・。
574:567
09/03/10 10:33:30
>>571
デバッグ実行時にMainFormは開けているので、
リビルドというか、ビルド自体は出来てると思うんですが
エラーウィンドウをみる限り、Mail.csを上手く読み込めてない感じかなあ?
>>572
ソリューションのプロパティには
・スタートアッププロジェクト
・プロジェクト依存関係
・デバッグソースファイル
の3項目しか表示されてないんですが
これは自分のIDEがExpressだからでしょうか・・・。
575:567
09/03/10 10:43:44
うーん・・・
これは現在のPCのネット環境の問題かも知れないですね。
自宅ではGmailに接続できるのに、現在のPCでは接続できないぽ・・・。
メール関連のライブラリはTKMPって奴を使ってるんですけど
こういう現象って起こりうる物でしょうか。
576:デフォルトの名無しさん
09/03/10 10:55:02
>>574
かも。572はPro版を見て言った。
Proでソリューションのプロパティはこうなってる。
→共通プロパティ
→スタートアッププロジェクト
→プロジェクト依存関係
→デバッグソースファイル
→構成プロパティ
→構成
てか「ビルド」メニュー→「構成マネージャ」でもひらける。
577:デフォルトの名無しさん
09/03/10 10:55:37
>>574
移動したらビルドじゃ駄目だよ。
念のためクリーンしてからリビルドしてみ
578:デフォルトの名無しさん
09/03/10 10:56:37
.cs,.sln,.csproj以外のファイル全部消してリビルドしてみて
579:567
09/03/10 11:05:41
多数の返答ありがとうございます。
>>576
あー
ビルド→構成マネージャ の表示がそもそもないですね。
でもこの機能2003pro使ってた時に使ってたんで、おっしゃりたい事はわかりました。
デバッグの際にReleaseかDebugか選ぶ項目ですよね。
Expressにはないみたいですね~。
>>577
クリーンという作業は>>578さんが言っているような事でしょうか・・・
すみません汗
>>578
formのresxっていうのも消したらデバッグエラーが起こるようになってしまい
プログラムが起動しなくなりました。
これも消してよかったんでしょうか。
580:デフォルトの名無しさん
09/03/10 11:20:52
resxも消しちゃダメ
objフォルダとbinフォルダを丸ごと消すだけでいい
Expressにもビルド構成はあるけど既定では表示されてないだけ
ツールーオプションーすべての設定を表示
プロジェクトおよびソリューションービルド構成の詳細を表示,常にソリューションを表示 にチェック
テンプレに入れるべき
581:567
09/03/10 11:26:12
うは!
繋がりました!
とりあえず、obj bin releaseフォルダを全削除してリビルドを行いました。
それでも接続のセッションが上手く行かなかったんですが
imap から pop にサーバーを変更したら繋がるようになりました^^;
自宅のPCからはimap.google.comに繋がるんですけどね・・・。
不思議な事だ。
みなさんお手間かけさせてすみませんでした
今回の問題の解決にあたり、皆さんの助言のおかげで
副産物がたくさん手に入りました。
とりあえず >>580さんのすべての設定を表示はかましときます!
ありがとうございました~♪
582:デフォルトの名無しさん
09/03/10 13:51:35
.NET のライブラリのソースコードを、
MSが公開する前から公開してたサイトがあったんだけど、どこだかわかる人います?
以前はググればでてきたんだが、今は「マイクロソフトが公開!」的なブログサイトばかりで見失ったorz
583:デフォルトの名無しさん
09/03/10 14:13:08
自作コンポーネントを作ってGUI上でコンポーネントを
ダブルクリックしたらイベントが自動的に登録されるようなのを
書きたいんですが、分かり易いサンプルないでしょうか。
584:デフォルトの名無しさん
09/03/10 14:19:44
>>582
SSCLIでググればそれっぽいのが出てくるけど
実際の.NETのソースコードと同じである保証はないし公開範囲も狭いよ
やっぱりデバッグ用に公開されてるのを見る方がいい
NetMassDownloader使えばローカルに一括保存できる
>>583
[System.ComponentModel.DefaultEvent("対象のイベント名")]
class MyControl : Control {
585:デフォルトの名無しさん
09/03/10 14:44:43
>>584
よーしダウンロードしてみるぜ!
586:デフォルトの名無しさん
09/03/10 15:12:15
ダウンロードながいな しかもx64もあるからさらに倍か・・
587:デフォルトの名無しさん
09/03/10 15:52:30
ちんこ大きいからサンプルも置いといてやろう
URLリンク(msdn.microsoft.com)(VS.80).aspx
588:デフォルトの名無しさん
09/03/10 16:09:28
太っ腹ですねデブ
589:585
09/03/10 19:04:01
早速、ダウンロードしてみたんだけど、.net2.0でSystem.Webが取得できないみたいなんだけど、
他の人もそうかな?.net3.5なら取得できるんかな。
ダウンロードできないので激しくショックだぜ
590:デフォルトの名無しさん
09/03/10 19:09:18
クラスの破棄について質問なのですが、
~Class()
{}
空のデストラクタを指定するだけでメモリを解放してくれるのでしょうか。
というより、必要がないのですか。
591:デフォルトの名無しさん
09/03/10 19:13:31
IDisposeのあるものは、Disposeをしたほうがいい。
というより、インスタンス生成時にusing句を使ったほうがいい。
IDisposeのないものは、ガベージコレクタが回収してくれるから、そのままでいい。
592:デフォルトの名無しさん
09/03/10 19:19:28
デストラクタでDisposeするのは絶対やってはいけないこと
そもそもPInvokeでアンマネージリソース抱えてたりしない限りはデストラクタは不要
というかパフォーマンスが落ちるので不要なデストラクタは書いてはいけない
593:デフォルトの名無しさん
09/03/10 19:34:18
>>591-592
ありがとうございます。
必要ないわけですか。ということは、
C++でやってた後始末みたいな事がまるで不要という事ですね。
594:デフォルトの名無しさん
09/03/10 19:35:29
IDisposableを実装してようがしてなかろうがGCには回収される
Disposeし忘れてもファイナライザで解放処理が呼ばれるように実装するのが普通だからたいがい大丈夫
ファイナライザが呼び出されてるということは今GCが走ってるわけだから,
絶対に他のマネージオブジェクトにアクセスしてはいけないし
余計な気をまわして他のオブジェクトのDisposeを呼ぶ必要もない
595:デフォルトの名無しさん
09/03/10 19:44:01
>>594
メモリの解放に限ってはそうだが、IDisposableは掴んでるリソースを解放するとか
最後にやらなければならないメソッドの総称という意味もあるので、
Disposeがあれば絶対に実行はすべき
596:594
09/03/10 19:55:03
すまんわかりにくかったね
Disposeしなくていい(してはいけない)というのはファイナライザ(デストラクタ)の中での話
クラスAがIDisposableなオブジェクトBをメンバに持ってるならA自身もIDisposableを実装して
A.Disposeの中でBをDisposeするようにしないといけない
その場合もファイナライザは不要
597:デフォルトの名無しさん
09/03/10 20:14:30
>>584
ローカルに保存したソースって、デバッグモード以外で直接見るにはどうすればいいんでしょうか。
598:デフォルトの名無しさん
09/03/10 20:15:03
WPFのExpanderのようなURLリンク(www.sociomedia.co.jp)
は C# .NET 2.0でも実装できますか?
599:デフォルトの名無しさん
09/03/10 20:32:35
>>597
.cs ファイルがあるから、直接見ればいいんでね?
600:デフォルトの名無しさん
09/03/10 20:39:16
>>599
あら、そんなのあったっけ。。。
確かめてみます。
601:デフォルトの名無しさん
09/03/10 21:34:01
>>595
>Disposeがあれば絶対に実行はすべき
これは明らかに間違いだと思うが。
そう設計されているクラス(よくない設計だが)でもない限りは、
基本的にはGCに任せる方がいいとされる。
もちろん必要ならDisposeやCloseを呼んでもよい。
602:デフォルトの名無しさん
09/03/10 21:37:02
>>601
>このインターフェイスは主に、アンマネージ リソースを解放するために使用します。
>マネージオブジェクトが使用されなくなると、同オブジェクトに割り当てられているメモリは
>ガベージ コレクタによって自動的に解放されます。
>ただし、ガベージコレクションが行われるタイミングは特定できません。
>また、ガベージ コレクタでは、ウィンドウハンドル、開いたファイルやストリームなどの
>アンマネージ リソースが認識されません。
>ガベージ コレクタを使用して、明示的にアンマネージ リソースを解放するには
>このインターフェイスの Dispose メソッドを使用します。
>オブジェクトがもはや必要でない場合、オブジェクトのコンシューマはこのメソッドを呼び出します。
603:デフォルトの名無しさん
09/03/10 21:46:09
コピペ君って馬鹿だな、まで読んだ。
604:デフォルトの名無しさん
09/03/10 21:47:21
いやいやお前のほうがバカだろ
605:デフォルトの名無しさん
09/03/10 21:48:34
>>603
>このインターフェイスは、Disposeメソッドだけを定義している。
>使い終わったら確実に資源を解放する処理が必要なクラスは、
>このインターフェイスを実装して、解放処理を記述するのが.NET Frameworkでのお約束である。
606:デフォルトの名無しさん
09/03/10 21:52:11
内容が微妙だから揚げ足取りになりがちな話題だが、
>>601の言ってることの方が真実に近いよ。
馬鹿なコピペ君の負け。
馬鹿なコピペ君の言うとおりなら、例えばWindows Formのデザイナで
デザイン時にコンポーネントを貼り付けるような使い方をMSはわざわざ用意しないだろう。
607:デフォルトの名無しさん
09/03/10 21:54:33
>>602
そのどこにも「Disposeがあれば絶対に実行はすべき」
なんて書いてないよね。俺の言ってること分かってるかい?
明示的にDisposeやCloseを呼び出さなければ、
やがてGCがファイナライザを呼び出してアンマネージリソースの
後片付けをさせるってこと分かってるかい?
608:デフォルトの名無しさん
09/03/10 21:55:55
>>598
作ればできるでしょ
609:デフォルトの名無しさん
09/03/10 21:56:09
揚げ足取りもなにも、CLR via C# とか読めば普通に書いてあることだよね。
610:デフォルトの名無しさん
09/03/10 21:58:45
ともかく,必ず呼ばれることを期待した実装にしてはいけない
611:デフォルトの名無しさん
09/03/10 21:59:00
>>606
>>607
アンマネージ リソース=ウィンドウハンドル、開いたファイルやストリームなど
IDisposableは主にアンマネージ リソースを解放するために使用
612:デフォルトの名無しさん
09/03/10 22:01:41
>>606
>馬鹿なコピペ君の言うとおりなら、例えばWindows Formのデザイナで
>デザイン時にコンポーネントを貼り付けるような使い方をMSはわざわざ用意しないだろう。
???
デザイン時にコンポーネントを貼り付けると自動的にDisposeが呼ばれるようになるけど
そういう話?
例えばボタンを貼り付けると、InitializeComponent()に
this.Controls.Add(this.button1);
みたいなのが追加される。
で、FormのDisposeでcomponents.Dispose();が呼ばれてる。
613:デフォルトの名無しさん
09/03/10 22:02:35
>>606
良く読もうな
>クラスで外部リソースを使用するが、そのクラスをデザイン領域では使用しない場合は、
>System.IDisposable を実装するか、あるいは直接または間接的に IDisposable を実装するクラスから派生させます。
>クラスがデザイン可能ではなく、外部リソースを保持していない場合は、IComponent 型や IDisposable 型は不要です。
614:デフォルトの名無しさん
09/03/10 22:05:39
>>611
別にIDisposableを実装していなくても、アンマネージリソースはファイナライザ中で解放すればいい。
IDisposableはGCに頼らずとも明示的にリソースを解放するための手段を与えるためのものだよ。
勘違いしているのでは?
615:デフォルトの名無しさん
09/03/10 22:05:58
>>612
話が通じない人だなあ。
言いたかったのは、もしIDisposable.Disposeが、不要になれば「必ず」呼ぶ必要があるほどの
緊急性があることを表すメソッドであるのなら、それを実装したクラスのインスタンスを
不要不急の時まで生かしておくことを許すようなことはしないだろう、
ということだよ。
まだ話が通じないとアレなので一応補足するけど、例えば
PrinterSettingDialogとかFileSaveDialogとか、いつもいるわけじゃないでしょ。
616:デフォルトの名無しさん
09/03/10 22:08:09
フォーム関連は生存期間が長いから少々無駄に長居してもそんなに問題にならない
617:615
09/03/10 22:09:30
あーなんかわけのわからんクラス名かいちゃったけど
PrintDialogとSaveFileDialogだなw
618:デフォルトの名無しさん
09/03/10 22:10:07
作る側と使う側じゃ、話もかみ合わないな・・・。
作る側は、必ず Dispose() を呼んでくれる、ってのを期待しちゃダメ。
使う側は、Dispose() を忘れちゃダメ。
619:デフォルトの名無しさん
09/03/10 22:13:53
>>615
>言いたかったのは、もしIDisposable.Disposeが、不要になれば「必ず」呼ぶ必要があるほどの
>緊急性があることを表すメソッドであるのなら、それを実装したクラスのインスタンスを
>不要不急の時まで生かしておくことを許すようなことはしないだろう、
>ということだよ。
ああ、「必ず」とつけた人がいてその人に噛みついていたのか。
それで「必要ではない」例をあげてたと。
しかしまあそれを言うなら>>601の
>もちろん必要ならDisposeやCloseを呼んでもよい。
こっちだって明らかに日本語が残念な人だろう。
「必要」な場面で「呼んでもよい」ってwww
必要な場合は必ず呼べよwww
620:デフォルトの名無しさん
09/03/10 22:14:17
>>615
換言すれば、そのソフトでfileを一度しかopenしないと考えられるのであれば
使い終わってもcloseする必要はないということですね
死ねば?
621:デフォルトの名無しさん
09/03/10 22:18:55
>>618
使う側も、作る側からDisposeの確実な呼び出しが期待されているのでもない限り、
「必ず」呼び出さなきゃいけないわけじゃないよ。
以下は CLR via C# の解説ね。
一応 .NET Frameworkの開発チームにも参加していた人の意見。
一般論として、筆者はDisposeメソッドやCloseメソッドの呼び出しを強制するのはあまり
推奨しません。CLRのガベージコレクタはとてもよくできているので、それに任せたほうが
いいからです。ガベージコレクタには、アプリケーションコードがオブジェクトにアクセスし
なくなるタイミングが分かっています。そしてそのタイミングが過ぎたときにだけ、オブジェクト
を回収します。アプリケーションコードでDisposeメソッドやCloseメソッドを呼び出すということは、
アプリケーションは自分がオブジェクトにアクセスする必要がなくなるタイミングが分かっている
と宣言をしていることになります。たいていのアプリケーションでは、オブジェクトが間違いなく
不要になったことがわかることはありません。
例えば、新しいオブジェクトを作成して、その参照を他のメソッドの引数に渡した場合、
そのメソッドが渡された参照を自分のオブジェクトの内部フィールド(これはルートになります)
に格納するかもしれません。メソッドを呼び出した側では、このような動作をしているかどうかは
分かりません。この場合、呼び出し側がDisposeやCloseを呼び出してしまって、その後で
他のコードがそのオブジェクトを利用しようとすると、ObjectDisposedExceptionがスローされる
ことになります。
筆者は、DisposeやCloseを自分のコードで呼び出すのは、次の2つの場合に限ることを
推奨します。1つは、リソースを解放しなければならないことが分かっている時(開いている
ファイルを削除しようとするときなど)です。もう1つは、DisposeまたはCloseを呼び出すことが
間違いなく安全で、しかもオブジェクトをファイナライゼーションリストから削除して、
オブジェクトが昇格するのを防ぐことで、パフォーマンスを向上させたい場合です。
622:デフォルトの名無しさん
09/03/10 22:20:36
>>619
IDisposableの目的が、主にアンマネージリソースの解放だから、
あれば実行するのは普通だと思うぞ?
この場合、ポトペタのコントロール等を持ち出して実行しなくてもいい例とするほうが狂ってる
623:デフォルトの名無しさん
09/03/10 22:23:10
>>621
大抵は最後の「2つの場合」に当てはまると思うんだけど
624:デフォルトの名無しさん
09/03/10 22:23:37
それはその人の意見に過ぎないでしょ。
> たいていのアプリケーションでは、オブジェクトが間違いなく
> 不要になったことがわかることはありません。
GC のない言語は全否定? ありえないです。
アンマネージドなリソースを使うから、それらのリソースを解放する
必要があるから、Dispose() を実装する。そう考えれば、Dispose() が
用意されてるなら、不要になった時点で呼ぶべきだと思うよ。
625:デフォルトの名無しさん
09/03/10 22:24:11
>>621
だから
>1つは、リソースを解放しなければならないことが分かっている時(開いているファイルを削除しようとするときなど)です
がDisposeの目的だって書いてあるっていってんの
626:デフォルトの名無しさん
09/03/10 22:24:18
>>618,>>619
だからさ、揚げ足取りのように聞こえるかもしれんがその「ダメ」とか「必要な場合は必ず」
っていう言い方は正しくないんだよ。
もっと控えめに、
(1) 占有している共有資源を他に譲りたいなら呼べ
(2) Disposeを呼ぶことをあえて避ける理由はなにもない
と表現するのが正しい。>>601の言っていることの方が妥当だ。
>>620
君はたぶん学生時代数学が出来なかった子だろうね。
君は必要条件と十分条件の区別がついてない。
Disposeを実装していることは、「使い終わったら必ず開放すべき資源を持っている」
ことの必要条件であっても十分条件じゃない。
つまり、Disposeを実装していることは、そのインスタンスが必ず
「使い終わったら必ず開放すべき資源を持っている」ことを意味しない。
627:デフォルトの名無しさん
09/03/10 22:24:19
>>621
それどこから引用したの?それとも自分で訳したの?
628:デフォルトの名無しさん
09/03/10 22:27:11
>>623
>>624
君たちのも「意見」に過ぎないよね。
しかも、素人の意見と、MSの多くのソフト開発に関わった人の意見とでは、
どちらを信用すべきか目に見ていると思うが。
(一応出版社もMicrosoftの書籍に書かれていることなので、
MSの準公式見解といっていい)
まともな人の書いた書籍で、絶対にDisposeを呼び出せって言ってるのはあるの?
それを提示しないと説得力ないよね。
629:デフォルトの名無しさん
09/03/10 22:27:41
>>626
君は今も理屈っぽいとよく他人からバカにされるでしょ。
Disposeの目的の主な利用方法がアンマネージリソースの解放なんだから、
できる時にしておくべき。
630:デフォルトの名無しさん
09/03/10 22:29:21
>>627
日本語版も「プログラミング .NET Framework」という題で出ている。
631:デフォルトの名無しさん
09/03/10 22:30:53
>>630
原著は持ってるが日本語版を持ってないから聞いたのだが。
632:デフォルトの名無しさん
09/03/10 22:30:54
こんがらがってきました
633:デフォルトの名無しさん
09/03/10 22:31:11
つーか、呼び出しても呼び出さなくてもいいなら、
安全面に倒して(リソース不足やらを引き起こさないように)
呼び出した方がいいじゃん。
そんなこともわかんないのかな・・・
634:デフォルトの名無しさん
09/03/10 22:31:28
>>628
良く嫁
>たいていのアプリケーションでは、オブジェクトが間違いなく不要になったことがわかることはありません。
だから
>一般論として、筆者はDisposeメソッドやCloseメソッドの呼び出しを強制するのはあまり推奨しません。
ってことだろ?
間違いなく不要になることはわからないから、一般的に推奨しないわけであって、
明らかに分かってる場合には、実行しても問題じゃないってこった。
従って、アンマネージリソースを抱えている可能性があるわけだから、
必要ないと分かっていれば実行はするべきだということになる。
635:デフォルトの名無しさん
09/03/10 22:32:09
なんか、原理主義者というか、細かいことにこだわる奴がいるなぁ・・・。
636:デフォルトの名無しさん
09/03/10 22:32:38
リソースをカプセル化したオブジェクトを使ったコードを記述する場合は、オブジェクトが不要になった時点で、
そのオブジェクトの Dispose メソッドが必ず呼び出されるようにする必要があります。
ついで
URLリンク(social.msdn.microsoft.com)
637:デフォルトの名無しさん
09/03/10 22:33:15
盲目的という感じはするね
> 明らかに分かってる場合には、実行しても問題じゃないってこった。
どう考えてもその通り
638:デフォルトの名無しさん
09/03/10 22:34:12
>>633
そこは誰も否定してないよ。
だから微妙な話だといってるんだけど。。
639:デフォルトの名無しさん
09/03/10 22:35:54
>>621の筆者が心配してるようなリソース行方不明状態は作るべきじゃないし
そういう状況は特別に注意して管理するべきであって一般にどうとかいう話じゃないと思うんだ
640:デフォルトの名無しさん
09/03/10 22:38:04
>>639
自分の書いたクラスだけを利用するとは限らないからなあ。
他人の書いたクラスを使う場合は防ぎようがないこともあるだろう。
641:デフォルトの名無しさん
09/03/10 22:40:36
つーか、言ってもない「必ず」とかの文言を勝手にでっち上げて
議論をふっかける奴って何なんだろう・・・?
642:デフォルトの名無しさん
09/03/10 22:42:15
「C++みたいに、メモリ解放とかしなくてもいいんですよ。
だから必ずDisposeさせようと思う必要はないんですよ?」
と過去の呪縛から解放させるためのトークが
「Disposeはすべきでない」
と理解されたらたまったもんじゃないな
643:デフォルトの名無しさん
09/03/10 22:42:49
まぁ、でも、コードレビューとかで「なんで Dispose() しないの?」って質問に
> つまり、Disposeを実装していることは、そのインスタンスが必ず
> 「使い終わったら必ず開放すべき資源を持っている」ことを意味しない。
とか答える奴とは一緒に仕事をしたくないな。
644:デフォルトの名無しさん
09/03/10 22:45:21
>>640
それ他人に書いたクラスにバグがありますと同じ
Disposeが信じられないのなら、他のメソッドの動作にも信頼がおかけないだろうから、自作するしかないね
645:デフォルトの名無しさん
09/03/10 22:45:31
>>641
じゃあ>>595にある、
>Disposeがあれば絶対に実行はすべき
の絶対と「必ずの違いをとっくりと説明してもらおうじゃないか。
というか、議論にすぐ感情を持ち込む君のような奴ははっきりいって議論の邪魔。
ついでにエンジニアの資格なし。
646:デフォルトの名無しさん
09/03/10 22:48:06
>>595=>>641 ってわけでもないだろうし、感情的になってるのは
どっちもどっちじゃない?
647:デフォルトの名無しさん
09/03/10 22:50:44
>>645
そうやって論議を他の方向にそらしたい気持ちはわかるが、
Disposeは絶対に必ず間違いなく確実に死んでも実行すべき
もちろん必要なくなったらの話
648:デフォルトの名無しさん
09/03/10 22:55:14
>>647
別に明示的にDispose()を呼ばなくても、ガベコレが動けば、FinalizeがDispose(bool disposing)の方を呼ぶでしょ。
これもDisposeメソッドだから(というより本体)、結局のところDisposeは確実に呼ばれるんだよね~。
そういう意味では、Disposeメソッドは絶対に呼ばれるべきだし、また通常はそうなっているだろう。
649:デフォルトの名無しさん
09/03/10 22:57:42
むやみやたらに GC.Collect() するようなコードをたまに見かけるな・・・
そんなのよりは、よっぽど Dispose() を呼び出す方がましな気がする。
650:デフォルトの名無しさん
09/03/10 22:57:44
Disposeが必要なのは結局のところタイミングの重要なのであって、
その意味で>>648の発言は基本がまったく理解できてない
651:デフォルトの名無しさん
09/03/10 22:59:51
わかりやすくいうとこんな感じ
■Disposeしなくてもいいよ派
手洗いをしていないからといって、必ずしもインフルエンザにかかるとは限りません。
手洗い場には人が殺到するので、余計にインフルエンザにかかるリスクが増加します。
■Disposeしたほうがいいよ派
手洗いをしたほうが手からの感染が少なくなるのでしたほうがいいに決まっています。
混雑した場などに出かけた場合の話をしているのであって、
その場合には手を洗ったほうが感染のリスクが低下します。
652:デフォルトの名無しさん
09/03/10 23:00:38
>>650
Disposeを確実に呼び出すように(あるいは呼び出されるように)しろ、
と言ってる記述があっても、それは広義のDisposeメソッド(bool型を引数に取るような)
を指しているのかもしれんから、必ずDispose()を呼べと言っているのか断定しがたいってことだよ。