[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/25 16:56 / Filesize : 209 KB / Number-of Response : 852
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



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

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

357 名前:デフォルトの名無しさん [2009/01/29(木) 18:15:19 ]
なるなる。ありがとう。やっぱり読むだけじゃ覚えれなそうですね
6年前のPCにVisualStudio入れたら重くなって挫折してしまいました

358 名前:デフォルトの名無しさん [2009/01/29(木) 18:17:08 ]
デフォルトのvoidさんは無いのか。
2CHよりひでーな。

359 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 18:18:33 ]
>>357
csc.exeのあるディレクトリにPATHだけ通せば
あとはコマンドプロンプト+エディタで最低限の環境が揃うぞ
ネットで適当に調べてやってみるといい

360 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 21:40:32 ]
頻繁に呼ばれる関数で
newを使うのって速度かなり落ちますか?
画像データ用の領域で、一度に640*480*4バイト確保します。

361 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 21:42:02 ]
関数を呼ぶのに new は必要ない。

362 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 21:44:47 ]
>>361
日本語読めますか?

363 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 21:45:07 ]
落ちますか? ってやってみればいいじゃない

newを使うかどうかよりも1MBを頻繁に確保するのは重いかもね
ワーキングセットも大きくなるだろうし

364 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 21:48:19 ]
コンピュータの性能が良すぎて問題ないという可能性もある。
まずは率直な書き方で作ればいい。

365 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 21:49:23 ]
キャッシュしても問題ない構造ならとりあえずキャッシュするようにしといてもいいとおもうよ
手間かかるものでもなし



366 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 01:03:05 ]
>>362
日本語で書いてどうする?

367 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 01:18:14 ]
>>366
日本語通じてなくてワロタ

368 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 08:50:41 ]
>>366
アイちゃん乙

369 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 08:52:34 ]
安価ミス
>>361

370 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 10:57:19 ]
ArrayListやList<T>において、
list.Add(new T())
といった感じで配列に追加している場合、
削除系メソッド(Clear、Remove、RemoveAllなど)実行したときに配列内のクラスのインスタンスは
開放されないのでしょうか?


371 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 11:01:05 ]
その要素を他が参照してなかったらGC対象になる

372 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 11:09:48 ]
>>371
そういうことなのですね。ありがとうございました。

373 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 15:09:36 ]
"バイト"や"キログラム"のような単位を表す文字列を
設定されたカルチャに応じて取得できるクラスないですか?

374 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 15:22:26 ]
標準ライブラリには無い
複数形とか考えると多分作るのは不可能に近い

375 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 18:15:54 ]
不可能ってこたねえだろ



376 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 18:46:52 ]
>>375
渦中って読めますか?

377 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 18:51:34 ]
俺もそんなクラスほしい
標準であってもいいよね

関係ないけど「OK」「キャンセル」「適用」 とかも欲しかった

378 名前:デフォルトの名無しさん [2009/01/30(金) 19:14:29 ]
ってか、C#おもろいけど、GUI案件がないからモチベあがんないんだよね。言語的にはいいんだけど。

しょうがないから、ASP.NETもじもじやってる。

379 名前:デフォルトの名無しさん [2009/01/30(金) 19:47:32 ]
C#とついでにSilverLigitもやったんだけど、案件が全然ねえ(;´д`)俺は馬鹿だったのか?

380 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 19:54:31 ]
わざわざ.netを指定してくる企業って皆無では・・・

381 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 20:20:23 ]
おれずっとc#でやってたよ。MSとちょっと関係ある会社だけど

382 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 20:21:56 ]
VS2008 + .net2.0

dirフォルダ内のサブフォルダの中身も含めたファイルの個数を出したいです。

using System.IO;
string[] files = Directory.GetFiles( dir, "*", SearchOption.AllDirectories);
として、files.Length を数えてるんだけど、ファイル数が5000とかあるフォルダを
検索しなくちゃならないので、さすがに遅いです。

この段階ではファイル名のstringは使わないので、個数だけで良いのですが、
サクっと出せるような方法ありませんか?

383 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 20:48:30 ]
ないよ
遅いのは結局IOであってファイル名とかはほぼ関係ない

384 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 20:49:49 ]
>>383
了解しました。
我慢します。

385 名前:デフォルトの名無しさん [2009/01/30(金) 21:01:30 ]
Rectangle rect;
rect = null;

