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

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

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

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

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

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

関連スレ
C#, C♯, C#相談室 Part55(実質56)
http://pc12.2ch.net/test/read.cgi/tech/1260111240/

WPF(XAML, XBAP, .Net3.5)GUIプログラミング Part5
http://pc12.2ch.net/test/read.cgi/tech/1261879110/
0232デフォルトの名無しさん2010/01/26(火) 11:33:55
>>231
そんなこと言うなよ、俺が変わりに暴露してやるから

CXXXXってcl.exeのエラーだよなw
0233デフォルトの名無しさん2010/01/26(火) 15:32:56
>>231
初心者スレに初心者が来なくてどうする
0234デフォルトの名無しさん2010/01/26(火) 21:13:53
C#の参照渡しはoutとrefの2種類あります。

outは初期化した参照でなくても渡すことが出来るという点でrefより融通が利くわけですが、
それでもなぜrefが存在しているのでしょうか?

outはダメでrefでなければならないというケースはどんなときですか?
0235デフォルトの名無しさん2010/01/26(火) 21:16:19
なぜって、データが欲しいのにnullが来ても困るじゃん
0236デフォルトの名無しさん2010/01/26(火) 21:19:52
outは引数の中身にアクセスできないよ
未初期化のローカル変数にアクセスできないのと同じ
0237デフォルトの名無しさん2010/01/26(火) 21:42:02
無印は入力のみ、out は出力のみ、ref は入力でも出力でもある場合に使うのよ
0238デフォルトの名無しさん2010/01/26(火) 21:45:55
まあ基本refやoutなんか使わないほうがいい
0239デフォルトの名無しさん2010/01/26(火) 22:26:37
>>236
int a = 10;

と初期化済みの変数aをメソッドにout付きで渡したらどうなりますか?
0240デフォルトの名無しさん2010/01/26(火) 22:29:19
呼び出し元で初期化されてるかどうかは呼び出し先のメソッドには分からない
だから値を読もうとすると問答無用でコンパイルエラー
0241デフォルトの名無しさん2010/01/26(火) 22:29:47
>>239
なんでそんな、試せばすぐに分かることを人に聞くんだ。
自分でやってみて考えなさい。
0242デフォルトの名無しさん2010/01/26(火) 22:31:53
あとMSDNちゃんと読もうな。
0243デフォルトの名無しさん2010/01/26(火) 22:39:18
つーか、言語仕様とか「何か意味があるんだな」って受け流すべき。

「なにこれ作ったやつバカじゃないの?」ってのはもう最悪に素質ないから趣味でも辞めろ。
仕様やライブラリを信用できなかったらなにもできない支那。
0244デフォルトの名無しさん2010/01/26(火) 22:42:14
仕様読まない人に言っても
0245デフォルトの名無しさん2010/01/26(火) 22:47:51
>>244
ああお前のことね
0246デフォルトの名無しさん2010/01/26(火) 22:50:17
>>243
「バカじゃないの?俺ならこーする、こっちの方がこうこうこういう理由で合理的じゃん!」
ってやって皆に認められる言語やライブラリやフレームワーク作る人も居るとは思うけどね。

とはいうけど言ってることは基本的に同意で。
0247デフォルトの名無しさん2010/01/26(火) 23:04:25
>>238
参照渡しもポインタも使わずにどうプログラムを組めと
0248デフォルトの名無しさん2010/01/26(火) 23:07:19
参照の値渡しをすればよい
理屈の上ではrefやoutも完全に代替できる
0249デフォルトの名無しさん2010/01/26(火) 23:09:45
誰も絶対使うなとは言ってないのに極論厨だなあ
初心者は極論持ち出さない方がいいよ
頭固くなるから
0250デフォルトの名無しさん2010/01/26(火) 23:11:26
>>248
それポインタじゃね?
0251デフォルトの名無しさん2010/01/26(火) 23:13:38
>>250
違うよ笑
0252デフォルトの名無しさん2010/01/26(火) 23:21:37
参照の値渡しのことを参照渡しって言うわけなんだけれども。
0253デフォルトの名無しさん2010/01/26(火) 23:21:46
>>251
で、具体的にどんなコードだよ?
0254デフォルトの名無しさん2010/01/26(火) 23:22:59
int型では無くstring型の配列があるとします。
配列には次の様に”数字.dat”という規則のファイル名が格納されており、

