19/04/06 19:26:12.20 nnViyGGtM.net
実現したいならタスクBが走ってるスレッドを殺すしかないが
その場合ILが半端なところで止まってクリーンアップ処理が正常に走らないからリークする
嫌なら249が言ってるような方法でタスクが自発的に止まるしかない
好きにしたらいい
263:250
19/04/06 20:05:47.05 hyh7Xf1q0.net
>>254 そうじゃなくて、質問して「質問は・・ということなの?」的なレスが返ってきた状況のときに
「そうです。解決方法を教えてください」ってその人にレスしても放置されることが多々あるという経験を書いただけ。
別に質問の大半が放置されたわけではないよ。
あと理系の人が書いた本とかマニュアルは難解でも当方は理解しますし「分かりやすく書けや」とはそれほど思いません。
理解しやすい文章を書けと思う人は経験不足です。
264:デフォルトの名無しさん
19/04/06 20:12:41.03 gcTy2CwVM.net
はやくゴミクズから人間になろうな
265:デフォルトの名無しさん
19/04/06 20:15:14.96 MA8UEjRg0.net
でも>>236と>>240ってわかりにくい云々の前に
頭がおかしいレベルだよね?
流石に今後の人生のために改善したほうが良くね?
266:デフォルトの名無しさん
19/04/06 20:28:05.68 MT95SofI0.net
質問の意味を確認される時点でそもそも伝わりにくい文章だと思うけど。
コミュニケーションは相対的なものとはいえ、相手に負担を押し付けるやりとりをしていることに気づいてないのでは。
267:デフォルトの名無しさん
19/04/06 20:43:07.38 j7WnBgX90.net
>>260
一緒にしたら失礼。
難解な本は読み手に前提となる知識が足りないから読み難いが、書くべきことはちゃんと書いてある。
あなたのは書くべき情報が欠落していて単に文章として破綻してるだけ。ついでにその後のコミュニケーションも酷過ぎる。
268:250
19/04/06 20:44:56.97 hyh7Xf1q0.net
240見直したけど
「サブフォームFORM2を作って右上の×で消した時」が分かりにくいかな?
※1 form2 = new Form2();
※2 form2.Show();
「サブフォームFORM2を作って※1表示した後※2にFORM2の右上の位置の×をクリックしてFORM2を閉じた時」
って書かないと駄目だったのかな?でも回答を教えてくれた人居るし分かってほしいな~
269:デフォルトの名無しさん
19/04/06 20:58:19.18 YyWMpA9h0.net
いや、動作がわからないんじゃなくてお前さんがやりたいことがわからないって話な
270:デフォルトの名無しさん
19/04/06 21:01:04.80 Gnot3kBPd.net
小手先に頼らず全部書け
質問に関係なさそうなところも全部書け
関係ないと断言できるだけ知識があるならそもそも質問は生まれない
だから頭からケツまで全部書け
全部書いたつもりでも情報は足りないんだから小学生に伝えるつもりで書け
271:デフォルトの名無しさん
19/04/06 21:01:50.77 J4U0pcz9a.net
いわゆるバカの壁だねw
彼はたぶん自分の何が問題なのか本気で分かってない。
仕事で取引先とかとメールでやりとりしてる人なら同意すると思うけど、
日本人は案外彼みたいな人が多い。
多いというか、日本人全体を母集団にとるとたぶん90%以上が彼みたいなタイプだw
これは(実は案外昔から指摘されてるんだけど)日本の初等教育に問題があるんだよねw
日本の国語教育は何であんなくだらない文学観賞と子供を嘘つきにする作文に偏重してるのか。
思いっきりスレ違いなのでこの辺で
272:デフォルトの名無しさん
19/04/06 21:01:55.77 ZE/404d00.net
>>260
理系の人が書いている文章は、内容が難解であっても文意は明確で読みやすい。君の文章はそうではない。むしろ逆で、平易なことが上手く伝えられず理解してもらえない。
君が「難解だが上手い文章」を読みやすいということと、他の人が「君の下手な文章」を理解しにくいということはまったく別のことだが、何でそこから他人を経験不足だと断じる結論になるのだろうか?
君の方が、他人とのコミュニケーションについて経験不足なのでは?
他人に理解してほしいというのは自然な欲求だが、相手に労力を求めるのでなく自分が理解される努力をしなよ。
273:250
19/04/06 21:25:08.15 hyh7Xf1q0.net
>>266-269
要するに、やったことが無いから何故俺がそれをやりたいことがわからないんだね。
でも回答を教えてくれた人居るし・・。
274:デフォルトの名無しさん
19/04/06 21:26:09.76 Hw9bu2CQ0.net
>>240は「右上の×で消した時」が分かる人には引っ掛け問題になってるな
単に「サブフォームが閉じられたかどうかを判別したい」なら問題なかった
初心者スレだから質問者の文章が分かり難くてもある程度はしようがないし
>>240もその範疇だと思うけど、>>250はあり得ない
叩かれまくってるが自業自得だ
275:デフォルトの名無しさん
19/04/06 21:31:28.36 7yOX3K990.net
>>270
何度も書かれているけれどお前の説明が致命的に下手すぎるのが原因
276:デフォルトの名無しさん
19/04/06 21:49:22.76 l9A0t+NU0.net
>>260
>質問して「質問は・・ということなの?」
っていうのは、おまいさんの質問文そのままじゃわからないので経験を加味して質問文を解読して少しでも回答できるやつを増やそうとしてくれてるんだよ。
おまいさんの質問文そのままじゃ超絶エスパーがスレに降臨するまで話がすすまないよ。
277:デフォルトの名無しさん
19/04/06 21:50:12.97 1moq2C1C0.net
いろいろな人がいろいろな表現で指摘しているけど、
結局のところのお前が程度が他人とコミュニケーション取るレベルに至ってないって指摘だ
早く人間に達しろゴミクズ
278:デフォルトの名無しさん
19/04/06 22:35:24.43 YyWMpA9h0.net
>>270
> 要するに、やったことが無いから何故俺がそれをやりたいことがわからないんだね。
逆、下手に「右上の×で消した時」とか書くからやりたいことがわからないって話
フォームの閉じ方は「右上の×で消す」だけじゃないから知ってる人は特別に「右上の×で消した時」を区別したいのか?とか思うんだよ
>>242-243でも指摘されてるだろ
> でも回答を教えてくれた人居るし・・。
>>243はかなり親切だからいくつかのケースを書いてくれてるけどそれでも
> 具体的に何が目的かを書いてもらった方が答えやすいと思う
って書かれてる意味を考えなよ
279:デフォルトの名無しさん
19/04/06 22:47:01.10 ZtBD8DJx0.net
みんな優しいな
280:デフォルトの名無しさん
19/04/06 23:04:06.29 hyh7Xf1q0.net
>>275
>242 Xボタンで消したときと、Xボタン以外の何らかの方法で消したとき?
242には触れたくなかったけど、こんなこと240に書いてないし242は馬鹿なんだと思う。
それをおかしいと思わない275もどうかなと思う。close()で閉じてもIsDisposedで判別できるし
何で気にするか分からないな。ていうかウィンドウの右上にXが無いのかな?
281:デフォルトの名無しさん
19/04/06 23:14:09.25 j7WnBgX90.net
>>277
日本語が拙いから推測されただけだろ。エスパー求めてるのに何言ってる。
282:デフォルトの名無しさん
19/04/07 00:08:13.42 fnPZIWU30.net
ここまでいろんな人が指摘してるのに論点が噛み合わないのは逆に逸材なのでは
なんかモスバーガーの包み紙のスレを思い出した
283:デフォルトの名無しさん
19/04/07 00:36:33.50 yNnH+Rdg0.net
初歩的な質問で申し訳ないのですが、c#のガベージコレクション機能は循環参照状態にあるインスタンスも破棄してくれるのでしょうか?
暫く調べたのものの「リークするから弱参照を使う」「GCに頼っていい」「javaなど一部言語は破棄する」など多くの話があり混乱しています
より専門的な、ガベージコレクションの内部的な仕組みそれ自体を説明しているサイトは私の知識では理解できませんでした
例えばa→b→c←→dという向きで参照しているインスタンスの組み合わせがあったとして、
aからbの参照を切ってもGCで回収されるのはbだけでcとdの組は残り続けるのでしょうか
284:デフォルトの名無しさん
19/04/07 00:37:08.32 AJMxYZfA0.net
でもさぁ、サブフォームをXボタンで閉じた時と閉じてないときの判別方法を聞いてるのに
>242 Xボタンで消したときと、Xボタン以外の何らかの方法で消したとき?
で選択肢が1個増えて余計ややこしくしてるだけだし
本当に240だけの問題なの?241=242=262の頭に問題は無いの?
285:デフォルトの名無しさん
19/04/07 00:40:32.22 Lr+Z70d50.net
じゃあ、もう一回確認な
サブフォームFORM2を作って右上の×で消した時
どうすれば(どこを調べれば)よいですか?
を
A=サブフォームFORM2
B=右上の×で消した
で置き換えたとき
Aを作ってBのとき
どうすればよいですか?
って何言ってるのかさっぱりわからないよね?
これで世の中渡っていけると本気で思っているのか?
286:デフォルトの名無しさん
19/04/07 00:44:13.15 Lr+Z70d50.net
>>281
じゃあ、質問に答えてね
サブフォームFORM2を作って右上の×で消した時どうすれば(どこを調べれば)よいですか?
287:デフォルトの名無しさん
19/04/07 00:49:36.20 vK2HJm7v0.net
>>282
気持ちは分かるが落ち着けw
>>236は>>240で意味不明だっと認めて訂正してるぞ。
288:デフォルトの名無しさん
19/04/07 00:55:57.83 Lr+Z70d50.net
>>284
そんなの考慮する必要ない
だって彼にもその気はないんだから
289:デフォルトの名無しさん
19/04/07 01:00:11.33 h90p5IeD0.net
>>281
いったい何に拘ってるんだ?そこまで自分に非があることを認めたくないのか?
>>241,242で君の説明が理解されなかったのは別に変でもないし頭がおかしいという訳ではないぞ。>>262も攻撃的ではあるが頭がおかしいというのとは違う。
誰も>>241等のレスに無関係に、君の一連のレスに対して、説明が下手であること、態度に問題があること、それについて君がいっこうに理解できていないことを指摘しているだけ。
290:デフォルトの名無しさん
19/04/07 01:58:10.82 73jPe6360.net
>>280
こっちの話の方が面白そうだよ
291:デフォルトの名無しさん
19/04/07 05:53:56.72 vRdyA0zq0.net
>>280
そういう単純なケースならc,dともに回収されるので気にするな
292:デフォルトの名無しさん
19/04/07 06:41:43.95 u8jd6Keja.net
>>280
GCの方式が参照カウンタ方式というものなら循環参照があると回収されないけど
C#(.NET)は世代別GCという方式だから循環参照があっても未使用なら回収される
> 例えばa→b→c←→dという向きで参照しているインスタンスの組み合わせがあったとして、
> aからbの参照を切ってもGCで回収されるのはbだけでcとdの組は残り続けるのでしょうか
b, c, dが他から参照されていなければ、b, c, dすべて回収される
293:デフォルトの名無しさん
19/04/07 07:40:40.19 AvqFg2320.net
>>277
う~ん、引っ込みがつかなくなってるのか本当に初心者で何を指摘されてるのか理解できてないのかよくわからんけどここ初心者用だから初心者として仮定して…
Xボタンでフォームを消すと言うのはどちらかと言うと一般的じゃない(普通のフォームならOk/Cancel/閉じるボタン等を配置するよね)ので「右上の×で消す」と書くとなにか特別なことをしようとしてるのかと思われるの
ただ初心者だとXボタンで消すのが当たり前と思ってる人もいるから確認の為に>>242みたいなことを聞いてるわけ
あとそもそもサブフォームの状態を調べると言うのもあまり一般的じゃない
GUIだとイベントで処理するのが普通だから>>238みたいなことを言われる
294:デフォルトの名無しさん
19/04/07 07:58:43.91 AvqFg2320.net
>>280
初歩的な質問じゃない気がするがw
まあこのスレとしては「GCに頼っていい」が正解かな
>>289も書いてるけどGC持ってる最近の言語の実装は世代別(と言ってもたいてい2世代だけど)GCになってるのが多く最終的にはマーク&スイープで回収されるのが一般的なので全部回収されると思ってていい
295:デフォルトの名無しさん
19/04/07 14:00:44.14 yNnH+Rdg0.net
>>287-289,>>291
ありがとうございます、助かりました
もう少しC#に慣れるまでメモリ管理は忘れます
296:デフォルトの名無しさん
19/04/07 16:38:33.55 gLMV6b6F0.net
Listboxにデータをバインディングするときに、XAMLにBinding記述する方法と、コントロールに名前を付けてコード上からやる方法がありますが、どちらがよいのでしょうか
297:デフォルトの名無しさん
19/04/07 18:07:02.76 yVw8pf+H0.net
好きにすれば良いけど転がってるサンプルコードはほぼXAMLでやってるな
298:デフォルトの名無しさん
19/04/07 18:24:40.28 bCl1La9L0.net
GCがちゃんと動いてオブジェクトが解放されたのかは、デストラクタに
Console.WriteLine("解放されますた!");
と書いておくと安心できる。
メモリリーク発生の可能性も減る。
299:デフォルトの名無しさん
19/04/07 18:48:15.95 zc2PfqGUM.net
>>295
心の安寧が欲しいなら止めないけど
C#では、パフォーマンスを低下させるため、プログラムの動作に必要がない
ファイナライザを実装すること自体が推奨されないことは、知っておいた方がよい
パフォーマンスが低下するのは、ファイナライザの実装されていると
GC時にファイナライザキューを介してファイナライズが行われるが
このファイナライズを行う際はStop the worldする必要があるためだ
ファイナライザを保険として実装した上で、前述のパフォーマンス低下を避けるには
自分でファイナライザ相当の処理をした上でSuppressFinalizeを呼び出しておく必要がある
この場合、ファイナライザは実行されなくなり、パフォーマンスの低下も起きない
300:デフォルトの名無しさん
19/04/07 18:49:09.04 QS/EO+8da.net
デストラクタにはなるべく頼らないようにしようぜ
デストラクタを記述するにしてもDispose()されたときにGC.SuppressFinalize(this)しようぜ
>>295
出力の有無でメモリリークに気づける可能性はあるが「発生の可能性も減る」について詳しく
301:デフォルトの名無しさん
19/04/07 19:36:38.60 AJMxYZfA0.net
既にスレを荒らした状態になってるから、もうこれで最後にするけど
>>290
の上8行「右上の×で消す」という書き込みは初心者が使うフレーズだから
中~上級者の俺様は深読みして間違えたと解釈したけど
本物の中上級者でも「右上の×で消す」の意味は「右上の×マークをクリック
して窓を消す」以外ありえません。そういうわけであなたは
初心者でも中~上級者でもない別の何かです。
初心者の書く「右上の×で消す」の文が不満で何で
「Xボタンで消したときと、Xボタン以外の何らかの方法で消したとき?」
何で選択肢が増えるんだよw
プログラムより国語の勉強しないと。
回答側に回りたいなら模範回答できる質問だけにしてください。
302:デフォルトの名無しさん
19/04/07 19:41:49.21 AvqFg2320.net
>>298
> 「右上の×で消す」の意味は「右上の×マークをクリックして窓を消す」以外ありえません。
どうしたらこんな頓珍漢なレスができるんだよ…
誰もその意味がおかしいとか言ってるわけじゃないぞw
303:デフォルトの名無しさん
19/04/07 20:15:40.25 AJMxYZfA0.net
>>299 何でイベントのclosedでは駄目かというと、閉じた瞬間の情報が欲しい訳ではないからです。
窓閉じてしばらくして閉じたかどうか知りたいってことなので。なんでそんなこと知りたいんだよ(怒)
って言われても別にいいだろとしか。c#はイベントで処理するからって考えの人にあれこれ
言う義務は俺には無いよ。
304:デフォルトの名無しさん
19/04/07 20:16:16.95 QS/EO+8da.net
>>298
初心者様ってすごいね
ちゃんとした回答が欲しいなら質問をちゃんと書いてね
URLリンク(teratail.com)
ここは5chだから多少は違いがあるけど「正しく伝わる質問の仕方」は同じだよ
305:デフォルトの名無しさん
19/04/07 20:32:13.15 E1covCOyM.net
昨日今日はどのスレもこんなのばっかりだぜ
金払ってスクールでも通えよって
306:デフォルトの名無しさん
19/04/07 20:37:07.02 AvqFg2320.net
>>300
別に閉じてるかどうかを知りたいことがないわけじゃなくて珍しいって話な
たいていの場合はなにか設計がおかしい可能性が高い
まあ俺に影響あるわけじゃないから好きにすればいいと思うけどw
307:デフォルトの名無しさん
19/04/07 20:56:30.81 AJMxYZfA0.net
>>301
回答は貰ったんだよ。
質問はその後訂正してる。他の上級者は理解して神回答を頂きました。
>>281-285見たら誰が問題か分かる。284に変なレスしてる奴。
C#はイベントだけで処理すると考える学生がイベントのclosedで解決すると思ったら
解決しないから発狂してキチガイとか日本語が変とか難癖つけたんだろ。
308:デフォルトの名無しさん
19/04/07 21:09:42.81 aPMrZc410.net
ゴミクズにレスつけてる奴も死なねえか
お前のせいで終わらんのやぞ
309:デフォルトの名無しさん
19/04/07 21:39:33.31 QS/EO+8da.net
>>304
質問内容に >>300 中の「閉じた瞬間の情報が欲しい訳ではないからです。窓閉じてしばらくして閉じたかどうか知りたい」
という内容も書かれていたら、最初から正しいIsDisposedの回答だけが得られたかもしれないね
「学生」を罵り言葉として使っているということは社会人かな?
その態度を貫けるくらいには沢山エスパーが居る会社なのかな、凄い環境だなあ
310:デフォルトの名無しさん
19/04/07 21:59:51.43 FnnSZHMw0.net
>>298
え?じゃあ聞くけど
サブフォームFORM2を作って右上の×で消した時どうすれば(どこを調べれば)よいですか?
FORM2 form2 = new Form2();
311:デフォルトの名無しさん
19/04/07 22:30:58.81 RA8LBCNw0.net
オフショア開発してるけどこんな訳わからない質問ばっかで気が狂いそうになるよ
エスパー能力欲しいなぁ
312:デフォルトの名無しさん
19/04/07 22:31:35.27 AvqFg2320.net
>>306
まあ引っ込みつかなくなってるんだろうね
学生云々は不問にするとしても
> C#はイベント「だけ」で処理すると考える
とか誰も書いてないことを言い出してるしw
313:デフォルトの名無しさん
19/04/07 23:15:27.17 fnPZIWU30.net
この議論はGCに処理してもらおう
314:デフォルトの名無しさん
19/04/07 23:52:46.05 h90p5IeD0.net
>>310
なるほど。この無価値な議論の中身を気にして参照してるのはもはや当人同士の循環参照のみだから、>>289に書かれている通り世代別GCで回収されるわけですな。
315:デフォルトの名無しさん
19/04/08 20:04:21.39 bxLyJs4eM.net
引数について質問させてください
ref と out の違いってなんですか?
どういうときに ref を使うのか、out を使うのか、よくわかりません
316:デフォルトの名無しさん
19/04/08 20:16:44.97 DkSPe/Rf0.net
>>312
URLリンク(www.atmarkit.co.jp)
317:デフォルトの名無しさん
19/04/08 20:23:20.59 WPZzOuq3a.net
>>312
ref引数は、呼び出し先関数で、引数を使うし設定もする場合に使う
out引数は、呼び出し先関数で、引数を設定するだけの場合に使う
この違いにより、refで渡す引数は初期化しておく必要があるけど、outで渡す引数は未初期化でも構わない
.NET Framework中にある実例としては
int.TryParse()の場合、文字列の数値を引数に設定するだけで、引数の元々の値は使わないから、out引数でいい
難しい例だがInterlocked.CompareExchange()の場合、引数の値を返すし引数に設定する必要もあるため、ref引数が必要
値型と参照型の違いも知っておいたほうがハマりにくいかも
318:
19/04/08 21:00:25.38 PMJ1/1Ak0.net
>>314
めんどくさいので out は忘れて ref ばかり使っていますが問題ありますでしょうか!?
319:デフォルトの名無しさん
19/04/08 22:47:42.86 WPZzOuq3a.net
>>315
refでも問題らしい問題は無いだろうけれど
refでなくoutで済む場面ならoutを使ったほうが楽できる
未初期化変数でも渡せるし、C# 7からはout引数の場所で変数宣言が出来るようになった
URLリンク(docs.microsoft.com)
ただout引数やref引数を取る関数はasyncやiteratorメソッドに出来ないから
最近の風潮だと、out引数を経由して多値を返すよりも、戻り値の型をValueTupleにして直接多値を返す方が良さそう
URLリンク(ufcpp.net)
320:デフォルトの名無しさん
19/04/09 00:18:34.64 /fBSGCK40.net
コンストラクタでテキストボックスの値でフィールドを初期化しようとしたら怒られた これダメなのか…
321:デフォルトの名無しさん
19/04/09 02:13:47.76 UAdV14hW0.net
>>317
なんと言って怒られたの?
322:デフォルトの名無しさん
19/04/09 10:04:22.44 iYhZfRkA0.net
おんどりゃぁふざけた初期化すんじゃねぇ です
323:デフォルトの名無しさん
19/04/09 10:26:21.20 euLRl0x60.net
>>317
日本語でおk
324:デフォルトの名無しさん
19/04/09 11:37:19.16 6ZB9MqDTM.net
コンストラクタでテキストボックスの初期化、俺じゃなきゃ見逃しちゃうね
325:デフォルトの名無しさん
19/04/09 11:56:56.57 hdDhGrZ5a.net
>>317
デザイナーで置いたテキストボックスのインスタンス構築や、各種プロパティの設定は
実際はInitializeComponent()メソッドの中で行われる
InitializeComponent()よりも前で値を読もうとしてNullReferenceExceptionが出ているのなら
InitializeComponent()の後で値を読めばいい
までエスパーした
326:デフォルトの名無しさん
19/04/09 21:10:24.64 0DYeC
327:6pW0.net
328:デフォルトの名無しさん
19/04/09 21:31:50.99 2u68c9Dp0.net
標準出力に改行が出力されてないから
329:デフォルトの名無しさん
19/04/09 21:49:55.14 0DYeC6pW0.net
>>324
試しに全部のprintfに改行入れてみたけど、それでもscanfが全部終わるまでOutputDataReceivedイベント発生しないっぽい。
C#側で標準出力を受け取ってstringに追加 ー> exe側は入力待機 ー> C#側からStandardInput.WriteLineで標準入力 ー>exe側は処理続行
みたいな コマンドプロンプトからのの実行と同じような動きをする処理って、C#じゃどうやるんだろう?
330:デフォルトの名無しさん
19/04/09 23:25:15.43 2u68c9Dp0.net
stdoutがパイプに繋がってるとprintfは改行があろうがバッファし続ける
setbuf(stdout, NULL)しとくか、printf後にfflush(stdout)するか
331:デフォルトの名無しさん
19/04/09 23:39:38.53 IIo4qqMm0.net
C#関係なくね?
332:デフォルトの名無しさん
19/04/09 23:59:05.15 0DYeC6pW0.net
>>326
setbufでもfflushでも何故か入力待機状態が終了するまでOutputDataReceivedイベントが発生しなかったからあきらめてテキストファイルにログ出力してそれ読み込むことにするわ
教えてくれてありがとう
333:デフォルトの名無しさん
19/04/10 20:02:38.36 YVfMef4MM.net
>>313-316
だいぶ返信が遅れてしまいました
まとめてですみませんが、親切に教えていただきありがとうございました
334:デフォルトの名無しさん
19/04/12 22:52:29.27 luZS+mvc0.net
C#関係ないんだけどシングルトンの使い場所がわかりませぬ
こんなクラスがあるとして、
class a{
Dictionary<string, string> hoge;
public string getHoge(key)
{return hoge[key];}
}
hogeにはDBから対象の精々100くらいの全レコード取ってきて格納しておきたい
複数インスタンスが必要にはならないようなデータ
外部からのsetは許可しない
こういう時ってシングルトン使ってnew時にDBからデータ取得とかしていいのでしょうか?
もっと賢いやり方あります?
335:デフォルトの名無しさん
19/04/12 23:01:43.16 fgu2eH2Ta.net
>>330
シングルトンはテストを困難にするアンチパターンだから忘れていい
単一のインスタンスが欲しい場合はDIを使う
336:デフォルトの名無しさん
19/04/12 23:09:32.03 SGqhATO10.net
>>331
DIとシングルトンは全く別の概念やぞ…
337:デフォルトの名無しさん
19/04/12 23:11:43.52 fgu2eH2Ta.net
>>332
DI使ったことないの?
単一のインスタンスを共有するのは大抵のDIコンテナでサポートされている一般的な機能だよ
338:デフォルトの名無しさん
19/04/12 23:33:00.52 HVuVGzQQr.net
staticじゃあかんの?
339:デフォルトの名無しさん
19/04/12 23:33:46.50 FJ5vSxoFM.net
発想の飛躍やべぇな
340:デフォルトの名無しさん
19/04/12 23:40:02.85 le1Q6kdLM.net
シングルトン大好き。
状況的に複数インスタンス生まないクラスは必ずと言っていいほどシングルトン。
341:デフォルトの名無しさん
19/04/12 23:41:28.59 le1Q6kdLM.net
class名.staticメソッド、static変数を多用。
342:デフォルトの名無しさん
19/04/12 23:47:39.11 SGqhATO10.net
>>333
お前こそプログラミングしたことないやろ…インスタンスの意味から調べてこい
343:デフォルトの名無しさん
19/04/12 23:51:53.21 GRWvVKgh0.net
>>334
get setでなんか仕掛けるでもしない限りはstaticでいいよな
344:デフォルトの名無しさん
19/04/13 00:17:16.36 DF10sMIkM.net
>>339
ユニットテストでモックしたいときどうすんの?
345:デフォルトの名無しさん
19/04/13 00:45:48.83 gAxxWG/M0.net
シングルトン的なことがしたいときの今時のやり方はDI使うことだな
346:デフォルトの名無しさん
19/04/13 01:23:05.24 4BHEL+7ta.net
>>330
言語レベルで単一インスタンスの強制を保証する必要が
本当にそんなにしばしばあるのかなとは個人的には思うね。
要は共有方法を明確にしておけば十分じゃないかと。
そもそも共有されるオブジェクトを各々が勝手にnewするのがおかしいわけで。
具体的には、例えばWindows FormならVSが自動生成するProgramクラスの
staticな読み取り専用プロパティとして実装する約束にしておけば済む
347:デフォルトの名無しさん
19/04/13 05:26:30.24 f7He4YCD0.net
俺もそう思う
べき論としてみんな口々に言うけどそこを懸念するとかどんだけ連携がないチームなんだよ
348:デフォルトの名無しさん
19/04/13 08:35:33.20 vIVj+RyW0.net
>>341
ただ、DIもシングルトンの一形態という記述は見たことが有る
349:デフォルトの名無しさん
19/04/13 08:39:55.79 Gb+AenIc0.net
以前に書いたプログラムを元に加筆修正して別のプログラムを作った時
フォルダもソリューションも別名で保存したいのですが
VisualStudioはそういう保存はできないのでしょうか?
今は力業であらかじめ別名フォルダにコピーしたソリューションから作り始め
ソリューション名、プロジェクト名、アセンブリ名、空間名
等を書き換えてからプログラムの修正を始めるのですが
時々何かがおかしくなってバインディングが外れたり
破綻してしまうこともあるので
何か安全に書き換える方法があるのかな?と質問しました
350:デフォルトの名無しさん
19/04/13 08:52:30.68 J/cBqpWVM.net
>>345
いい加減git使おう
351:デフォルトの名無しさん
19/04/13 09:32:07.36 Gb+AenIc0.net
>>346
うーんちょっと調べただけだけどヤヤこしそう・・・
それにバージョン管理とは違うんだよなー
ワープロを元にデータベースを作ったからフォルダもソリューションも変えて保存したい
って感じなんだけど
352:デフォルトの名無しさん
19/04/13 09:39:52.37 vbn0MA6qa.net
レベル下がったなこのスレも
VB.NETとJavaが終わりつつあるから流入してるのか
353:デフォルトの名無しさん
19/04/13 09:55:51.57 J/cBqpWVM.net
>>347
慣れたら自然にそんなアホなことをしようとは思わなくなるから気にしなくていい
俺も初心者の頃はそうだったから気持ちはよくわかる
354:デフォルトの名無しさん
19/04/13 09:59:00.31 C2d1A80t0.net
>>348
レベルの高い時期があったみたいな言い方だな
355:デフォルトの名無しさん
19/04/13 10:04:10.28 vzJQEXVg0.net
>>347
ソリューションを変えるのはわかるけど
> プロジェクト名、空間名
とかは変えなくても良くね?
356:デフォルトの名無しさん
19/04/13 10:41:12.62 kUX6ubEA0.net
>>351
そうなの?
とりあえずその方がコードも分かりやすいから
exeとタスクトレイに表示される名前だけ反映させるには
アセンブリ名とアセンブリ情報の中だけでいいのかな
357:デフォルトの名無しさん
19/04/13 10:44:39.80 nXQ9b0jN
358:0.net
359:デフォルトの名無しさん
19/04/13 11:21:31.91 umtct5vHa.net
>>353
int a, b, c;
void Reset() { a = 1; b = 2; c = 3; }
Reset();
ref int x = ref a;
x = (true ? b : c); // 普通の条件演算子
x = 4; // xの参照先はaのままなのでaが変わる
Console.WriteLine($"{a} {b} {c}"); // 4 2 3
Reset();
ref int y = ref a;
y = (true ? ref b :ref c); // 条件演算子の2項目と3項目にrefはあるが、条件演算子の前にrefはない→参照でなく値が代入されるだけ(上と同じ)
y = 4; // yの参照先はaのままなのでaが変わる(ここでハマってそう)
Console.WriteLine($"{a} {b} {c}"); // 4 2 3
Reset();
ref int z = ref a;
z = ref (true ? ref b : ref c); // 条件演算子の前にrefがある→zの参照先が変わる
z = 4; // zの参照先がbになったのでbが変わる
Console.WriteLine($"{a} {b} {c}"); // 1 4 3
// URLリンク(ufcpp.net) もどうぞ
360:デフォルトの名無しさん
19/04/13 18:28:52.41 a4r2Gpw40.net
この言語は、見かけはC++の兄弟分のような顔をしたVBだな。
361:デフォルトの名無しさん
19/04/13 18:49:30.17 nXQ9b0jN0.net
>>354
ありがとう!やっとわかったぜ!!!
362:デフォルトの名無しさん
19/04/13 22:22:05.47 zPnWLOfMa.net
>>354
こんな機能追加されてたんだw
でも積極的な使い方を思いつかんなあ
363:デフォルトの名無しさん
19/04/13 22:30:05.68 4tcIFh//0.net
後から追加された機能ってどれもセンスないよね
364:デフォルトの名無しさん
19/04/13 23:41:32.18 04eDeW4Td.net
>>358
は?
365:デフォルトの名無しさん
19/04/13 23:52:54.44 4tcIFh//0.net
>>359
は?じゃねぇよクソ虫
366:デフォルトの名無しさん
19/04/14 00:08:30.69 01zt8L7jd.net
>>360
ジェネリクスもセンスないのかい?
367:デフォルトの名無しさん
19/04/14 00:26:39.46 eLdyJ0cI0.net
>>358
最近追加された機能は効率重視でちょっと分かり難いのもあるから、
そういう風に見えるのも分からないでもない。
368:デフォルトの名無しさん
19/04/14 00:53:29.67 DOuVmEEK0.net
言語の価値って開発環境も含めて評価すべきじゃない?
自分は別に他の言語でもよい処理をついついc#でやっちゃうのはやっぱりIDEの強力なサポートがあってのことだわ
369:デフォルトの名無しさん
19/04/14 08:42:45.32 H5M6zKH30.net
>>363
これはRuby先輩を呼び寄せるための撒き餌ですか?
370:デフォルトの名無しさん
19/04/14 08:50:41.27 k2b6YaL90.net
C#は、CとC++の系列のように外見を装っているが、実際にはVBのほうが似てる言語だろう。
CやC++に対しておこがましさを感じる。
371:デフォルトの名無しさん
19/04/14 08:55:34.96 TOfo8K8Bd.net
>>358
ラムダ式とか使わんの?
372:デフォルトの名無しさん
19/04/14 09:07:27.41 UDnauAFh0.net
>>363
言語の基本文法のみ良し悪しとか、標準ライブラリまで含めての評価とか、議論の対象をどこまでとすらかは文脈によるだろうし、君が開発環境まで含めた話をしたいというならそういう話題をふって話を進めればいいよ。
言語単体での話をしている時に「いやいやIDEが~」とか言い出すと話が発散するから、議論の対象は明確に区切って意識した方がいい。
373:デフォルトの名無しさん
19/04/14 09:28:07.93 VqeGGHsz0.net
>>358
.NET 1.1 の世界から出てくるな
374:デフォルトの名無しさん
19/04/14 09:34:22.94 LBjjw3Zya.net
今の時代、言語だけ語っても意味はないよなぁ
使えるオプソのバラエティとか、コンテナとの親和性とかの評価は避けて通れない
375:デフォルトの名無しさん
19/04/14 12:23:16.39 cHKb6r3Sa.net
>>357
この辺の追加機能はパフォーマンスを求めるための機能だから
速度特化ライブラリの製作者は使うだろうけど、それ以外の開発者は使う機会少ないかも
URLリンク(ufcpp.net)
>>358
URLリンク(github.com)
C#の言語仕様はgithub上で公開で議論されている
センスある機能について議論や提案してみたらどうだろう
もちろん何かコメントしたりissueを立てたりする前に、検索して既出じゃないか確認するのを忘れずに
376:デフォルトの名無しさん
19/04/15 12:22:07.84 3hi8+ot50.net
先日windows7からwindows10にOSの入れ替えをしたのですが、win7では動いていたPostMessageが動かなくなってしまいました。
(送り手は自作のソフト、受け手は市販のソフトで、Win7でもWin10でも同じものです)
あるアプリケーションに
PostMessage(hWnd, WM_KEYDOWN, VkKeyScan("0"), 0);
のようにして数字を送信していたのですが、これが反応しなくなりました。
ウィンドウハンドルの取得とかは問題がないようです。
これ以外でも
PostMessage(hWnd, WM_KEYDOWN, VK_RETURN, 0);
等すべてのキーが送れません。
対処法がありましたら教えてください。
377:デフォルトの名無しさん
19/04/15 12:24:05.77 3hi8+ot50.net
正確に言うと(正確かどうかはわかりませんが)、
送り手側でエラーが出るわけではなく、受け手側のテキストボックスを一応選択はしているので、
送り手側としては送っているつもりですが受け手側が反応しなくなっている状態だと思います。
送り手の発信方法を変えればいいのでしょうか?
378:デフォルトの名無しさん
19/04/15 13:27:46.92 3hi8+ot50.net
すいません、解決しました。
管理権限の問題でした。
379:デフォルトの名無しさん
19/04/15 22:16:04.04 l4hdcBztd.net
新しいバージョンたくさんあるけど業務だとどの辺まで使ってるところが多いんだろ
valueタプルとかみんな使えてる?
380:デフォルトの名無しさん
19/04/15 22:17:38.51 p/g7dyR00.net
>>374
ようやく4.5.2が許されるようになったよ・・・
381:デフォルトの名無しさん
19/04/15 22:37:21.92 +hafi/JFa.net
>>374
.NET Core 2.2/C# 7.3使ってるよ
382:デフォルトの名無しさん
19/04/16 08:08:51.63 4W+nw3aAa.net
うちも最近やっと3.5.1縛りが解けて4.5.2になったよ
383:デフォルトの名無しさん
19/04/16 08:14:19.68 5XyUIsTTd.net
>>374
うちは.NET Core2.1、C#7.3
次のLTSは3.1だっけ
384:デフォルトの名無しさん
19/04/16 08:15:38.75 5XyUIsTTd.net
てかVisual Studioをちゃんと更新してればC#のバージョン上げるのは全然問題なくね?
385:デフォルトの名無しさん
19/04/16 08:20:00.65 3+f8cxJ/0.net
最近?が多くて辛い
null条件演算子でも目眩がするのに
null合体演算子なんか使われたら頭いたい
ところでcoalescingてなんて読むんや
386:デフォルトの名無しさん
19/04/16 08:32:26.55 mJc9sIPpa.net
>>379
ネックはランタイムの方でしょ
387:デフォルトの名無しさん
19/04/16 08:37:21.73 bBG3RNJT0.net
Windows7のサポートが切れれば少しはましになるのかねぇ
388:デフォルトの名無しさん
19/04/16 09:11:39.30 gry//OiE0.net
>>377
async awaitへようこそ
389:デフォルトの名無しさん
19/04/16 12:31:57.15 5XyUIsTTd.net
>>381
だから「C#のバージョン上げるのは」って言ってんのに
390:デフォルトの名無しさん
19/04/16 14:23:13.78 o1OTQxfgr.net
とりあえずVSのバージョンだけでもあげてほしいわ
今時2008とかもう
391:デフォルトの名無しさん
19/04/16 15:21:56.74 gbkfFEj/0.net
>>385
こっそりあげちゃえよ。だれもお前のことなんかみてないからさ。
392:デフォルトの名無しさん
19/04/16 17:28:56.19 CzwWdC590.net
2015ってアン�
393:Cンストールしても平気かな。SSDの空きがかつかつで2019インストールするなら2015は消したい
394:デフォルトの名無しさん
19/04/16 18:43:16.58 HeVWn8Fl0.net
VS2010からVS2017に上げたら変数名に全角の・使ってるところがビルドエラーになったわ。
こんなの変数名に使うなよと思いながらVS2010で名前変えまくった。
395:デフォルトの名無しさん
19/04/16 18:54:44.72 csRNrKVvM.net
フォームから自動生成したイベントハンドラの頭文字が大文字じゃねぇぞって怒られてるんだけどデフォルトでこうなの?
396:デフォルトの名無しさん
19/04/16 19:43:25.05 4DXe6mce0.net
>>388
ユニコードのせいね
C#6.0の時のやつ
397:デフォルトの名無しさん
19/04/17 20:49:20.12 WkJZEAk70.net
ドット絵エディタを作りたいんですが、win formでやってます
ピクセルを描くベースとなるフォームはどれを使用すればよいのでしょうか。
398:デフォルトの名無しさん
19/04/17 20:56:19.46 SfPYWsjk0.net
フォームに直書きでいいよ
399:デフォルトの名無しさん
19/04/17 20:59:20.56 VDkzUi/q0.net
>>391
コントロールなら画像の描画に使うのはPictureBoxでやっとけば調べるのも楽だよ
書き間違いでなく何か別の意味で「フォーム」って書いているのならよくわからない
400:デフォルトの名無しさん
19/04/17 21:12:48.03 QwWDImoN0.net
>>391
ピクセルを書くなら Paint だろ。
URLリンク(www.youtube.com)
401:デフォルトの名無しさん
19/04/17 21:28:00.17 WkJZEAk70.net
pictureboxかpaintですね ありがとうございます
402:デフォルトの名無しさん
19/04/18 00:15:51.35 xpC+XoNH0.net
textboxで描く
403:デフォルトの名無しさん
19/04/18 06:13:29.99 VndYiJ+Y0.net
コントロールとクリックイベントはどのような関係になっているんでしょうか。
コントロールは関数で、そのローカル関数がクリックイベントでしょうか?
404:デフォルトの名無しさん
19/04/18 08:27:46.76 KcatLawH0.net
インテリセンス表示してみろ
vscodeとかならリファレンス表示しろ
Control "クラス" って書いてあるだろうが
405:デフォルトの名無しさん
19/04/18 10:05:51.26 VndYiJ+Y0.net
クラスですか ごめんなさい
406:デフォルトの名無しさん
19/04/18 17:04:33.74 /n+AA5ti0.net
>>399
クリックイベントなどのイベントはそのクラスのデリゲートな
407:デフォルトの名無しさん
19/04/18 18:55:27.19 VndYiJ+Y0.net
デリゲートって語をはじめてしりました
408:デフォルトの名無しさん
19/04/18 19:28:26.95 fqeeOSlB0.net
デリケートな話題だからね
409:デフォルトの名無しさん
19/04/18 19:38:07.87 cTBQXOBu0.net
デリケートゾーンの話ですか?
410:デフォルトの名無しさん
19/04/18 19:57:39.62 YCaR8eKbM.net
最初は、関数ポインタ+アルファぐらいに思っておけば
後で騙された~になるけど
411:デフォルトの名無しさん
19/04/18 23:09:25.88 4whWZ0bM0.net
>>400
イベントとデリゲートは全く同じじゃないけどな
412:デフォルトの名無しさん
19/04/18 23:33:46.05 xpC+XoNH0.net
ポインタなんて今時通じるのか?
413:デフォルトの名無しさん
19/04/19 09:21:10.96 okUcwqho0.net
Javaでnull参照した時にNullPointerException投げてくるうちは現役だろ(適当
414:245
19/04/19 12:51:17.11 5BNgMycMM.net
ぬるぽ
415:デフォルトの名無しさん
19/04/19 16:10:17.23 OM7ktdHt0.net
ぬるぽ
416:デフォルトの名無しさん
19/04/19 21:56:33.56 5QVRwjzm0.net
List<T>から要素を1つずつ要素を取り出して処理し、例外が起きたらその要素だけリストから消したいんだけどさあ
なんかいい手段ってないのかな?
雰囲気としてはこんな感じのが書きたいんだけど・・・・おらの頭じゃうまく書けんだ・・・・
foreach(var o in listOfObject){
try{ 例外処理以外では対処が難しい怪しい処理(o); }
catch{ 例外が起きた項目だけlistOfObjectから消したいが、ちゃんとforeachも回って欲しい(); }
}
417:デフォルトの名無しさん
19/04/19 22:02:58.03 MllfoE8V0.net
新しいList<T>作ってcatchしたときにAddして
foreach終わった後でRemoveしていく
418:デフォルトの名無しさん
19/04/19 22:04:41.49 4Fr35pSP0.net
>>410
foreachじゃなくfor (i = listOfObject.Count; i > -1; i--)とかじゃだめなのか
頑張ってforeachにしてもめんどくさくなるだけの気がする
419:デフォルトの名無しさん
19/04/19 22:04:44.06 MllfoE8V0.net
var erroredItems = new List<Hoge>();
foreach (var item in originalList) {
try { ... }
catch { erroredItems.Add(item); }
}
foreach (var item in erroredItems) {
originalList.Remove(item);
}
420:デフォルトの名無しさん
19/04/19 22:09:40.78 5QVRwjzm0.net
ありがとう
こうやってやるもんなのか
421:デフォルトの名無しさん
19/04/19 22:27:07.32 i0tIRf8t0.net
listOfObject.RemoveAll(obj =>
{
try
{
・・・・・・なんか処理
return false;
}
catch
{
return true;
}
});
422:デフォルトの名無しさん
19/04/20 00:02:36.27 /zNBD6gY0.net
リストに追加前にtry処理したらダメなん?
それができないなら俺も415のやり方が良い
423:デフォルトの名無しさん
19/04/20 00:10:17.26 4fcRoJkza.net
public class MyUtil {
public static bool Try(Action a) {
try { a?.Invoke(); return true; }
catch { return false; }
}}
var b = a.Where(x => MyUtil.Try(() => ThrowableMethod(x)))
.ToList();
424:デフォルトの名無しさん
19/04/20 06:45:01.92 eu9xvtsyM.net
>>408
ガッ
425:デフォルトの名無しさん
19/04/20 06:45:18.46 eu9xvtsyM.net
>>409
ガッ
426:デフォルトの名無しさん
19/04/20 08:09:20.70 u/QGNgma0.net
このスレ的にはぬるぽではなくぬるりなのか。エロいな。
427:デフォルトの名無しさん
19/04/20 08:43:35.43 ShWYWHRt0.net
配列のソートのアルゴリズムが難しくて覚えられないんですが
簡単な書き方はりますか?
428:デフォルトの名無しさん
19/04/20 08:52:13.85 tgvbScEyM.net
>>421
プログラミングには適性があります。
貴方には向いていません。
429:デフォルトの名無しさん
19/04/20 09:08:29.42 Q85hwvCt0.net
>>410
foreach(var o in listOfObject){を
foreach(var o in listOfObject.ToArray()){
と配列にコピーしてから実行するのが定石です
そのループの中では既に列挙は終わっているから
listOfObjectにAddしてもRemoveしても例外は発生しないし列挙の順番にも影響を与えません
430:デフォルトの名無しさん
19/04/20 09:12:26.10 Q8Lkjfvy0.net
>>421
一度リストで書いて、配列だとどう書くだろう?と考える。
アルゴリズムって基本リスト前提だからね。
431:デフォルトの名無しさん
19/04/20 09:15:16.95 dmSDGLr5a.net
>>424
いやソートアルゴリズムの殆どは特定のインデックスに対するランダムアクセスにO(N)を仮定するから配列前提だぞ
432:425
19/04/20 09:15:47.20 dmSDGLr5a.net
間違えたO(1)
433:デフォルトの名無しさん
19/04/20 12:09:52.47 IppyQHdna.net
>>421
今時そんなの覚える必要あんまりない気もするけど、
試験勉強ならがんばって覚えるしかないね
>>423
そもそも列挙と同時に削除をするって発想が筋悪。
別に列挙後ゆっくり削除すりゃあよい訳で、>>413がやってるように2つを分離する方が
考え方として自然で分かりやすいと思うけどね
434:デフォルトの名無しさん
19/04/20 12:52:51.24 XrXcMVKPd.net
>>415が一番シンプルだな
435:デフォルトの名無しさん
19/04/20 13:49:32.83 ajzSwZvNd.net
処理と例外が出たものを除去は別の仕事だから処理も分離してるほうが好き
436:デフォルトの名無しさん
19/04/20 13:51:03.66 4fcRoJkza.net
そもそもフィルタかけて何に使うんだ?
437:デフォルトの名無しさん
19/04/20 13:53:51.78 LQSO4VHxd.net
>>415が質問者のしたいことにドンピシャなのに初心者スレだからラムダ式にアレルギーある奴が多いのかな
438:デフォルトの名無しさん
19/04/20 14:01:01.21 bN8wmmjE0.net
一番まともな解答にはレス付けないのが2ちゃん式
439:デフォルトの名無しさん
19/04/20 14:06:22.07 axr9T2Wu0.net
>>431
>>410の処理の目的が条件に合わない要素の削除なら>>415がシンプルで良いけど、
全ての要素に処理をするのが目的で削除はおまけって場合は、>>415だと本来の目的が分かり辛い。
440:デフォルトの名無しさん
19/04/20 14:19:22.63 rcvSJkam0.net
まず、2分探索を、2分ヒープで作れば?
O(log N)
2^10 = 1,024 だから、千のデータを、10回で探索できる。
2^20 = 百万 のデータは、20回!
リストは、次の要素しかわからないから、ランダムアクセスは、O(N) になる。
例えば、1から5を見つけるのに、1,2,3,4,5 と、リンクをたどらないといけない
O(1)にするには、アドレスは計算式で求められるものだけ。
各要素が4バイト使うなら、1が100番地として、5は116番地みたいに
441:デフォルトの名無しさん
19/04/20 16:56:48.87 ShWYWHRt0.net
>>427
覚える必要ないんですか…List型のソートメソッドを使っていても後々問題にならないですかね
442:デフォルトの名無しさん
19/04/20 17:40:05.04 tqoqa3JD0.net
>>435
基本的なデータ構造とアルゴリズムは一通り理解して自分で書けるようになっておくといいぞ。
標準的な物はライブラリ等で用意されているから実際に業務等でコードを書くときはそれを使うが、独自の問題の解法を自分で考える際に、適切な速度や使用リソース量と工数の兼ね合いで良い方法を選択するには、基本は一通り押さえておく必要があるよ。
443:デフォルトの名無しさん
19/04/20 20:18:25.55 zIfu5btc0.net
必要な時に必要なものを覚えるだけでOK
最初から全部覚えようとしなくてもいいよ
444:デフォルトの名無しさん
19/04/20 20:23:09.94 qqngOIWj0.net
ソートに関しては基本情報処理技術者試験の教科書でも読めばいいんじゃないの
445:デフォルトの名無しさん
19/04/20 21:14:17.27 f5BR4Kwsa.net
ソートは自分なりに考えてlコードを書いてみてその後にいろいろ学ぶと勉強しやすい
446:デフォルトの名無しさん
19/04/21 08:02:20.34 qTT7Abroa.net
自前で書くソート処理と、.NET Frameworkに実装されてる(Microsoftのプロフェッショナルが実装した)ソート処理、
どっちがより高速でバグが少ないと思う?
URLリンク(referencesource.microsoft.com)
↑ここから先に書かれている処理よりも優れたソート処理を自分で書けるならともかく、
そうでなければおとなしく出来合いのソート処理を利用するほうが無難だと思うけど
447:デフォルトの名無しさん
19/04/21 09:21:47.18 enjRZRrv0.net
>>440
出来合いのソート処理を利用するなとか誰か言ってんの?
448:デフォルトの名無しさん
19/04/21 09:22:37.85 F9kXeXwV0.net
独習3版読んでないとーしろはqueueも実装できないし、回帰とかも理解しないんだろ。
449:デフォルトの名無しさん
19/04/21 09:39:42.10 +WROkW6ha.net
>>440
初心者がソートを勉強しないと自分の書いたコードがなぜ遅いかわからない
ソートが魔法か何かで何でも一瞬で並び替えられると思ってしまうと終わり
そこから進展はない
ソートの回数を減らすように考えたりソート自体を行わないでうまく処理することを学ばないといけない
450:デフォルトの名無しさん
19/04/21 09:43:13.42 cNLTxFDL0.net
ソートがボトルネックになった時に最適化を迫られたら弄るしかないじゃんね
451:デフォルトの名無しさん
19/04/21 09:50:14.96 +WROkW6ha.net
ソートがボトルネックになったらじゃなくて普通にソートを使うときには必ず気に掛けるべき
ループの中にソート入れてるコードがあったりする
ループ出た後に一度やればいいだけなのにと思うがそういう所に思いが至らないんだろう
452:デフォルトの名無しさん
19/04/21 10:02:50.79 9BhkjmpP0.net
今なんねーよ流石に
453:デフォルトの名無しさん
19/04/21 10:09:09.80 +WROkW6ha.net
メソッドの中でソートして戻り値返してるのにもらった側でもソートしたりとか
無駄なことをする可能性はどこにでもある
他人に見られたときにこいつ馬鹿だなと思われないようなコードを書く練習をしよう
454:デフォルトの名無しさん
19/04/21 10:17:01.49 HfCJ1F6L0.net
listのsortメソッドって安定ソートだっけ?
455:デフォルトの名無しさん
19/04/21 10:19:40.66 8e51ow7Fa.net
>>444
それは細かい最適化よりも設計を見直すべきだと思うよ
物事を大域的に見ることができず小手先のハックだけでなんとかしようとするのはプログラマが陥りがちな非常に悪い癖だから注意
456:デフォルトの名無しさん
19/04/21 10:24:24.53 +WROkW6ha.net
小手先のハックじゃなくて基本だろ
どこでソートするかなんて基本中の基本
457:デフォルトの名無しさん
19/04/21 10:25:31.30 +0R+dzN2M.net
無意味な仕事を無くすように働きかけるのではなく、無意味な仕事を無駄に最適化しようとするのは低学歴な意識高い系プログラマあるある
458:デフォルトの名無しさん
19/04/21 11:39:31.85 cgZSyzeqa.net
>>448
URLリンク(docs.microsoft.com)
> This implementation performs an unstable sort
ついでにいうとArray.Sortも不安定ソートで、Enumerable.OrderByと.ThenByは安定ソート
459:デフォルトの名無しさん
19/04/21 12:31:18.60 3jwnQLuZ0.net
ソートはプログラムを覚えるために勉強するもので
実用上はライブラリ使えばいい
ただ、勉強するネタとしては割と上質なもの
460:デフォルトの名無しさん
19/04/21 12:34:57.35 y1/myRC20.net
(回答する方も)初心者スレらしくていい流れだね
461:デフォルトの名無しさん
19/04/21 12:46:19.25 WZ0UQqME0.net
こういうの、listにロックをかけたのに何で同listを使う後続処理がすぐ実行されちゃうの?
URLリンク(paiza.io)
using System.Collections.Generic;
using System.Threading.Tasks;
using System;
public class Hello{
public static void Main(){
var list = new List<int>();
for(int i=1; i<=1000; i++)
{
list.Add(i);
}
Task.Run(()=>{
lock(list){
Task.Delay(10000);
}
});
Console.WriteLine(list[123]);
}
}
462:デフォルトの名無しさん
19/04/21 12:51:36.48 9BhkjmpP0.net
まだ、そんな産廃機能いじってんのか
463:デフォルトの名無しさん
19/04/21 13:00:01.62 cgZSyzeqa.net
>>455
URLリンク(ufcpp.net)
lock文はMonitor.EnterやMonitor.Exitを使った糖衣構文であって
Monitor.Enterでロックを取得する(=既にロックされているなら、それが解放されるまで待つ)
例示コードではTask中ではlockしているもののConsole.WriteLine箇所はlockがないので、すぐに実行される
464:デフォルトの名無しさん
19/04/21 13:12:13.25 6I4G/mIH0.net
>>455
lockの使い方が間違ってる(>>457)のと、Task.Delay()の使い方が間違ってる。
Task.Delay()は通常awaitして使うがlockステートメント中では使えないので、Task.Delay().Wait()するか代わりにThread.Sleep()にする。
後、Task.Run()で作ったタスクが実行開始されたか考慮していないから、大抵はConsole.WriteLine()が先に実行される。
465:デフォルトの名無しさん
19/04/21 14:40:03.19 T6P0EJpRd.net
>>441
俺だよ俺
466:デフォルトの名無しさん
19/04/21 15:32:01.70 WZ0UQqME0.net
ありがとう、このコードだと欠陥だらけなのか・・・・
使用箇所ごとにLockが必要なのか、それとタスクより先に次の行が実行されてる可能性が高いのは全く気づいてなかった
ただ、
>Task.Delay()は通常awaitして使うがlockステートメント中では使えないので、Task.Delay().Wait()するか代わりにThread.Sleep()にする。
っていうのはどういうことなの?Lock外にスレッドを返されちゃうのかしら?
467:デフォルトの名無しさん
19/04/21 16:07:55.74 i587kr5jd.net
>>459
よおキチガイ
468:デフォルトの名無しさん
19/04/21 16:32:29.56 RWXhngOc0.net
>>460
Task.Delay()だけだと完了を待ってないから、実質無いのと同じ
469:デフォルトの名無しさん
19/04/21 17:35:25.00 F9kXeXwV0.net
>>460
ピーコックアンダーソンの非同期動画みてみればすぐに理解できるぞ
470:デフォルトの名無しさん
19/04/21 22:18:43.95 rykfOnh80.net
速度がどうとか言うんだったらc#なんか使うなよと少し思いました
471:デフォルトの名無しさん
19/04/21 22:35:33.45 CLsKfNj20.net
>>464
少しってなんだよ!
472:デフォルトの名無しさん
19/04/21 23:52:50.47 SWXjVSz30.net
>>465
a little
473:デフォルトの名無しさん
19/04/22 04:23:42.26 29e/0Uiq0.net
じゃあ残りの大半は何を思ってたの
474:デフォルトの名無しさん
19/04/22 19:50:45.64 DglGSvcP0.net
ソートってポインタやmalloc, memcpyとか使ってこねくり回すのが楽しいのにC#だとイマイチだよね
475:デフォルトの名無しさん
19/04/22 20:39:27.38 Xu5D3g840.net
独自に作成したユーザコントロールをdataGridViewのカラムに追加する処理を作成しているんですが
追加したものをそのまま削除するとうまく削除出来ず、一方のユーザコントロールが必ず画面上に残ってしまうんですが
なぜでしょうか?原因がわからず悩んでいます
どなたか教えてください
//①ひとまず空のデータを作成してdataGridViewに格納
DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[] {new DataColumn(), new DataColumn(), });
dt.Rows.Add(new object[] { "", "" });
this.dataGridView1.DataSource = dt;
//②ユーザコントロール1をdataGridViewに追加
UserControl1 userControl1 = new UserControl1();
this.dataGridView1.Controls.Add(userControl1);
userControl1.Location = this.dataGridView1.GetCellDisplayRectangle(0, 0, true).Location;
//③ユーザコントロール2をdataGridViewに追加
UserControl1 userControl2 = new UserControl1();
this.dataGridView1.Controls.Add(userControl2);
userControl2.Location = this.dataGridView1.GetCellDisplayRectangle(1, 0, true).Location;
//④追加したユーザコントロールを削除→何故かユーザコントロール2だけが残る
dataGridView1.Controls.Clear();
476:469
19/04/22 20:40:58.08 Xu5D3g840.net
ちなみに私が試したのはvisualStudioの2017です
477:デフォルトの名無しさん
19/04/22 20:42:29.96 5zGuWDFU0.net
c#だと遅くて無理みたいな高尚なプログラム触ってないからよくわからん
cppとc#でどれくれい違うん?
478:デフォルトの名無しさん
19/04/22 20:52:55.67 doLks5OSd.net
>>471
何するかによるし言語仕様理解せずにコーディングすればC++だろうがC#だろうが遅くはなる
早くしたけりゃどの言語だってコンパイラが吐くコード見ろになるし極論アセンブラしてろになる
シビアな演算速度求められるようなソフトじゃなきゃ気にするような速度は無い
個人的にいろいろ開発してて速度面で困ったことはない
479:デフォルトの名無しさん
19/04/22 21:35:41.32 puVU3XKCM.net
特定のアプリを監視して表示された文字(画像)をテキストにするアプリ作ったけど
c#だとチェックに1秒、c++とGDIのDLLだと0.01秒とかそんな感じだった
c#で作って必要ならc++にコンバートするのでいいと思う
480:デフォルトの名無しさん
19/04/22 21:59:37.22 a2wjQuhnM.net
>>468
unsafe使えば
481:デフォルトの名無しさん
19/04/23 00:01:21.36 5LmBAPnu0.net
画像処理とかその部分はunsafeとかcだろ。それぐらいは当たり前
482:デフォルトの名無しさん
19/04/23 00:14:05.59 Bc6Ot9Tr0.net
別にC#でいくらでも早くできるけどそれしないでC++より遅いってそりゃそうだよねとしか
GCの恩恵受けてunsafe使わずセーフティな状態でしょ
突き詰めたC++と突き詰めたC#なら.NETで動く分C#が不利なのは仕方ない
突き詰める必要がない部分で恩恵を受けられるんだから、処理速度以外にメリット感じないなら速い言語やればいい
言語なんて所詮道具なんだから適材適所
483:デフォルトの名無しさん
19/04/23 00:15:59.36 lAbUfbw70.net
sleepが1ms単位指定なのに平気で30msくらいかかったりする
484:デフォルトの名無しさん
19/04/23 00:21:34.72 Qu51xl5v0.net
>>477
Windowsの仕様なのでC#と関係なく発生するよ
485:デフォルトの名無しさん
19/04/23 00:22:35.63 1xhRm/Xtd.net
OSの内部クロックのせい
486:デフォルトの名無しさん
19/04/23 02:07:58.81 TPVsn91QM.net
>>473
そりゃあおまえさんのコードが糞なだけや
487:デフォルトの名無しさん
19/04/23 02:09:14.72 V6IaHlzqa.net
OSにクロックはないでしょうw
いやスケジューリングとかタイムスライスとかそんなことが言いたいんだとは思うけど
488:デフォルトの名無しさん
19/04/23 02:35:38.55 1xhRm/Xtd.net
>>481
え…
489:デフォルトの名無しさん
19/04/23 07:53:20.75 5v63vvPIa.net
TickCountの事だと思う。
490:デフォルトの名無しさん
19/04/23 11:11:38.25 D0U8cwP90.net
awaitのついた文の次の文を実行する際に、await前と同じスレッドに帰ってきてもらうことってできないの?
491:デフォルトの名無しさん
19/04/23 11:25:52.45 NBcK336D0.net
元のスレッドがそういうことできる機能を持ってればできるよ
WinFormやWPFのGUIスレッドはメッセージループで実現してて
それらの場合はGUIスレッドでawaitすればGUIスレッドに戻ってくるのが既定だし
492:デフォルトの名無しさん
19/04/23 12:18:02.90 m6tbNaeWM.net
Pythonでカラー画像をRGBごとに分割して出力するスクリプトを書いたんだけど、
opencv使わずにC#でも出来るのかな?
C#でもnumpyみたいなの無いの?
493:デフォルトの名無しさん
19/04/23 12:20:58.93 4ETsFZLA0.net
どんだけ馬鹿なんだよ
494:デフォルトの名無しさん
19/04/23 13:00:40.13 N4fQ2uHcd.net
>>486
numpyってrubyですか?
495:デフォルトの名無しさん
19/04/23 15:41:23.24 elaW7zc+0.net
>>486
まんまは無いけど部分的にだったら何らかのライブラリで補完できるんじゃないかな?
これとか
URLリンク(numerics.mathdotnet.com)
496:デフォルトの名無しさん
19/04/23 16:29:44.88 D0U8cwP90.net
>>485
コンソールアプリ等だとなかなか難しいんかな
497:デフォルトの名無しさん
19/04/23 16:33:48.41 EaCRsjQU0.net
>>490
Task.WaitAnyとかでできんもんか?
498:デフォルトの名無しさん
19/04/23 17:58:47.89 xFm0RmkHa.net
>>484
いやいや最初から同じスレッドですからww
そもそも同一メソッド内で別のスレッドを起動することはあっても
実行中に途中のスレッドに切り替わるとかそんなのありえへんwww
499:デフォルトの名無しさん
19/04/23 19:05:14.26 hvzt5+/sd.net
>>492
しょうもない嘘をつくな
500:デフォルトの名無しさん
19/04/23 19:28:13.89 2vLu2U8QM.net
誤解が誤解を生む
仕様について理解が足りない
501:デフォルトの名無しさん
19/04/23 19:35:04.22 xFm0RmkHa.net
ネタじゃなくて本気で変な誤解してるのか...
メソッドの途中で行が変わると別のスレッドで実行されるとかそんな言語怖くて使えないよwww
502:デフォルトの名無しさん
19/04/23 19:36:05.31 2vLu2U8QM.net
お前は勘違いしてる
GUIとCUIで仕様が違ってる
503:デフォルトの名無しさん
19/04/23 19:50:14.81 2vLu2U8QM.net
await/asyncは単なるTask非同期処理を簡易的に書ける糖衣構文
次にawaitの次をどのスレッドになるかはその時の状態次第
GUIではそれでは困るのでデフォルトで同じスレッドが処理をするようにしてあるだけ
504:デフォルトの名無しさん
19/04/23 20:19:35.25 xFm0RmkHa.net
訳のわからん勘違いをしてるのはどっちだよ
自信満々で馬鹿じゃないマジで
505:デフォルトの名無しさん
19/04/23 20:30:14.95 aIitEIPQ0.net
URLリンク(ufcpp.wordpress.com)
506:デフォルトの名無しさん
19/04/23 20:30:27.32 PlCSQgU2M.net
deligate
507:デフォルトの名無しさん
19/04/23 20:36:54.48 iDnak3xha.net
>>495
URLリンク(ideone.com)
508:デフォルトの名無しさん
19/04/23 20:41:16.72 xFm0RmkHa.net
勘違いをしているのは俺の方だった...
申し訳ないですw
509:デフォルトの名無しさん
19/04/23 21:04:08.70 2vLu2U8QM.net
すなおでいいんでない?
510:デフォルトの名無しさん
19/04/23 21:19:00.48 7omDh/oid.net
煽る時点で目糞鼻糞
511:デフォルトの名無しさん
19/04/23 21:57:22.24 D0U8cwP90.net
同じスレッドに戻ってきてもらうのに、簡単な方法ってないのかな・・・・
512:デフォルトの名無しさん
19/04/23 22:10:23.58 iDnak3xha.net
>>505
>>490を見るに、コンソールアプリで特定スレッドで処理したいみたいだけど、どういった理由?
GUIなら、時間がかかる処理は別スレッドで、画面更新は絶対にUIスレッドで、といった使い分けがあるけど
CUIで特定スレッドを意識する理由がちょっと思いつかないんだ
513:デフォルトの名無しさん
19/04/23 22:42:29.23 D0U8cwP90.net
>>506
WebAPIサーバを作りたく、その中で扱うデータについてトランザクション処理みたいなことをしたかったんです
通信関連でAwaitが多用されている中でも、データのロックをできるだけ減らしたい、またうっかりミスしてロック外に出ないでほしいと思ったんです
514:デフォルトの名無しさん
19/04/24 00:21:10.86 9Dlmymg8a.net
>>507
それを聞いても、「特定スレッドで絶対に処理したい」が主目標にはならない気がする
「ロックにReaderWriterLockSlimを使っていて、ロック取得と解放は同じスレッドで行う必要がある」のような状況ならまだ分かるんだけど
もしもこの状況であるなら、SemaphoreSlimでロックするようにすれば、WaitOneAsyncで待つスレッドと、Releaseするスレッドを別にできる(=間でawaitできる)
万一本当に何か理由があって特定スレッドで処理を続けたいのなら、Taskをawaitするのでなく.Wait()で待つようにすれば、スレッドは切り替わらなくなる
> うっかりミスしてロック外に出ないでほしい
これが「ロックを取得したけど、解放を忘れる」ことを指すのであれば
try {} finally {} や、ラップクラスを作ってIDisposable実装してusing() {} するのが対策になるかもしれない
取得と解放がメソッドを跨いだりするなら面倒くさくなるけど……
515:デフォルトの名無しさん
19/04/25 23:50:01.61 1l/c830P0.net
URLリンク(ideone.com)
if (ob.volume == volume)この部分なのですが
左辺は引数で取ったobのメンバ変数であることは分かるのですが右辺はどのメンバ変数なんでしょうか?
入門書のコードなのですが…
516:デフォルトの名無しさん
19/04/25 23:52:47.61 LJHMbymK0.net
>>509
6行目
517:デフォルトの名無しさん
19/04/25 23:54:19.01 LJHMbymK0.net
いや、thisって答えた方が良いのか
518:デフォルトの名無しさん
19/04/25 23:59:26.79 8Sf9N2Ww0.net
19行目にも同じ構造があるけどそっちはすんなり入ったんだろうか
519:デフォルトの名無しさん
19/04/26 00:01:25.44 6Aa9jI4a0.net
>>510
メソッドを呼び出したob1のメンバってことですかね?
理解できました。ありがとうございます
520:デフォルトの名無しさん
19/04/26 23:30:08.64 9lAtl2Yi0.net
コンストラクタ内で例外をthrowするのはご法度ですか?
521:デフォルトの名無しさん
19/04/26 23:43:18.42 p/I2x8fjd.net
>>514 定石ですよ
523:デフォルトの名無しさん
19/04/27 00:06:35.36 Ern7/KCha.net
>>514
ご法度ではないし、むしろインスタンスを正しく構築できないなら積極的にthrowしてほしい
例えばStreamReader(String)の場合、ArgumentException系列から
FileNotFoundExceptionやDirectoryNotFoundExceptionのIOException系列までthrowする
524:デフォルトの名無しさん
19/04/27 00:38:42.27 yEc5G7yUM.net
悪いとは言わないけど、最近はあまりコンストラクタで例外投げるような処理やらなくなったなあ
何故かと考えたら、async/awaitのせいだと気付いた
コンストラクタではawaitできないから、昔みたいにコンストラクタでファイル読んだりするのはほぼ無くなった
525:デフォルトの名無しさん
19/04/27 00:45:53.35 k66IsG4/a.net
あとDIと相性が悪い
DI使ってると、コンストラクタで例外投げたらそもそもアプリが起動しない
526:デフォルトの名無しさん
19/04/27 02:44:50.91 ni4YCIMc0.net
ドキュメントもコンストラクタで投げる可能性のある例外一覧が必要になるけど
実際あげきれなくて手薄になりがち
そうなると設計できない
例外の種類でその後の動作をハンドリングしたいときに動かしてみて
キャッチの種類を分けるしかない
仕様書に書いてあるこのエラー出せないんすけど?
このときの例外増やしてもらえます?
→入れた引数から判断できるでしょ?とかキチガイかよって
527:デフォルトの名無しさん
19/04/27 02:55:41.53 TtZ/uEZc0.net
>>519
例外の種類を完全に把握できないのはコンストラクタに限ったことではないだろ
528:デフォルトの名無しさん
19/04/27 03:07:26.16 ni4YCIMc0.net
>>520
そもそも例外嫌いなんよ俺
ビジネスロジックだとほぼ全部把握しないといけないのに
丸っと渡されると困るだけじゃん
529:デフォルトの名無しさん
19/04/27 03:45:53.67 TtZ/uEZc0.net
その例外を全部把握しなきゃいけないというのがアホな考えなんだよ
予期できないのはExeceptionとしてまとめてキャッチして処理しとけばなんの問題もないね
530:デフォルトの名無しさん
19/04/27 06:32:15.89 QhVWSAZD0.net
どっちも乱暴だな
531:デフォルトの名無しさん
19/04/27 07:35:46.92 3SWE0tmA0.net
例外は握りつぶすのが定石
532:デフォルトの名無しさん
19/04/27 08:12:46.03 PiMoxWjk0.net
>>522
設計書になんて書くん?
俺んとこ例外使うなら設計書に書いてない例外出しちゃうと大変なんだよ
MSのドキュメントも全部はねーし
マジ厄介
でもお客の言い分もわかる気がするんだよね
流石に何が来るかわかりませんってのはどうなの?
って思う
533:デフォルトの名無しさん
19/04/27 08:15:07.62 PiMoxWjk0.net
>>522
ああ、だから例外返さないよねそれ
534:デフォルトの名無しさん
19/04/27 08:34:22.02 9yG2LI1yd.net
例外の発生要因なんてあらゆるものがあるんだから全部明示しろというお客の主張が不条理
設計書に例外全部明示しろとか要求されたことないね
535:デフォルトの名無しさん
19/04/27 08:51:37.56 yNGf8etVa.net
規約が足かせになってる場合は無視したほうがいい
スキル低い人が大昔に作った規約かもしれないし
例外は復旧可能かつ復旧したいものだけキャッチして対処
それ以外はアスペクトでまとめて処理すればいいよ
536:デフォルトの名無しさん
19/04/27 09:11:45.63 ibduGkrL0.net
コンストラクタで例外がってC+出身者みたいだな
537:デフォルトの名無しさん
19/04/27 09:25:13.44 YyIkYDM+0.net
>>529
.NET Frameworkクラスもコンストラクタで例外投げるのに?
538:デフォルトの名無しさん
19/04/27 09:26:49.68 k66IsG4/a.net
>>529
C++のその説は迷信だけど、C#では事実としてawaitができないという重大な制約があるからなあ
コンストラクタで例外を投げてはいけないわけではないが、そもそも例外を投げる可能性のあるような処理をコンストラクタでやらせることができるケースが少ないのは間違いない
539:531
19/04/27 09:33:56.80 k66IsG4/a.net
もちろん、ArgumentNullExceptionのようにバグを検出してアプリを落とすことを目的とする例外は別だよ
そういうのを除けば、例外を投げうる処理ってのはだいたいIOを含んでいてawaitが必要になるケースが多い
540:デフォルトの名無しさん
19/04/27 09:36:37.55 yyWoHVeQa.net
いまだにオブジェクト倶楽部のをベースにしたC#コーディング規約なのかな
10年くらい前の時点でも悪評ぷんぷんだったのにどれだけ時代遅れなことしてるんだ
コーディング規約作ってる奴のスキルが低い/古すぎ/多言語の知識しか持ち合わせてなくて
クソな規約になってることはよくある
コンストラクタで例外吐くのが望ましくないのはC++の話であってC#ではそんなこと全然ない
例外すべて列挙しなきゃいけないのはJavaの話であってC#にもそれを持ち込むのはナンセンス
でも大抵規約のクソさ加減と規約作成者・組織の老害度は比例するんだよな
指摘しても直ることはないだろうから「これはクソなコードだ」と自覚を持ったうえで
規約通りのコードを書くしかない
541:デフォルトの名無しさん
19/04/27 11:46:22.17 V1c8eqNrM.net
>>527
それって制御できないって言ってるんだよね?
その時はtry catchで握り潰せばいいんだけど
君はどうなればいいと思ってるの?
ある日例外が起きてアプリが止まっちゃってもそれは時代の流れでしょうがないと思ってるってこと?
542:デフォルトの名無しさん
19/04/27 12:00:49.48 ASguEO4td.net
>>534
予期せぬ例外が起きたら発生箇所のスタックトレースを表示させてバグ修正に役立てるよ
客もその画面キャプチャを送ってくれる
Execeptionにはそういうデバッグに役立つ情報入ってるからマジ便利だわ
543:デフォルトの名無しさん
19/04/27 12:01:52.85 reMuF7mTd.net
>>535
客にスタックトレース見せちゃだめw
544:デフォルトの名無しさん
19/04/27 12:22:00.72 yNGf8etVa.net
コンストラクタで例外を出すのが妥当なら出すべきだ
しかし、例外を出すような責務は得てしてファクトリやリポジトリなど外部のクラスが担うことが多い傾向にある
なので正確に言うと、オブジェクトの生成という責務を分離してない汚いプログラムはダメだ、なんだけど
それが誤って拡散した結果、コンストラクタで例外を出すプログラムはダメだ、に拡大解釈されてしまったのだろう
// コレは生成責務が分離されてないからダメだ
class Hoge {
public Hoge(int id) {
var dto = DB.FindHoge(id); // 例外なげる
m_id = id;
m_name = dto.name;
}
// コレは責務が分離されてるからOK
class HogeRepository {
public Hoge Find(int id) {
var dto = m_db.FindHoge(id); // 例外なげる
return new Hoge(id, dto.name); // 実装次第で投げたり投げなかったり
}
// コレもOK 例外投げるが責務としては妥当
class Hoge {
public Hoge(int id, string name) {
if (id < 0) throw new BadHogeFormat("id");
if (UTIL.NotMatch(@"^H\d{8}$", name)) throw new BadHogeFormat("name");
m_id = id;
m_name = name;
}
545:デフォルトの名無しさん
19/04/27 13:20:27.71 rUmkpmPg0.net
>>533
> コンストラクタで例外吐くのが望ましくないのはC++の話であって
そんな話は聞いたことないが?
546:デフォルトの名無しさん
19/04/27 13:38:48.88 ibduGkrL0.net
C+の話は
C+のコンストラクタとデストラクタの言語仕様をよく理解してない奴の誤解だから
もともと正しくない
547:デフォルトの名無しさん
19/04/27 13:43:38.03 bs+zTlgP0.net
>>539
お前はさっきから何の言語の話をしているんだ?
548:デフォルトの名無しさん
19/04/27 13:45:42.92 ibduGkrL0.net
話しかけるなゴミが
549:デフォルトの名無しさん
19/04/27 13:46:18.87 vrUpwJdGa.net
ダメも糞も引数が不適切なら例外投げるしかないねそもそもw
もちろん(注意喚起とか)何らかの意図を持ってあえてコンストラクタではなく
ファクトリーメソッドやTryCreateXxxxにする方法もあるけど、
少なくとも誰が考えても引数が不適切なら例外発生が予見できるなら
コンストラクタで例外投げて何も問題ない
550:デフォルトの名無しさん
19/04/27 16:53:30.48 hssASZhyF.net
デストラクタで例外吐くのはあり?
551:デフォルトの名無しさん
19/04/27 16:57:52.36 krlg75LI0.net
どこならokとかngとかじゃなくて例外が発生したなら吐かなきゃ駄目
例外の前提を変えちゃ駄目
552:デフォルトの名無しさん
19/04/27 19:59:50.65 UyCSNWt+M.net
>>543
基本的になし
デストラクタの意味がなくなるから
553:デフォルトの名無しさん
19/04/27 20:00:47.02 rUmkpmPg0.net
>>543
なし
554:デフォルトの名無しさん
19/04/27 20:39:48.83 ucBEJWSU0.net
デストラクタって解放し忘れたアンマネージドリソースの解放をするためにある奴でしょ?
ただそれだけの処理に例外とか要る?
555:デフォルトの名無しさん
19/04/27 20:43:57.48 xE/0VH9u0.net
>>547
どんな想定かわからないし入れたい人は入れればいいんじゃないの
556:デフォルトの名無しさん
19/04/27 21:09:36.81 ucBEJWSU0.net
C#のデストラクタは実行タイミングが不明な上に
他でキャッチできないからそのままクラッシュする事になるが
それが目的なら
557:デフォルトの名無しさん
19/04/27 22:32:08.58 krlg75LI0.net
デストラクタであろうと例外が発生したなら吐くべき
デストラクタで例外なら大体最終的にアプリ落とす結果になるだろうけど
普通に設計すりゃまずデストラクタで例外が必要にはならんとは思うが
558:デフォルトの名無しさん
19/04/28 07:43:44.94 Rwl5KJzI0.net
そりゃどこでも例外が出りゃ吐くべきだろ。デストラクタで出た例外は握りつぶせとでもいうのかよ
559:デフォルトの名無しさん
19/04/28 08:59:56.68 vQlivpSSa.net
デストラクタの例外は運用に入ったらログ吐いて握り潰すしかない
開発中にどれだけ発見しきれるかが勝負
560:デフォルトの名無しさん
19/04/28 09:42:23.56 3t4t6vYZM.net
馬鹿しかいないのかな
デストラクタで例外をキャッチすべきかじゃなくて
デストラクタで例外を投げるべきかだろ
561:デフォルトの名無しさん
19/04/28 09:48:33.86 3t4t6vYZM.net
どうみても例外をデストラクタで握りつぶすなんて話はしてない
デストラクタで挙動がおかしな場合そこから自前で例外を投げるかどうかだろ
どうしてこんな前提すらわからないのか?
562:デフォルトの名無しさん
19/04/28 10:20:38.37 ddGaHMPJ0.net
デストラクタで例外投げるのは出来るけど
デストラクタの呼び出し元はファイナライザースレッドになる故
デストラクタ以外の場所でキャッチして
ログ記録したりは出来ないが、よろしいか?
563:デフォルトの名無しさん
19/04/28 10:52:59.00 F7dfQde00.net
ところで、C#ってコンストラクタで例外吐いたとき、インスタンスは生成されて戻されるの?
そのインスタンスのデストラクタは(実装してればどこかで)実行されるの?
564:デフォルトの名無しさん
19/04/28 14:01:09.54 Cfig35XD0.net
>>554
お前黙ってろよ…
> デストラクタで挙動がおかしな場合そこから自前で例外を投げるかどうかだろ
そんな話は>>545-546で既に終わってる
今の話は例えばデストラクタでファイルクローズした時そのメソッドで例外送出されたらどうするかって話な
> どうしてこんな前提すらわからないのか?
わかってないのはお前だけ
565:デフォルトの名無しさん
19/04/28 14:02:16.88 Cfig35XD0.net
>>556
> ところで、C#ってコンストラクタで例外吐いたとき、インスタンスは生成されて戻されるの?
されない
> そのインスタンスのデストラクタは(実装してればどこかで)実行されるの?
されない
566:デフォルトの名無しさん
19/04/28 14:33:26.09 18CJ+0uF0.net
ファイルクローズなんてデストラクタの仕事じゃないからクラス設計が間違ってる
もしそうせざるを得ない理由があるならアプリ終了するだけ
アプリ終了されて困るなら正しくクラス設計すればいい
567:デフォルトの名無しさん
19/04/28 15:52:04.90 QPV4rne2d.net
>>559
例えばの話してんだからそこに文句付けるのはお門違い
568:デフォルトの名無しさん
19/04/28 17:06:19.94 lUhOqb6w
569:d.net
570:デフォルトの名無しさん
19/04/28 17:07:43.10 3i1J1gafM.net
年甲斐もなく疲れた
お前らこんな所で何をやってんだ青瓢箪か?
571:デフォルトの名無しさん
19/04/28 17:32:00.19 +oA/oQuO0.net
ここでは例外の話でドンパチ
よくのぞいてるVBAスレでもOn Errorの話でドンパチ
どちらを見てるのかわからなくなってくる
572:デフォルトの名無しさん
19/04/28 17:38:04.38 Cfig35XD0.net
>>559
> アプリ終了されて困るなら正しくクラス設計すればいい
具体的に書けないなら黙ってろってw
573:デフォルトの名無しさん
19/04/28 18:13:29.08 KKCCRPTWa.net
デストラクタの中でファイル操作やクローズするのは間違ってるな
そこで例外でたらどうしようもない
ログ取るのも同じ
574:デフォルトの名無しさん
19/04/28 18:25:38.64 kK/njqra0.net
メンバ変数を仕様上どうしてもDBから引っ張ってくるデータで初期化するしかなく、
コンストラクタ内でDB処理異常時に例外を吐く処理があります。
この場合コンストラクタ内では何もせず、インスタンス生成後にInit()のようなメソッドを
呼び出してもらうほうが使う側は楽でしょうか?
575:デフォルトの名無しさん
19/04/28 18:31:50.14 uWFo9H7Wa.net
そもそもC#でデストラクタに処理を書くこと自体が基本ありえないと思うんだけど・・・
リソースの解放なら(まともな構造のソースであれば)Dispose時に済ませるだろうし
デストラクタにわざわざ処理を書いて、しかもその処理が例外を引き起こすパターンって
具体的にどんなのがありうるんだ?