としたところ、Rectangle 型なのでnullは入れられないと言われました!
VB.NETだと、どんな型の変数にも Nothing を入れられるのでつい同じかと
思っていました。どうやったら同等の処置が可能でしょうか、よろしくお願いします。





386 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 21:04:19 ]
VBでも本当にNothingを入れることはできないよ
Rectangle? rect;
rect = null;
※使うときはRectangleにキャストすること

387 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 21:05:31 ]
>>385
Rectangleは値型だっけか。これでどうだ。
Rectangle? rect = null;


388 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 21:13:03 ]
>>385
VB の Nothing は null じゃなくて Zero Fill な値(既定値)だからな
C# 的には null と既定値は区別される。C# 的には VB の Nothing
は default(T)。

なので VB の Nothing 代入に近いのは
var rect = default(Rectangle);
だぁね

389 名前:デフォルトの名無しさん [2009/01/30(金) 21:15:16 ]
>>386-387
どうもです。やってみましたところ、キャストを入れた上で一応解決かと思った
のですが、一つだけ問題がでました。Contains()メソッドを使っているところで
'System.Nullable<System.Drawing.Rectangle>' に 'Contains' の定義がありません
というエラーとなりました。これは

if ((Rectangle)rect.Contains(e.Location))
{・・・}

のように使ってみたのですが、他の書き方しないとだめでしょうか。


390 名前:デフォルトの名無しさん [2009/01/30(金) 21:18:27 ]
>>388
ご教示どうもです、知りませんでした。

>なので VB の Nothing 代入に近いのは
>var rect = default(Rectangle);

こういうのもあるんですか!この場合は
if (rectG != null){・・・} 
のように使えるでしょうか。そうだ、やってみます。

391 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 21:19:56 ]
((Rectangle)rect).Contains
>>390
できません
rectG!=default(Rectangle)ならできるけど(0, 0, 0, 0)とは区別できないよ

392 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 21:23:29 ]
defaultはgenericで使うことを前提に作られているんで若干癖がある。
Rect(0,0,0,0)に初期化することが目的なら
var rect = new Rectangle();
未初期化のRectangleが欲しいのなら
Rectangle rect;
でいい。

393 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 21:24:41 ]
>>390
おおっと。
いや VB 使っているうちは VB の流儀でいっていいと思うんだが
C# に来たんだから C# の流儀にあわせて区別しような。
Rectangle? val = null;
のほうを使えってことだけど。

>>389 のほうは rect.Value.Contains(e.Location) な。
null だったら例外出るが。例外がいやなら

if( rect.HasValue && rect.Value.Contains(e.Location) )

かね。


394 名前:デフォルトの名無しさん [2009/01/30(金) 21:24:56 ]
>>391
>((Rectangle)rect).Contains
早速ありがとうございます、これで大丈夫でした、助かりました。
>rectG!=default(Rectangle)ならできる
わかりました。いろいろご教示ありがとうございました!

皆様本当にありがとうございました!またよろしくお願いします!!

395 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 21:26:18 ]
うぽ!
(rect ?? new Rectangle()).Value.Contains(




396 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 21:26:39 ]
っていうかVBでも値型をNothingと比較するのはダメだろ
ゼロ初期化されたものと同じとわかっててやるならいいけど,>>394はわかってなさそう

397 名前:デフォルトの名無しさん [2009/01/30(金) 21:31:15 ]
>>392
>>393
>>395
C#の凄い表現のバリエーションにびっくりです、またこれから勉強致します。

>>396
わかってなかったです。すみません・・・。

ではまた。

398 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 21:33:38 ]
Rectangleをnullと初期化したあとにどう使うんだろう・・・

399 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 21:40:02 ]
フラグ代わりだよ
Rectangle rect;
bool isRectAssigned;
みたいなのってよく出てくるだろ
これを一つにまとめたのがnullable

400 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 21:43:05 ]
IList<T> list = new List<T>();
とかやってたら、IListの方にはForEach()がなくて涙目なんだけど、そういうもんなの?

401 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 21:55:52 ]
ForEachぐらい自分で書けばって

402 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 22:07:07 ]
nullable ってキモいからまだ使ったことがないな
すこし慣れてみるか……

403 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 22:09:46 ]
拡張メソッドで自作するのは簡単
でもEnumerable.ForEachが無いことを考えると,素直にforeach書けということなんだろうと思う