003.dat
01.dat
006.dat
0005.dat

これをソートして

01.dat
003.dat
0005.dat
006.dat

のように昇順で並び替えたいと思っています。

リテラルのソートをしてくれるクラス・メソッドはありますか?

もしそのようなクラス・メソッドが無い場合はどうすればよろしいでしょうか?
0255デフォルトの名無しさん2010/01/26(火) 23:25:34
Array.SortにComparison<T>を引数に取る奴があるから比較自分で書け
0256デフォルトの名無しさん2010/01/26(火) 23:25:37
というか、普通に書いてたらrefもoutも使わないとかけないところなんて殆どないぞ。
メソッドとプロパティとdelegateとイベントハンドラでほとんどなんでもできる。
0257デフォルトの名無しさん2010/01/26(火) 23:26:55
Sort((a,b) => int.Parse(a.Replace(".dat","") - int.Parse(b).Replace(".dat",""));
0258デフォルトの名無しさん2010/01/26(火) 23:28:18
ありゃ、ずれた。
Sort((a,b) => int.Parse(a.Replace(".dat","") - int.Parse(b.Replace(".dat","")));
0259デフォルトの名無しさん2010/01/26(火) 23:29:22
refだのoutだの使いたくなった時はそれはクラス作る時ってことで。
0260デフォルトの名無しさん2010/01/26(火) 23:32:48
問題は
>まあ基本refやoutなんか使わないほうがいい
この発言の根拠がなにかってことじゃないのか?
0261デフォルトの名無しさん2010/01/26(火) 23:34:30
すぐ治ったな
0262デフォルトの名無しさん2010/01/26(火) 23:35:03
[DllImport("誤爆")]
0263デフォルトの名無しさん2010/01/26(火) 23:37:37
>>255
>>258
ありがとうございます。
その方法を調べてみます。
0264デフォルトの名無しさん2010/01/26(火) 23:38:12
refやoutを使わないために構造体をクラスに
置き換えるんならそのまま使った方がマシだろ。
0265デフォルトの名無しさん2010/01/26(火) 23:40:17
http://msdn.microsoft.com/ja-jp/library/ms229053.aspx
クラスライブラリでrefやoutを公開するのは非推奨
C#ならいいんだけどVBやC++/CLIから使う場合には区別がつかないから可読性の問題もある
0266デフォルトの名無しさん2010/01/26(火) 23:41:10
始めからつかわねえように設計しろってことか
0267デフォルトの名無しさん2010/01/27(水) 00:04:24
Javaじゃないのに余計な機能つけるMSが悪いな
0268デフォルトの名無しさん2010/01/27(水) 00:08:11
構造体は値渡しに限る!
0269デフォルトの名無しさん2010/01/27(水) 00:08:37
C++/CLIとかの兼ね合いのせいじゃないの
0270デフォルトの名無しさん2010/01/27(水) 00:14:27
なんてこった!
TryParse も out 使わずに実装しやがれ!
0271デフォルトの名無しさん2010/01/27(水) 00:15:45
TryParseパターンを使う場合も,それだけ提供するんじゃなくて例外投げるバージョンも提供しろっていう
ガイドラインがある
0272デフォルトの名無しさん2010/01/27(水) 00:16:22
いわゆる副作用だし
0273デフォルトの名無しさん2010/01/27(水) 00:18:09
outを使うなって言ってるMSが使ってちゃいかんでしょうw
例外は使いたくないな
だって、ジョエルが使うなって言ってるもん(;。;)
0274デフォルトの名無しさん2010/01/27(水) 00:19:05
誰だ?ビリーか?
0275デフォルトの名無しさん2010/01/27(水) 00:20:16
Joel Spolsky

お前オッサン臭がするぞ
オッサンだろ
0276デフォルトの名無しさん2010/01/27(水) 00:22:44
でも、out使わないで、Parseに成功したか
うまく書く方法はあるんか?
0277デフォルトの名無しさん2010/01/27(水) 00:26:06
boolと値を持った構造体を返すとか
0278デフォルトの名無しさん2010/01/27(水) 00:36:21
TryParseの中でParse呼んでたら笑うな
0279デフォルトの名無しさん2010/01/27(水) 00:40:45
TryParseなんてあんのが間違ってるな。
true/falseの返り値チェックし忘れそうだし。
こんなメソッド提供する必要ない。
0280デフォルトの名無しさん2010/01/27(水) 00:40:47
>>273
間違ったコードは間違って見えるようにするって奴か

しかしながら俺は”他人が俺の拵えた関数のエラー値を正しくチェックしている”なんて信用していないんだ。
だから例外処理を強制する
0281デフォルトの名無しさん2010/01/27(水) 01:13:32
例外処理は値渡しに限る!
0282デフォルトの名無しさん2010/01/27(水) 01:35:16
「out 使うな」は「絶対ダメ!」じゃなくて「避けれるならない方がいいよ」って話。

多値戻り値サポートしてれば out 要らないんだけどね。
あと、C# の場合は過去のしがらみ(COM 相互運用とか)で out が必要。
0283デフォルトの名無しさん2010/01/27(水) 01:51:10
Goは多戻り値サポートしてるらしいね。
なんでC#はサポートしなかったんだろう?
0284デフォルトの名無しさん2010/01/27(水) 02:00:52
そもそもなんでいつまでも関数と戻り値と引数なんだろう。
0285デフォルトの名無しさん2010/01/27(水) 02:09:29
>>284
関係性を定義するのは集合と写像が基本であり、
写像の典型例が関数だから。
0286デフォルトの名無しさん2010/01/27(水) 02:16:37
エラーを戻り値で通知されると、いちいちメソッドの説明読んで
「エラーの際は○○を返却します」を読まないといけないから嫌じゃ。
マクロが使えるHRESULTとかだったらまだいいけどな、
ハンドルでNULLと0xFFFFFFFFが共存してるのはマジ死ねとしか言えない。
0287デフォルトの名無しさん2010/01/27(水) 02:21:36
そーか
死ね
0288デフォルトの名無しさん2010/01/27(水) 02:55:21
そーかは嫌いですよね。
0289デフォルトの名無しさん2010/01/27(水) 03:01:35
>>286
そんな旧式の動作をするようなクラスが.NETの基本クラスライブラリにどれだけあるか、例にあげてご覧よ。
0290デフォルトの名無しさん2010/01/27(水) 03:08:27
C時代に逆行すんのが嫌だって言ってんじゃないの?
0291デフォルトの名無しさん2010/01/27(水) 03:59:57
>>263>>258
比較ごとに毎回replace*2、parse*2するのはコスト的に馬鹿らしくないか?

因みに、PenM 1.7GHzでreplaceとparseだけを2^21回実行したら1.5〜2秒くらいだった
(2^21回=要素数1024の最悪ケース=要素数65536の平均ケース)
0292デフォルトの名無しさん2010/01/27(水) 04:04:52
何回ソートするのかによる
頻繁にやるようならキャッシュするけど
数回なら拘るのは馬鹿らしいのでしない
0293デフォルトの名無しさん2010/01/27(水) 04:40:39
>>291
最適化は質問者の仕事だろ
実際の流れが分からないと答えでないし
そもそもそこまでしてやる必要ない
0294デフォルトの名無しさん2010/01/27(水) 05:59:38
独学でjavascriptをやってみて面白くなってきたんですが(jsだったのは実行環境を整えるのが楽だったから)
文法が似てるきがするのでC#もやってみたいんですが
いわゆるmainにすべての処理を書くようなプログラミングで(サブルーチン程度なら関数も使っていますが)
オブジェクト指向?構造体?コンストラクタ?みたいな状態なんですが(知らずに使っているかもしれませんが)
上記のようなことを知りたい場合におすすめな定番ページはありますか?

演算子、配列、構文などは分かってると自分では思います
0295デフォルトの名無しさん2010/01/27(水) 06:01:17
本当かなあ・・・
0296デフォルトの名無しさん2010/01/27(水) 07:37:17
Visual C#導入したのだけど、ビルド?の使い方がよくわかりません
例えばhttp://www.microsoft.com/japan/msdn/vstudio/2008/product/express/install_vcs.aspxにある時計を表示するプログラムを書いて
これを実行するプログラムを作成するにはどうすればいいんでしょうか
ソリューションのビルドってやってもビルド正常終了ってなるだけで何もおきません
exeファイルは作れないのですか?
0297デフォルトの名無しさん2010/01/27(水) 07:42:37
ソリューションの右クリックでエクスプローラー出したり
自分でエクスプローラーでプロジェクトの場所開くなりして
DebugやReleaseフォルダ探せばEXEファイルが入ってるだろう
0298デフォルトの名無しさん2010/01/27(水) 08:01:02
>>266
オブジェクト指向頭になるとintだろうがなんだろうが基本的にはクラスで
抱える考えになるのでrefとかoutで悩むことはないはずなんだが

>>267
>>262のAPI使うときにないとこまる
用途はそれくらいだろ
0299デフォルトの名無しさん2010/01/27(水) 08:03:43
>>296
ビルドは作ってるだけだよ
その隣のデバックのところで動かせるし
exeそのものを取り出したいならプロジェクトのパスをたどって
binフォルダ->Releaseフォルダ->xx.exeと探すしかない
0300デフォルトの名無しさん2010/01/27(水) 08:09:58
javascriptのprototypeベースクラスのほうが難しいと思うけど、
きっと手をつけてないんだろうな。

でもま、そんなあなたに JScript.NET ! こっそり入ってます。
03012962010/01/27(水) 08:13:45
見付けられました、ありがとうございます
0302デフォルトの名無しさん2010/01/27(水) 09:01:34
2008 Expressで、[デバッグ開始]で実行したときに
自動的にデバッグビルドに切り替えるか、警告を出してくれるようなオプションはありませんか?
0303デフォルトの名無しさん2010/01/27(水) 09:02:07
F# は多値戻り値をサポートしてるよん
0304デフォルトの名無しさん2010/01/27(水) 09:17:30
多値戻り値ってなーに?
object[]返してるようなもの?
0305デフォルトの名無しさん2010/01/27(水) 09:23:07
従来のCなどであったコールバック(イベントドリブンとかで使ってるやつ)というのは
デリゲートとかいうやつなんでしょうか?
0306デフォルトの名無しさん2010/01/27(水) 10:08:22
>>304
C系の文法で書くなら、
Ret1, Ret2 Method(Arg1 x1, Arg2 x2)

ラムダ的に書くなら、
(x, y) => (x + y, x * y)

みたいなの。

C# 的にいうと、
void Method(Arg1 x1, Arg2 x2, out Ret1 r1, out Ret2 r2)
を
var r1, r2 = Method(x1, x2);
って書き方で呼べてもいいじゃないっていう。
0307デフォルトの名無しさん2010/01/27(水) 10:09:07
>>305
おおむねその通り。
関数ポインターよりはデリゲートの方が高機能だけど。
インスタンスメソッドも渡せたり、マルチキャストできたり。
0308デフォルトの名無しさん2010/01/27(水) 10:18:51
InfoQ: Mono が C# 言語の拡張機能を試験的に導入
http://www.infoq.com/jp/news/2010/01/Mono-CSharp-Ex

複数戻り値も入っとるな、こっちはout引数がついた関数を特別な呼び方ができるやつ
じゃなくてタプルをアンパック代入できる方式だが
0309デフォルトの名無しさん2010/01/27(水) 10:20:14
参照渡しは参照渡し
値渡しは値渡し

ポインタの値渡しはあるが、参照の値渡しなんて概念がある言語ってあったか?
0310デフォルトの名無しさん2010/01/27(水) 10:31:59
だから参照の値渡しってのは結局のところ参照渡ししてるだけだっつーの。
0311デフォルトの名無しさん2010/01/27(水) 10:32:31
「参照の」は「参照型の」という方が自然だが、普通にC#で使うな
0312デフォルトの名無しさん2010/01/27(水) 10:33:16
>>310
じゃあ(ref object x)はなんと表現するんだ
0313デフォルトの名無しさん2010/01/27(水) 10:37:03
参照の値渡し
1) 参照の(指している何か自体の)値渡し
2) 参照の(指している場所情報の)値渡し