404 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 22:26:01 ]
WPFではShowDialogの戻り値がbool?になってたりするね

405 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 22:48:24 ]
正確に20msで処理をしてFORMのPictureBoxを触りたいときは、
BackgroundWorker+System.Timers+AutoResetEventでいいですか?
他にもっといいやり方があるんなら教えて欲しいのですが…orz



406 名前:デフォルトの名無しさん [2009/01/30(金) 22:57:49 ]
>>405
> 正確に20ms
まずこれが難しい。timeBeginPeriod か MMCSS 使えば
ある程度いけるかもしれないけど、あくまである程度。
さらにいいやり方となると Forms 使うのが間違ってる。


407 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 22:58:20 ]
20msは厳しいんじゃないの
更新間隔は20msよりも長くして,
そのつど経過時間を計測してそれから計算してその結果をもとにしてPictureBoxを更新したほうが

408 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 23:06:23 ]
コールバック間隔は,Application.Idleイベント使うなり自分でメッセージループ回すなりして
その中でStopwatch使って時間計測すればある程度正確にできるけど
フォームの更新が20msでは絶対無理

409 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 23:27:55 ]
20msってどこから来たの?
測定機械のタイミングとか?
GUIの更新は後回しにした方がいいんじゃね?

410 名前:デフォルトの名無しさん [2009/01/31(土) 00:53:40 ]
20msってWindowsのインターバルタイマーで拾えるの?
割り込み上がっても、処理が間にあわん気がするんだけどね
リアルタイムOSでというのなら分からんでもないけど。
#組み込み用が対象なのかな?
割り込み->データをFIFOQueueに追加->queueのデータをGUI処理
になるんだろうけど(sharedメモリ経由か)
#割り込みコンテキストってWinにはあるのかな?

411 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 02:40:33 ]
いつも思うんだが、なんか2chって日本語として成立してない質問でも適当にESPを働かせて、
(というより、回答する側も他人の文章を正確に読解する能力がないだけ、という方が
より真相に近いと思うんだが)回答する奴が多すぎないかね。

>>405
「正確に20msで処理をして」とはどういう意味?
正確に20ms間隔でイベント処理をしたい、って意味なの?
いずれにしても、「正確」という表現はもっと定量的な表現にする必要があるだろ?

仮に20ms間隔でGUIを更新したい、って意味だとしたら、
今時のPCなら単純にSystem.Timers.Timer使っても±5ms以内の誤差で可能だと思うけど。

少なくとも、平均速度として50回/秒が実現できればいいということなら
(意味があるかどうかは別として)ほぼ確実に出来ると思う。

もちろん糞重い描画処理をしてたらあっという間に破綻するけど。

いざとなったらスレッドでThread.Sleep(0)と、Stopwatchをポーリングして
20msごとにControl.BeginInvoke()を実行する無限ループで実装したっていいし。

412 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 04:51:35 ]
えらい自信だからためしに作ってみたけど
System.Timers.Timerなんて無茶苦茶ばらつくじゃないか


413 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 09:07:32 ]
エスパーで解釈すると、
20msecでコントロールのアップデートはありえないから、
CreateGraphics()で得たGraphicsで直接描こうとしている。
CreateGraphics() + GDI+メソッドは別スレッドからでも使える。
こういう用途にはFormかPanelが適当なのだけどVB6以来の伝統かPictureBoxを使いたがる人が多い。
Timers.Timerはタイマーイベントの処理時間分、間隔がずれてゆくはずだからその分の解消をしたい。
そんなとこだろ。

414 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 11:17:09 ]
>20msecでコントロールのアップデートはありえないから、
>CreateGraphics()で得たGraphicsで直接描こうとしている。

じゃあオフスクリーンにも20msecで描画する必要ないじゃん

415 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 11:41:59 ]
へっぽこエスパーばっかりだな
とくに>>411



416 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 11:52:58 ]
>>414
オフスクリーン
というのはどこから出てきたんだ?

417 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 11:58:29 ]
まあ>>405が来るのを待とうじゃないか


418 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 11:58:36 ]
どうやってもGDI+で20msは厳しいでしょ

419 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 11:59:47 ]
オンでもオフでも問題の本質は一緒でしょ
>20msecでコントロールのアップデートはありえない
のなら20msec間隔で描画する必要がない

420 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 12:01:13 ]
そのオン、オフというのを説明してもらいたいのだが・・・

421 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 12:02:12 ]
ダブルバッファリングじゃないの

422 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 12:06:59 ]
へっぽこエスパーダブルバッファリングも知らないのかよ

423 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 12:09:33 ]
やっぱりダブルバッファのことね。それを使うとは一言も言ってない。
フォームにパネルとSystem.Timers.Timerはって、20msecに設定でこれ。

Font stockFont = new Font(FontFamily.GenericMonospace, 14);
int locs = 0;

private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
  using (Graphics g = panel1.CreateGraphics())
  {
    g.FillRectangle(Brushes.Blue, new Rectangle(8, 8 + 28 * locs, 14 * 20, 28));
    g.DrawString(Environment.TickCount.ToString(), stockFont, Brushes.Yellow, 10, 10 + 28 * locs);
    locs++; if (locs >= 5) locs = 0;
  }
}


424 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 12:24:11 ]
Direct3Dでも使わないと描画間に合わないだろ

425 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 12:24:57 ]
へっぽこエスパー
ありえないとか言いながら20msecでコントロール(panel)のアップデートしてんじゃねーよ





426 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 12:33:10 ]
なんか子供だなぁ。

ありえないのは、Control.Invokeを使うこと。
他のスレッドからだからPanel1.Update()も使えない。
Timers.Timerをフォームに貼り付けてと書いたけど、実際はコードでnewしてる。
フォームに張りつけた場合は、ここだけthisからnullに変更してくれ。
this.timer1.SynchronizingObject = null;

427 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 12:36:52 ]
WindowsXP、VisualC#2008環境で質問があります。
フォルダの[ツール]-[フォルダオプション]で表示できるフォルダオプションのウィンドウを開くには、なにを呼び出せばいいですか?
可能なら、表示オプションのタブをクリックした状態にしたいです。
どなたかご教示ください。よろしくお願いします。
この中身を編集するということは、レジストリをいじるということかと思いますが、その場合、どのような方法を取ればよいでしょう?
違っていたらご指摘いただけないでしょうか。


428 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 12:37:52 ]
だから描画間に合わなかったらどうすんの?
>>423くらいの処理なら間に合わないこともないかもしれないけど一時的に遅れることだってあるだろ

429 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 12:46:55 ]
>>428
それで>>405がAutoResetEventと書いてるのだと思うよ。
つまり間に合わなかった場合は、その分間隔を遅延させるか1回か数回とばすか。
実現する方法はいくつかあるが、AutoResetEventを使うのはとばす方のロジックで使える。
この辺は普通にゲームの描画のアルゴリズムだと思うんだけどな。


430 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 13:17:19 ]
>>427
Vistaだったら
::{21EC2020-3AEA-1069-A2DD-08002B30309D}\::{6DFD7C5C-2451-11D3-A299-00C04F8EF6AF}
なんだけど。これをShellExecute。
XPはシラネ

あとはRegistryクラスで編集、WM_SETTINGCHANGEDをブロードキャストとかかのう

431 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 14:38:10 ]
で20ms間隔で描画できたかい?そんなコードだと無理に決まってるけどw

432 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 14:41:32 ]
Expression Treeで動的生成されたメソッドって一回作ったらそのまま解放されないの?
頻繁に式木作って評価するならインタプリタ作った方がいいのかな

433 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 14:50:43 ]
クラスデザイナの関連付けってなにしてくれるの?
関連付けされたクラスのコンストラクタが、
関連元クラスに追加されるみたいだけど、何につかうんだべ。

434 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 14:56:27 ]
System.Threading.Timer使ってConsoleアプリケーションで、

コールバックは、
・1000回呼ばれたら終了イベント上げる
・開始前と最後のコールバック時に時刻表示

メインは
・1秒後から20msecでコールバックするようにタイマーセット
・終了イベントが上がってきたらタイマーをdisposeして終了

という事実上タイマーが使われるだけで何もしないサンプルをためしに
作ってみたが、32秒かかるよ。最初の1秒待ち差し引いても、平均31msec
呼ばれるのにかかってる。

435 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 15:36:14 ]
>>434
20msecといってるのは>>405でTimers.Timerにこだわる必要もないのだが。
ただ1000回で31秒かかるというのはおかしいな。
長いがコードはるね。Celeron1.4G WinXPで00:00:20.0493193だった。