だから何?
0314デフォルトの名無しさん2010/01/27(水) 10:38:42
VBね
http://img.f.hatena.ne.jp/images/fotolife/t/taka_2/20090528/20090528234725.jpg
0315デフォルトの名無しさん2010/01/27(水) 10:50:09
>>309
JavaとかC#の参照型って結局ポインターみたいなもんだからねぇ。
ポインターの値渡しに相当。
0316デフォルトの名無しさん2010/01/27(水) 10:55:45
call by object だな。
「参照の値渡し」というのはVBの用語と考えた方がいいと思うが。
0317デフォルトの名無しさん2010/01/27(水) 11:04:59
概念的な話なのか内部構造的な話なのか
0318デフォルトの名無しさん2010/01/27(水) 11:11:11
概念からくる内部構造じゃないの?

c#だとクローンが参照の値渡しみたいなもんじゃね?
0319デフォルトの名無しさん2010/01/27(水) 11:56:14
参照の値渡し
参照の参照渡し
値型の値渡し
値型の参照渡し
0320デフォルトの名無しさん2010/01/27(水) 11:59:58
boolとstringみたいに帰ってくるのがほとんどだろうから
if (method(xxx)) { xxxxxx; } って書けないのはありがたみがないな
0321デフォルトの名無しさん2010/01/27(水) 12:08:41
どうせ成否判定と処理結果を返したいってのが殆どのケースなんだろし
成否判定だけ特別に扱える構文でも作ればよくね?
→ 例外が出来ました

ってのが元々なんだけど、C#では例外で処理フローつくるのはやめてねってことになってるんだよね。
だから検査例外が存在しない。(catchしなくてもコンパイル通る=処理しないといけないエラーは例外にすんな)
0322デフォルトの名無しさん2010/01/27(水) 12:40:40
>>307
ありがとうございます。
0323デフォルトの名無しさん2010/01/27(水) 13:44:17
>>322
うむ
0324デフォルトの名無しさん2010/01/27(水) 14:10:07
c#でコントロールの再描画の際のちらつきを抑える方法はないでしょうか?

Formにダブルバッファ設定があったので試しましたがやはりちらつきます。
ゲーム関連のようにvsyncを待ってとかできれば一番いいのですが
0325デフォルトの名無しさん2010/01/27(水) 14:12:14
まあFomだけ有効にしたって子コントロールはダブルバッファリングしてくれないからね
0326デフォルトの名無しさん2010/01/27(水) 14:16:18
>>325
まあそんな感じですよね
ウインドウのシステム上完璧にってのは無理なんですかね・・・

あとvistaとか7は問題ないのかもしれないですけど古い2DドローシステムのXPはどうしても
0327デフォルトの名無しさん2010/01/27(水) 14:50:59
>>324
フォームのダブルバッファはあくまでもフォームに対する設定だからなぁ
そのコントロールを派生し、コンストラクタにおいて
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
this.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
をやってみるといい。
0328デフォルトの名無しさん2010/01/27(水) 14:51:43
あ、True ではなく true ね
0329デフォルトの名無しさん2010/01/27(水) 15:00:22
>>327>>328
おお、まったくちらつかないw

Direct2DでやれることはほぼできるしAAかけたりできるのにちらつきがあることで
あきらめてたのがあったんですがこれでできそうです
0330デフォルトの名無しさん2010/01/27(水) 15:23:11
>>329
感謝を忘れるんじゃねえw
0331デフォルトの名無しさん2010/01/27(水) 15:28:30
>>330
そうでした
感激のあまりちょっと先走ってしまった

>>327>>328
ありがとうございます。
■ このスレッドは過去ログ倉庫に格納されています