using System;
using System.Threading;
class Startup { 
 void Test() {
   using (var timer1 = new System.Timers.Timer()) {
    timer1.Interval = 20;
    int counter = 0;
    timer1.Elapsed += (o, e) => { 
      if (++counter >= 1000) lock (this) Monitor.Pulse(this);
    };
    var sw = System.Diagnostics.Stopwatch.StartNew();
    timer1.Start(); 
    lock (this) Monitor.Wait(this);
    timer1.Stop();
    sw.Stop(); Console.WriteLine(sw.Elapsed);
   }
 }
 static void Main() { new Startup().Test(); }
}




436 名前:デフォルトの名無しさん [2009/01/31(土) 16:30:27 ]
Directoryを外部から隠蔽したいのですが、どんな感じに実装したらいいですか?

private Directory<int,int> _dic;
public Directory<int,int> dic{
get ...
set ...
}
みたいにそのままプロパティにしちゃうと、外からdic[key]=1;って叩けないですよね?

437 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 16:37:42 ]
>436
public int this[int key] { get { return _dic[key]; } }
みたいに隠蔽して必要な値を取得できるメソッドとかだけ公開すれば操作はしようがないので堅いよ。

438 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 16:47:53 ]
>>436
外から叩けちゃうと隠蔽にならないんだが、そのコードなら別に外から叩けるな。


439 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 16:48:30 ]
内部にラップしてるDictionaryをそのままの型で公開しちゃったら隠蔽にならないから

440 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 16:58:52 ]
>>435
>ただ1000回で31秒かかるというのはおかしいな。
>長いがコードはるね。Celeron1.4G WinXPで00:00:20.0493193だった。

ハードウェア割り込みタイマーの周期次第じゃないの?
この周期はどこかのアプリがtimeBeginPeriodを使うだけで
簡単に変わるから、単純にOSとCPUだけ並べて
おかしい/おかしくないとは言えないよ。

Windowsだとデフォルトの割り込み間隔が16msecってのはよくある値だし
20msecのタイマーを仕掛けたら32msecごとにコールバックされていた
と考えればむしろ辻褄があう。(32msec×1000で約32s)

>>434 の環境でメディアプレイヤーなんかを同時に起動してるだけで
結果は変わるんじゃないかね。

441 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 17:05:31 ]
単に終了イベントを待つのにビジーループさせてるんとちゃう

442 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 17:12:00 ]
C#で、書き方を迷っているんだけど、ちょっと相談に乗ってくれないか
例えば、ファイルコピーをするメソッドで、コピー元が無ければ例外を発生する場合

public bool CopyTo(string fromFileName, string toFileName)

1)
if (!this.GetIsFileExistsfromFileName,  
 throw new FileNotFoundException();
System.IO.File.Copy(fromFileName, toFileName, true);
return true;

2)
if (this.GetIsFileExists(fromFileName),  
{
 System.IO.File.Copy(fromFileName, toFileName, true);
 return true;
}
else
 throw new FileNotFoundException();

上下のどちらがいいのかな。

443 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 17:13:15 ]
それを踏まえて、さらにコピーの上書不許可時にコピー先にファイル名存在でfalseを返すとき
public bool CopyTo(string fromFileName, string toFileName, bool canOverride)

1)
if (!this.GetIsFileExists(fromFileName))
 throw new FileNotFoundException();
if (!canOverride)
{
 if (this.GetIsFileExists(toFileName))
 return false;
}
System.IO.File.Copy(fromFileName,toFileName, false);
return true;

2)//ビルド時にエラーになるかも
if (this.GetIsFileExists(fromFileName))
{
 if (canOverride)
 {
  System.IO.File.Copy(fromFileName,toFileName, false);
  return true;
 }
 else
 {
  if (this.GetIsFileExists(toFileName))
  return false;
 }
}
else
 throw new FileNotFoundException();



444 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 17:13:52 ]
3)
if (this.GetIsFileExists(fromFileName))
{
 if (!canOverride)
 {
  if (!this.GetIsFileExists(toFileName))
  {
   System.IO.File.Copy(fromFileName,toFileName, false);
   return true;
  }
 }
}
else
 throw new FileNotFoundException();
return false;

こんな書き方があると思うんだけど、見やすいというか、わかりやすい書き方が思いつかない。
なんかいいアイデアないかな・・

445 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 17:14:35 ]
引数チェックは上にまとめたいから1



446 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 17:15:19 ]
bool返す必要があるのか疑問ではある

447 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 17:18:02 ]
説明がないとわからないようなbool値を返すな

448 名前:434 mailto:sage [2009/01/31(土) 17:21:02 ]
んじゃおれも貼ってみる。ヘルプのサンプル改変だけど、どこかおかしい?
using System;
using System.Threading;
using System.Collections.Generic;
class TimerExample
{
  static void Main()
  {  AutoResetEvent autoEvent   = new AutoResetEvent(false);
    StatusChecker statusChecker = new StatusChecker(1000);
    TimerCallback timerDelegate = new TimerCallback(statusChecker.CheckStatus);
    Timer stateTimer = new Timer(timerDelegate, autoEvent, 1000, 20);
    autoEvent.WaitOne(60000, false);
    stateTimer.Dispose();
  }
}
class StatusChecker
{
  int invokeCount, maxCount;
  public StatusChecker(int count)
  {  invokeCount = 0;
    maxCount = count;
    Console.WriteLine(DateTime.Now);
  }
  public void CheckStatus(Object stateInfo)
  {  AutoResetEvent autoEvent = (AutoResetEvent)stateInfo;
    if(++invokeCount == maxCount){
      Console.WriteLine(DateTime.Now);
      autoEvent.Set();
    }
  }
}

449 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 17:27:03 ]
>>435 のコードを実行してみた

Pentium4@2G WinXP .NET 3.5SP1
結果 00:00:31.2455778

というわけで31秒かかる環境はここにもある。

450 名前:434 mailto:sage [2009/01/31(土) 17:34:00 ]
>>435のコードは31.193秒だった。同じだね。
Vista Home Premium
Core2 Duo T7300@2.00GHz

451 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 17:38:53 ]
>>448
こちらは、21-22秒で完了。起動時の1秒待機があるから20.5秒くらい。
>>440の説が正しいなこりゃ。


452 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 17:45:43 ]
戻り値と例外モデルが混在してるのがイライラする。

453 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 17:50:32 ]
リアルタイムOSじゃないんだから無理ってのが出ないのはそこまでの正確さは求めていないってこと?

454 名前:434 mailto:sage [2009/01/31(土) 18:08:02 ]
しつこいが、System.Windows.Forms.Timerでも試してみた。
private void timer1_Tick(object sender, EventArgs e)
{
label3.Text = (Convert.ToInt32(label3.Text) + 1).ToString();
}
というカウントアップをリアルタイム描画。
1000回回して31.24秒だった。
もういいや。

>>453
それは、(ひょっとすると元質問者以外は)百も承知でしょ。

455 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 18:47:05 ]
>>445-447
ごめん、例が悪かったね。返り値が必要/不必要という点でなくて、
そういう返り値を出したいとき、どう書くのがいいのかなと思って。

別の例を出したほうが理解してもらいやすいのかな。
public int GetType(string word) 例えばword=="nullpo"の時0で、それ以外1を返すとき、
わかりやすいのはどれだろう。

if (word == "nullpo") ■1
 return 0;
else
 return 1;

if (word == "nullpo") ■2
 return 0;
return 1;

int type = 1;
if (word == "nullpo") ■3
 type = 0;
return type;





456 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 18:48:24 ]
それを踏まえて、canAcceptNullpoがTrueの時には、1を返したいとすると、
public int GetType(string word, bool canAcceptNullpo)

if (word == "nullpo") ■a
 if (canAcceptNullpo)
  return 1;
 else
  return 0;
else
 return 1;

if (canAcceptNullpo) ■b
 return 1;
else
 if (word == "nullpo")
  return 0;
 else
  return 1;

if (canAcceptNullpo) ■c
 return 1;
if (word == "nullpo")
 return 0;
else
 return 1;

などあると思うけど、もしわかりやすいアイデアあったら頼みます。

457 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 19:02:09 ]
うぽ
return (word == "nullpo") ?  ((canAcceptNullpo) ? 1: 0) : 1;
というのは冗談として、
事前条件的なものは早めにチェックして単独でreturnしたほうがいいと思いますよ。
引数の検査、つまりnullチェックのや範囲チェック的なものはそれ。







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<209KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef