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時に済ませるだろうし
デストラクタにわざわざ処理を書いて、しかもその処理が例外を引き起こすパターンって
具体的にどんなのがありうるんだ?
576:デフォルトの名無しさん
19/04/28 18:32:37.29 lUhOqb6wd.net
>>566
コンストラクタで例外を吐いてください。
577:デフォルトの名無しさん
19/04/28 18:34:32.85 lUhOqb6wd.net
>>564
ぜひ具体的に例示していただきたい。
578:デフォルトの名無しさん
19/04/28 18:39:48.98 e0sCdFMHa.net
>>566
Init()を呼び忘れて使うリスクが出てくるので、インスタンス生成時に済ませたい派
ただDB関連では >>531-532 が言うように非同期処理をしたいだろうから
「コンストラクタはprivateにして、public staticなasyncファクトリを提供」が良いと思う
インスタンス生成時に例外出る場合だと変数の宣言と初期化が分離するけど、C#だと初期化し忘れはエラーになるから許容範囲じゃないかな
Foo foo;
try { foo = CreateFoo(); }
catch(BarException) { 何か復帰処理 }
// 以下fooを使った処理
579:デフォルトの名無しさん
19/04/28 18:45:37.21 3i1J1gafM.net
器が小さい奴はすぐ引っ込みが着かなくなるから困ったものだ
580:デフォルトの名無しさん
19/04/28 18:46:32.36 Cfig35XD0.net
>>569
MSがデストラクタからDispose呼んでるんだがw
// Free any unmanaged objects here.
で例外が発生するケースをどう扱うのか具体的に添削してやってくれ
URLリンク(docs.microsoft.com)
581:デフォルトの名無しさん
19/04/28 18:47:40.42 vQlivpSSa.net
>>566
>>537の考え方が正解
そういう時はファクトリーを使うという考え方が世界標準
582:デフォルトの名無しさん
19/04/28 18:56:32.95 lUhOqb6wd.net
>>572
どう扱うも何もアプリ終了させろってだけだが?
ハンドリングすべきではないものをどうこうしよとしないで
583:デフォルトの名無しさん
19/04/28 19:02:39.46 kMBz0MBMa.net
>>566
上にも書いたけど、あえてコンストラクタではなくstaticなTryCreateHogeみたいなのだけ提供して
注意喚起する方法もあると思うよ
>>567
デストラクタの存在理由はClose/Disposeを忘れた場合のフェイルセーフなんで
アンマネージドな共有リソースを占有するオブジェクトの場合はほぼ必須だし、
例外を投げるかどうかはともかく、デストラクタの中で例外的な事態が
発生することも普通にありえるとは思う。(例えばデバイスのクローズに失敗)
584:デフォルトの名無しさん
19/04/28 19:02:50.34 lUhOqb6wd.net
どんなに丁寧に処理したって完全に例外を対応するなんてことは不可能
599の最後でちゃんとやれば良いokみたいに書いちゃったのが良くなかった
ちゃんとやったって無理なことはある
585:デフォルトの名無しさん
19/04/28 19:06:45.39 KKCCRPTWa.net
>>575
その使い方はダメだと思うけど…
586:デフォルトの名無しさん
19/04/28 19:09:47.55 lUhOqb6wd.net
>>576
599じゃなくて559でした
587:デフォルトの名無しさん
19/04/28 19:10:36.56 kMBz0MBMa.net
>>577
何がダメ?
フェイルセーフって意味分かりますか?
588:デフォルトの名無しさん
19/04/28 19:17:31.79 KKCCRPTWa.net
無関係だけど一応答えるよ
フェイルセーフって言うのは失敗しても安全な状態に落ち着くこと
例えば信号が壊れても青信号になるんじゃなくて赤信号になるような設計
ファイルクローズは別にフェイルセーフの概念と関係ない
tryのfinallyはフェイルセーフじゃないよ
589:デフォルトの名無しさん
19/04/28 19:20:35.61 Cfig35XD0.net
>>574
ああ、お前じゃ無理だったな、すまんw
> アプリ終了されて困るなら正しくクラス設計すればいい
とほざいてた>>559、出てこいやー
590:デフォルトの名無しさん
19/04/28 19:22:21.81 fIrxxOza0.net
>>572
よく読め
591:デフォルトの名無しさん
19/04/28 19:22:22.23 JJw12cyBa.net
リソースのライフタイムの管理とリソースを使用して何かする責務を別の責務として分離したほうがいい
リソースの取得だけを分離する場合はファクトリーパターンが使われる
ただしこの場合はリソースを閉じる責務とリソースを使用する責務が同じクラスに混在してしまう
結果としてデストラクタでの例外といった問題が連鎖して発生する
これに対応するためにはファクトリーアイソレーションパターンを使う
このパターンならリソースのライフタイム管理とリソースの使用を完全に分離できる
コンストラクタでもデストラクタでもリソースの開閉に由来する例外は発生しなくなる
592:デフォルトの名無しさん
19/04/28 19:23:12.72 KKCCRPTWa.net
デストラクタでたとえば解放忘れの大きなメモリを開放するとしても
その前に他で大きなメモリを確保しようとすると死ぬ
デストラクタでファイルのクローズ忘れをクローズしようとしても
その前に他でファイルを開こうとするとエラーになる
デストラクタでいろいろ開放しても何も助けてない
役に立ったとしても偶然であって実質はバグを握りつぶしてるだけ
593:デフォルトの名無しさん
19/04/28 19:25:35.89 KKCCRPTWa.net
今までアンカー売ってないけど>>579向け
デストラクタで何か開放してもバグの温床になるだけ
594:デフォルトの名無しさん
19/04/28 19:26:43.51 kMBz0MBMa.net
>>580
関係あるからw
同じことをくどくど書くのは嫌いだが、デストラクタの存在理由は
コードの利用者がClose/Disposeを呼び忘れる、というヒューマンエラーに対するフェイルセーフ。
これは議論の余地はないよ
595:デフォルトの名無しさん
19/04/28 19:26:58.59 KKCCRPTWa.net
みんなフェイルセーフって言葉を使うけど大体意味間違ってる
596:デフォルトの名無しさん
19/04/28 19:28:16.75 uWFo9H7Wa.net
ああ、Dispose呼び出し忘れ対策のデストラクタか
それなら、自分の場合は
・デストラクタには「Dispose(false)」以外書かない(trycatchもしない)
・Dispose()側が例外を投げるかどうかは解放するリソース次第
・デストラクタの中に延々とリソース解放処理なりtry-catchが必要な処理なりを書いてるのだとすれば
そのソースコードは根本的におかしい
597:デフォルトの名無しさん
19/04/28 19:30:31.27 kMBz0MBMa.net
>>585
だから、デストラクタ「で」積極的にClose処理をするんじゃないの。
Close処理は普通にDispose/Closeに書くに決まっているわけだが、
使用者がそれを呼び忘れても最悪GCのお片付けのタイミングで
Close処理が行われるようにするための仕組みがデストラクタ
598:デフォルトの名無しさん
19/04/28 19:32:19.82 uWFo9H7Wa.net
ごめんもいっこ
・IDisposableなオブジェクトをDisposeせず使用している時点で実装不備とみなしてよい
(フィールド変数だったらポカミスで解放し忘れはあるかもしれないけど、
少なくともローカル変数ならusingを意図的に使ってない時点でコーダーが悪意を持ってると判断する)
599:デフォルトの名無しさん
19/04/28 19:32:33.80 KKCCRPTWa.net
>>586
いつまで勘違いしてるのか?
フールプルーフとフェイルセーフは別物だからwww
600:デフォルトの名無しさん
19/04/28 19:35:22.92 JJw12cyBa.net
>>590
DIに管理させるからusingもDisposeもしないという構成は非常に多い
601:デフォルトの名無しさん
19/04/28 19:35:29.40 KKCCRPTWa.net
自分の使ってるコードで完結してるのにデストラクタでアンマネージなどのリソースを
開放するのは間違った使い方
いくら自信たっぷりに書いてるのか知らないけど間違ってる
602:デフォルトの名無しさん
19/04/28 19:44:53.23 JJw12cyBa.net
>>593
知らない他人が何年後かに使うかもしれない
だとしたら誤った使われ方でも最低限の安全性を確保できるように作るべき
デストラクタでリソースを解放するのはアリ
603:デフォルトの名無しさん
19/04/28 19:47:01.57 Cfig35XD0.net
>>582
そんなレスしかできないなら黙ってろよw
604:デフォルトの名無しさん
19/04/28 19:50:07.37 KKCCRPTWa.net
>>594
IDisposable無視して放置する人を野放しにしないためにもデストラクタは不要だと思うわ
デストラクタが呼ばれたか呼ばれないかで意図しないタイミングで不具合が出たりでなかったりするだけだろ
そんなの余計に邪魔だろ
605:デフォルトの名無しさん
19/04/28 19:50:40.18 uWFo9H7Wa.net
さすがに自前で生成してない(解放しなくていい)オブジェクトはわざわざ解放しないよ
んーと、デストラクタを書かないといけないような処理があるならDispose(false)だけ書く、んだけど
なにか間違ったこと言ったかな
606:デフォルトの名無しさん
19/04/28 19:53:00.38 Cfig35XD0.net
>>590
> コーダーが悪意を持ってると判断する)
お前の判断なんてどうでもいい
MSはそんな判断してないからデストラクタからDispose呼んでるんだろうし
607:デフォルトの名無しさん
19/04/28 19:54:05.58 uWFo9H7Wa.net
書く必要がないデストラクタなら書かずに済ませるというのは同意
というか普段アンマネージドリソースなんて滅多にさわらないし
まともにデストラクタを書いたのはいったい何年前だろう
608:デフォルトの名無しさん
19/04/28 20:00:46.55 KKCCRPTWa.net
どうしてもデストラクタ使うなら解放忘れを解放するんじゃなくて
デバッグ中に解放忘れてるぞコラということを伝える仕組みを作るほうがまともじゃないかな?
自分の考えは>>584がほぼすべて
609:デフォルトの名無しさん
19/04/28 20:04:36.28 PHvM++pOM.net
>>566
ファクトリーメソッドを作って
その中でInitすれば良かろう
610:デフォルトの名無しさん
19/04/28 20:21:04.08 JJw12cyBa.net
解放忘れを本気で潰そうと思ったらさっき書いたようにファクトリーアイソレーションパターンを使う
Task ExecuteAsync(Func<ISomeResource, Task> job) {
using (var resource = new SomeResource()) {
await resource.OpenAsync();
await job?.Invoke(resource);
await resource.CloseAsync();
}
}
サービス利用者には生成も解放もインターフェースを提供しない
ExecuteAsyncを通さないとリソースにアクセスできないようにすれば解放忘れを完全に予防できる
611:デフォルトの名無しさん
19/04/28 20:28:37.93 kMBz0MBMa.net
>>591
フールプルーフ(ばかちょん)は何をやっても致命的にならない、
というニュアンスの方が強い。
この場合はどっちでもいいと思うけどね
612:デフォルトの名無しさん
19/04/28 20:33:15.98 3t4t6vYZM.net
>>603
ばかちょんじゃなくてバカヨケだぞ
適当なこと書くなよ
613:デフォルトの名無しさん
19/04/28 20:37:42.11 kMBz0MBMa.net
>>604
それは直訳で、日本語では昔からばかちょんと言うんだよ
昔からというか昔はかもしれん。
俺もおじいさん先生からしか聞いたことない言葉だし
まあポリコレの時代だしね
614:デフォルトの名無しさん
19/04/28 20:39:59.68 3t4t6vYZM.net
バカチョンは意味が違う
615:デフォルトの名無しさん
19/04/28 20:42:39.60 3t4t6vYZM.net
バカヨケ 失敗しないような仕組み
バカチョン 誰でも使える
616:デフォルトの名無しさん
19/04/28 21:44:36.92 nV7r0mI50.net
>>592
コンテナdisposeしたら、ついでに中身も自動でやってほしいよな・・・
617:デフォルトの名無しさん
19/04/29 12:55:34.62 pjV/Nimc0.net
横からすまんがさあ
DIにMicrosoft.Extensions.DependencyInjection使ってるんだけど、これってコンテナから生成されたオブジェクトって永遠と生き続けるの?
どうやって開放するん?
618:デフォルトの名無しさん
19/04/29 13:05:11.30 ehYnqzb50.net
>>609
Scopeでググれ
619:デフォルトの名無しさん
19/04/29 13:39:51.85 NUp+Ex1Ma.net
基本的に生成元になったスコープをDisposeするとスコープ管理下のオブジェクトがまとめて消える
スコープはCreateScopeで再帰的に生成できる
BuildServiceProviderで作ったプロバイダーはルートのスコープに生えてるプロバイダーと考えればいい
アッドシングルトンで登録したやつは親子関係にある全てのスコープで1つしか作れずルートスコープと寿命が同期
アッドスコープドで登録したやつは各スコープ内で1つしか作れず作ったスコープと寿命が同期
アッドトランジエントで登録したやつはスコープ内で何個でも作れて作ったスコープと寿命が同期
ASP.NET Coreでは暗黙的に1つのリクエストに1つのスコープを割り当てる
訂正あったらヨロ
620:デフォルトの名無しさん
19/04/29 13:43:03.33 pjV/Nimc0.net
Scope = Asp.net用みたいな気になっていて全然知らなかったよ、ありがとう
ただDIなしの場合にusing句で書けるようなのはDIありでも簡単にかけそうだけど、オブジェクトを扱う箇所が数箇所に分かれてるときは難しそう・・・・
ScopeをDIコンテナに突っ込んだら突っ込んだでまた問題が増えるのかな・・・・
621:デフォルトの名無しさん
19/04/30 20:23:22.69 IHLGrYrL0.net
System.Globalization.JapaneseCalendarでeraを取得しているんだけど
Rが入ってこない・・・
Windows10でWindowsUpdateも最新なんだけど、何で入ってこないんでしょう
622:デフォルトの名無しさん
19/04/30 20:28:08.43 w+F7NKD3a.net
>>613
URLリンク(docs.microsoft.com)
> To test that your application works with the new era, you must advance your computer's clock to May 1, 2019 or later.
PCの時刻設定を2019/05/01以降にする必要があるらしい
623:デフォルトの名無しさん
19/04/30 20:38:50.44 LbZ9KfXX0.net
まずまだアップデートはオプション段階だが、KB4493443入れてる?
正式なWindowsアップデートは5月以降だよ
624:デフォルトの名無しさん
19/04/30 20:45:03.73 YvhWBPAF0.net
KB4493443って、Windows8.1用だったような。
ちなみに、Windows10, version1809用は「近日公開予定」だそうで。
URLリンク(support.microsoft.com)
625:デフォルトの名無しさん
19/04/30 21:35:51.80 u6t/T7mma.net
もう元号とかやめて欲しいよねほんとw
いい加減役所も西暦に一本化しろよ
626:デフォルトの名無しさん
19/04/30 21:36:53.61 TyGEr2d8a.net
統一したら雑務が減っちゃうだろ
627:デフォルトの名無しさん
19/04/30 22:02:27.50 LbZ9KfXX0.net
>>616
訂正ありがと 手元にあるのが8.1で全部おんなじかと
628:デフォルトの名無しさん
19/05/01 06:30:43.85 +0nnIASf0.net
皆さんレスどうもです
まだ対応待ちってことですね・・・
とりあえずいまはテスト用にレジストリいじれるしかなさそうですね
629:デフォルトの名無しさん
19/05/01 14:39:10.04 NTU1YIA40.net
インデクサーってpublic T this[int I]{}みたいに定義するらしいけどさあ
ここに出てくるthisの部分って、this以外も入りうる余地ってあるの?
630:デフォルトの名無しさん
19/05/01 14:49:13.86 lxO04VNX0.net
>>621
無いよ
this以外にするとインデックス付きプロパティって意味になると思うけど、c#には無い
631:デフォルトの名無しさん
19/05/01 14:51:52.86 U25K78xGa.net
>>621
URLリンク(docs.microsoft.com)
> indexer_declarator
> : type 'this' '[' formal_parameter_list ']'
> | type interface_type '.' 'this' '[' formal_parameter_list ']'
> ;
入るのはthisだけで、this以外が入る余地はない
632:デフォルトの名無しさん
19/05/01 15:04:58.50 NTU1YIA40.net
ありがとう
無いものについてパッとわかるとか驚くぜ
633:デフォルトの名無しさん
19/05/02 05:11:25.37 fWQ7EMkU0.net
メモ
URLリンク(www.enterprisedb.com)
URLリンク(www.devart.com)
URLリンク(visualstudio.microsoft.com)
URLリンク(www.nuget.org)
URLリンク(www.nuget.org)
URLリンク(www.nuget.org)
URLリンク(www.nuget.org)
URLリンク(www.pgadmin.org)
URLリンク(dev.mysql.com)
634:デフォルトの名無しさん
19/05/02 06:26:48.77 qeQLZJi00.net
そういうのはQiitaでやれ(Qiita警察激怒)
635:デフォルトの名無しさん
19/05/02 12:04:50.67 ir+Ne9RR0.net
メモ系ツールなんて山ほどあるのにわざわざこんなところに書くのか
俺こんなの調べてんだぜすごいだろ?みたいな承認欲求なのかね?
636:デフォルトの名無しさん
19/05/02 19:31:55.56 Plm8DXbx0.net
初心者ですが、乱数系列の初期化(Randomクラスのオブジェクトの生成)は
どこに書くのが正解なんでしょうか?
関数の中に書くと、関数が呼び出されるたびに初期化されるんじゃ?と思えるのでちょっと拙い
関数の外側にプログラムの初めの辺に書いておけばいいのかなあ?とも思うのですが、それもカッコ悪い
637:デフォルトの名無しさん
19/05/02 19:36:11.39 rtZHUO2Da.net
>>628
依存性として注入するのが定石
638:デフォルトの名無しさん
19/05/02 20:19:04.27 Plm8DXbx0.net
依存性 注入で検索したらいろいろ出てきたので調べてみます
639:デフォルトの名無しさん
19/05/03 03:27:08.36 eVcW5sZJ0.net
>>628
最近のは年月日時分秒を整数にして種にしてるっぽいから、
毎回初期化の方がランダム性が高まるんじゃないかと思ってる。
640:デフォルトの名無しさん
19/05/03 03:31:56.40 t597qxt20.net
>>628
仕様次第
乱数の仕様を設計書に明記する必要がある
641:デフォルトの名無しさん
19/05/03 12:41:41.06 Xwdpydd1a.net
>>628
訳分からん解答が続いてるけど、素直に
インスタンス固有である必要があるならコンストラクタに
staticでよいなら静的コンストラクタに
書けばいいだけ。かっこ悪いとか、くだらないことに悩むのは時間の無駄。
この場合は不要だと思うけど、静的コンストラクタが実行されるのはそのクラスの
静的メンバーに初めてアクセスされたタイミングだと思ったので、その点は場合によっては注意
642:デフォルトの名無しさん
19/05/03 12:51:40.57 JARezKaea.net
>>633
嘘を教えるな
そんな馬鹿な使い方をしたらテストできなくなるだろ
643:デフォルトの名無しさん
19/05/03 13:16:48.56 JqDPcuspM.net
private staticなら単体テストには支障ないだろ
厳密な再現性を求めるなら本来はシードを固定するべきだが
644:デフォルトの名無しさん
19/05/03 13:23:25.74 Xwdpydd1a.net
どっからテストとか出てくるんだw
意味が分からん
645:デフォルトの名無しさん
19/05/03 13:28:31.30 5Dkgrzu1M.net
>>633
そもそも因果関係が逆だよな
キモメンが書いたコードがダサい
646:デフォルトの名無しさん
19/05/03 13:39:56.17 ffSbfxo8M.net
>>636
staticだとコンストラクタで実装を差し替えられないから単体テストの邪魔になりやすいというのは一般論としてはある
Randomを差し替える必要があるケースは極めて稀だが、上で述べたように厳密な再現性が求められるケースならありえなくもない
647:デフォルトの名無しさん
19/05/03 13:45:36.92 JARezKaea.net
>>635
直近のN回が特定の数列の場合のテストとかしにくいだろちったあかんがえろ
>>636
テストしねーのかてめー?終わっとるな
648:デフォルトの名無しさん
19/05/03 13:57:48.60 Zy40eisO0.net
>>639
横からすまんが、そのテストしにくい例ってのをコードで見せてくれんかな
学習のためにどうか頼むわ
649:デフォルトの名無しさん
19/05/03 14:05:21.52 N/aYDMHoM.net
>>640
例えばガチャを作ってるとして、0-999の乱数で0-9が出たらSSRを排出する仕様なら、
0と9と10くらいを決め打ちでテストしたくなるだろ?
まあそのために乱数生成器をモックしなきゃいけないような設計には再考の余地があると思うが、状況としては普通にありえるだろう
650:デフォルトの名無しさん
19/05/03 14:07:16.80 roEz64M2M.net
あなるあなる肛門肛門
651:デフォルトの名無しさん
19/05/03 14:07:36.88 roEz64M2M.net
すまん誤爆でした!!!
652:デフォルトの名無しさん
19/05/03 14:09:46.15 Xwdpydd1a.net
だから質問者はそんなこと聞いてないって...
どんだけ独りよがりの妄想展開するんだよ
653:デフォルトの名無しさん
19/05/03 14:11:43.11 roEz64M2M.net
>>644
うるせーばか子ね
654:デフォルトの名無しさん
19/05/03 14:16:40.44 JARezKaea.net
現在時刻とか乱数みたいな制御しにくい値はインジェクションする
これ常識な
勉強になったねきみたち
655:デフォルトの名無しさん
19/05/03 14:47:40.00 3MJf1YjB0.net
>>644
カッコイイか悪いかだから
って問題があってカコワルイ
ってつければ質問者の望む回答
656:デフォルトの名無しさん
19/05/03 15:12:05.72 uS7vqCXY0.net
>>639
本末転倒だろう。
作るべき物の要件に合わせて乱数生成の挙動を定義して設計するのが優先すべき事項で、その実装をテストするためのコードは必要に応じて用意すればいいだろう。
657:デフォルトの名無しさん
19/05/03 15:31:58.12 JARezKaea.net
>>648
それはアマチュアの考え方
658:デフォルトの名無しさん
19/05/03 15:33:51.16 wCLW0/2P0.net
>>649
スレタイ読め
659:デフォルトの名無しさん
19/05/03 15:38:42.54 q0Uiy+aiA.net
どーでもええわ
660:デフォルトの名無しさん
19/05/03 15:58:52.41 Ue5NRrHW0.net
教えてください。
以下のコードで、x の定義は問題ないのに y の定義だけコンパイルエラーになってしまいます。
==
const Exception e = null;
const bool x = e == null; // エラーなし、true が設定される。
const Type t = null;
const bool y = t == null; // CS0133 y' に割り当てられた式は定数でなければなりません。
==
何が原因でこのような違いがでるのでしょうか。
また、y を定数のままエラーが出ないように修正することは可能でしょうか。
よろしくお願いいたします。
661:デフォルトの名無しさん
19/05/03 16:01:49.32 3MJf1YjB0.net
>>652
結果によってtrueやfalseになるようなんは定数と呼ばん
662:デフォルトの名無しさん
19/05/03 17:46:27.38 Xwdpydd1a.net
>>652
例外はTypeで==演算子が再定義されてるからみたいなので、
const bool y = t == (object)null;
一応これで文句言われないみたい
663:デフォルトの名無しさん
19/05/03 17:53:37.68 Xwdpydd1a.net
あ、なんか例外とか意味不明なこと書いてるけど突っ込まないでねw
664:デフォルトの名無しさん
19/05/03 18:53:11.77 78NC+NUs0.net
>>654
え?
それ通るの?
怖い
665:デフォルトの名無しさん
19/05/03 19:21:25.35 Xwdpydd1a.net
言語仕様の「定数式」の項を見れば別に不思議はないんだけど、
他人の書いたコードでこういう式を見たら一瞬「何の意図でこんな式を書いてるんだ?」
と思っちゃうね。
666:デフォルトの名無しさん
19/05/03 20:24:56.25 Ue5NRrHW0.net
>>653
レスありがとうございます。
定数のまま、というのは const を付けたまま、という意味のつもりだったのですが、
表現が不適切だったかもしれません。失礼いたしました。
>>654
ありがとうございます!うまくいきました。
ちなみにいろいろ試してみると、
string は == が定義されているもののエラーが出ないようです。
さすがに string は特別ということのようですね。
(ただ、typeof(string).IsPrimitive は false にだったりして
いまいちしっくりきませんが。。。)
==
const string s = null;
const bool z = s == null; // エラーなし、true が設定される。
==
何にせよ、問題はすっきり解消いたしました。
適切なアドバイスどうもありがとうございました。
667:デフォルトの名無しさん
19/05/03 20:25:45.58 Ue5NRrHW0.net
>>657
実際に const を使いたかったわけではなく、
問題の切り分けを行った結果として >>652 のように質問させていただいたのですが、
言われてみれば確かに何がしたいのかわからない・・・。
もう少し元の問題に近いコードを提示するなら、以下のような感じです。
==
const Type t = null;
if (t == null) Console.WriteLine("t is null.");
else Console.WriteLine("t is not null."); // 警告なし
const Exception e = null;
if (e == null) Console.WriteLine("e is null.");
else Console.WriteLine("e is not null."); // CS0162 到達できないコードが検出されました
==
668:デフォルトの名無しさん
19/05/03 20:54:20.72 mscz+0vpa.net
>>659
いやいやいや、俺はおたくにケチつけたわけじゃないよw
const bool y = t == (object)null;
こういうのはぱっと見て意図が分からないと言っただけ。
むしろ「マジックナンバー」を避けるのは良い習慣ですよ
669:デフォルトの名無しさん
19/05/03 20:57:46.12 mscz+0vpa.net
>>658
>string は == が定義されているもののエラーが出ないようです。
上にも書いたけど、その辺のモヤモヤはC#の言語仕様の「定数式」の箇所を見れば解消するよ。
VSのインストールフォルダに入ってる
670:デフォルトの名無しさん
2
671:019/05/03(金) 21:13:39.41 ID:rGk2iQn5a.net
672:デフォルトの名無しさん
19/05/03 22:02:39.62 Ue5NRrHW0.net
>>660
> const bool y = t == (object)null;
> こういうのはぱっと見て意図が分からない
そうですねw
式の意味を考えるなら t == (object)null は
ReferenceEquals(t, null) と書くのがわかりやすいんでしょうけど
const うんぬんの話の中でこれはダメですし。
ちなみに今ふと思いついて試してみたんですが、
t is null も == の定義には依存しないものの定数扱いにはならないようです。
>>661
ありがとうございます。
言われてみると、そもそも C# と CLR の役割自体が正確に区別できていないような
気がしてきたので、これを機会に勉強してみようと思います。
673:デフォルトの名無しさん
19/05/03 22:03:15.73 Ue5NRrHW0.net
>>662
質問させていただいたのは、
>>659 のコードみたいに CS0162 の警告が出てほしいのに
出てくれない場面があったからです。
でもたしかに readonly なローカル変数はあってもいいですよね。
あと、引数のみに依存して副作用もないメソッドについて
↓みたいな書き方が許されたらいいのに~とか妄想しましたw
==
static class MathEx
{
public const double Square(double x) => x * x;
}
static class MyConstants
{
public const double SquarePI = MathEx.(Math.PI);
}
==
674:デフォルトの名無しさん
19/05/03 22:05:09.07 Ue5NRrHW0.net
何度もすみません。。。上の妄想コードは間違いです。
正しくはこちら。
==
static class MathEx
{
public const double Square(double x) => x * x;
}
static class MyConstants
{
public const double SquarePI = MathEx.Square(Math.PI);
}
==
675:デフォルトの名無しさん
19/05/03 22:55:31.79 1vSUmwo4M.net
実質的に定数ならJITコンパイル時に定数に置き換わるからそんなものは要らん
676:デフォルトの名無しさん
19/05/03 23:53:26.41 BZD1sthA0.net
decimalの定数は内部的にアレだけどな
677:デフォルトの名無しさん
19/05/04 07:03:09.32 Y3LpLEUoM.net
>>667
詳しく
678:デフォルトの名無しさん
19/05/04 13:03:57.01 3sktWiiHa.net
>>668
横からだけど URLリンク(ufcpp.net) のことだと思う
679:デフォルトの名無しさん
19/05/04 14:32:15.09 IHSUUilV0.net
List.Addって、複数のスレッドから同時に呼び出したらデータが壊れる可能性ってあるの?
680:デフォルトの名無しさん
19/05/04 15:00:48.03 NSx1pb1m0.net
>>670
スレッドセーフじゃないからlock制御を自前で持つか、System.Collections.Concurrentのコレクション使うべき
681:デフォルトの名無しさん
19/05/04 15:23:49.46 H40F3Pfj0.net
Queueの出し入れもlock必要だし、マルチスレッドはめんどいよな。
なんでConcurrentDictionaryはあるのにListは無いのか
682:デフォルトの名無しさん
19/05/04 15:37:29.51 uz0VN5nda.net
>>672
使い道がない
683:デフォルトの名無しさん
19/05/04 15:38:02.55 vy21Hr2ZM.net
個人的にはスレッド自体に特定のスレッドからのデータを受け取る処理がある方が好き
684:デフォルトの名無しさん
19/05/04 15:57:05.65 qIB0qWQDM.net
別々のスレッドから生成された値を集めたいなら、
各スレッドで別のバッファ(List)に値を書き込んでから最後に単一スレッドでマージするのが定番
685:デフォルトの名無しさん
19/05/04 17:20:59.03 pMssk1qR0.net
スレッドセーフって実はどういう動作するのかよく知らないぜ
686:デフォルトの名無しさん
19/05/04 17:27:01.27 0zm1CIpf0.net
>>676
わかる
エラーがでなかったらそれがスレッドセーフ!!
687:デフォルトの名無しさん
19/05/04 20:18:11.93 pMssk1qR0.net
APIのマニュアルにおいて「スレッドセーフ」という言葉が用いられる場合、たいていは「複数のスレッドからアクセスされても例外を出さない、プログラムがクラッシュしない」というような意味です。
しかしプログラムの目的によっては、例外が出ないだけでは不適切です。
例えば対象が、100個のデータを管理する変数だとします。
その100個のデータに対して、1つ目から順に処理するスレッドと、50個目から変更するスレッドが同時に動いたらどうなるでしょうか? 結果は不定です。
この例では、排他処理 (C#なら lock ステートメントなど) と呼ばれる処置が必要になります。
ってググって出たサイトで拾った
688:デフォルトの名無しさん
19/05/04 20:25:20.65 pMssk1qR0.net
つまり
for(int i=0;i<lst.count;i++)
{
unk un=lst[i];
略
}
みたいなプログラムを組んだとき
どっかでいきなり要素をゼロにされて死ぬってことは
スレッドセーフだろうがどうだろうが可能性はあるってことだよね
ってことを考えるとスレッドセーフである意味ってあんまりなくて
排他処理は絶対実装しないと駄目だよね?ってこと?
誰か違うと言ってくれ
689:デフォルトの名無しさん
19/05/04 20:59:32.71 Ui9BQ5TxM.net
スレッドセーフはメソッド内などで一貫性を保てる作り
排他制御が必要な場面でやってないなど作り手のロジックミスには対応出来るわけがない
690:デフォルトの名無しさん
19/05/04 21:06:21.08 Ui9BQ5TxM.net
スレッドセーフである意味
あるオブジェクトがプロパティAを持っててメソッド内で
b=aaa(A)+bbb(A);
を計算しようとしても複数のスレッドからアクセスされることを考慮されていなければ
最初のAと次のAが違う場合があり計算結果が期待したものにならないかもしれない
スレッドセーフはこういう場合でもちゃんと計算される仕組みを持つ
691:デフォルトの名無しさん
19/05/04 21:07:23.59 3sktWiiHa.net
>>679
その処理は要素数チェックと要素アクセスが分かれているから、間に他スレッドからの処理が割り込み得る
System.Collections.Concurrent系のコレクションは、
例えば「要素があるなら取得」のようなまとまった処理がatomicになっているので、他スレッドからの割り込まれない(=スレッドセーフ)
どっかのスレッドで詰めて、別のスレッドでループ処理、がやりたいのならBlockingCollectionが楽
692:デフォルトの名無しさん
19/05/04 21:27:48.58 qIB0qWQDM.net
>>679
厳密に他のスレッドとの同期を取らなきゃいけないなら>>682の言うようにBlockingCollection使うか毎回ロックだろうし、
ループ中は他のスレッドによるlstの変更を反映しなくていいならループに入る直前だけロックしてコピーしておけば済む
ケースバイケースだよ
一つ一般的なアドバイスをしておくと、並列処理のコツはデリケートな前提をなるべく設けずに極力ロバストな設計をすることだ
要件が許す限りにおいて、少々処理の順番が入れ替わったり処理間の同期が取れてなかったりしても問題にならないつくりにするのが理想
693:デフォルトの名無しさん
19/05/04 22:09:10.98 56LrGuhB0.net
非同期処理は複数のスレッドが同じデータを弄ろうとすることによる不整合は起きないけど
コールスタックは複数になるから
同じデータに触ると訳ワカメになる事があった
694:デフォルトの名無しさん
19/05/04 23:16:04.81 pMssk1qR0.net
(||゚Д゚)ヒィィィ!(゚Д゚||)
じゃあ>>679みてーな処理を書いたら
スレッドセーフなんて関係なく
バグるんだね
こぇえええええ
じゃなくて終わったわ
今まで組んだもんでテキトーにやった箇所全部終わってる気がする
695:デフォルトの名無しさん
19/05/04 23:28:33.99 J15hVQV0a.net
まあ複数スレッドで同時並行処理するときにはそのへん慎重を期さないと
再現困難なバグを埋め込んじゃうからねえ
同時に読み書きする可能性のある変数を安易に書き換え/差し替えしちゃダメ
696:デフォルトの名無しさん
19/05/05 05:07:07.08 tvdtPjB+0.net
マルチスレッドの恐ろしさは、たまにしかバグらない事。
ほとんどは正常に動くから、質が悪い。
必ず、バグらないだろ
それで喧嘩になる事も多い。
マルチスレッドは、ベテランでもバグるからやめろと言っても、
ほら、バグらないでしょ? と、突っかかってくる
その時には、バグらないと言うと、
千回実行しても、バグらないでしょ? と、突っかかってくる。
でも、その時にはバグらない
バグる立証をするのが難しい
だから、Ruby をやった人は、関数型言語のElixir をやる。
他の言語の人は、何を言っても、そのテスト回数でバグらないと言ってくるから、質が悪い
1万回実行しても、10万回実行しても、その時にはバグらないものなんだよ。
何回バグらないで実行すれば、正しいと認めるのか、と問われても困る
697:デフォルトの名無しさん
19/05/05 06:10:17.07 BzgWdCy40.net
アクマノショウメイ
698:デフォルトの名無しさん
19/05/05 08:46:40.02 TKrOuc6uM.net
>>687
喧嘩になるのはマルチスレッドのバグのせいではなくお前の頭がバグってるから
699:デフォルトの名無しさん
19/05/05 08:57:36.80 Vqy33e5r0.net
エビデンスとれてりゃ突きつけるだけなのに
700:デフォルトの名無しさん
19/05/05 10:34:54.98 RPhfdkos0.net
>>687
マルチスレッドはバグるからやめろってなるのでなく、バグが無いように作れよ。
あと、お前の意見を相手が聞き入れず喧嘩になるのは、お前がいつもバカなことを言うから相手は当然受け入れる気にならず、お前にはその自覚がなくて「何でアイツは僕の言うことを理解してかれないんだウワアーーー」ってなってるからだぞ。
701:デフォルトの名無しさん
19/05/05 10:45:50.32 bYgaGqRgM.net
>>687
なんでバグが起こってるのか原因特定出来てなくてワロタ
702:デフォルトの名無しさん
19/05/05 10:48:34.16 uudMW5nw0.net
スレッドセーフは単発のメソッドが競合しないだけで
一連の処理についての動作保証をするものではないと
マルチスレッドはやらなくていいならそれに越したことはないけど
絶対に駄目というわけではなく
排他処理を組まないことが害悪
703:デフォルトの名無しさん
19/05/05 11:21:06.67 IBoHsNppa.net
排他制御をしなくても安全に並列処理できるように設計することが大事
まずはロック、クリティカルセクション、ミューテックス、セマフォ、といった待ち時間を発生させるタイプの機能を使ったら負け、というルールで設計に挑戦してみるといい
大半の並列処理でそんなものは必要ないこと、それらを使わないほうが圧倒的に設計とプログラムが綺麗になることを体験するべき
704:デフォルトの名無しさん
19/05/05 11:29:03.77 Q2loWuJOM.net
シネ
705:デフォルトの名無しさん
19/05/05 12:22:10.03 6g/cxz/+M.net
ぱられるふぉーってのを使えば良いんじゃね?
知らんけど
706:デフォルトの名無しさん
19/05/05 12:32:51.31 uudMW5nw0.net
>>694
うーん、でも>>679みたいなこと
やった時点で終わりってまともじゃねぇよ
コードで一瞬でもすきを見せたら終了みたいになっちゃうじゃん
お前の理想はなんかあるんだろうけど
他人が叫ぶスレッドセーフに頼っちゃ駄目だよ
アプリの仕様として排他処理を盛り込むべき
707:デフォルトの名無しさん
19/05/05 13:01:26.26 EeTrV1LT0.net
>>697
だからさ、>>679みたいなforループ自体をスレッドセーフにする一番簡易な表記方法がlockなんだよ
これ以上簡単に書くことはライブラリをどんだけ上手く作っても無理
708:デフォルトの名無しさん
19/05/05 13:15:03.75 l159r3xkM.net
>>698
それって記述が簡単ってだけでしょ?
ロック中にアクセスしたらどういう動作するの?
次回に回すの?
待機して待つの?
そういうのってスレッド毎にステータスを持たせて
マトリックスで管理しないと制御できてると俺は認めない
ジジイだから
709:デフォルトの名無しさん
19/05/05 13:34:55.82 1Pm7tIcB0.net
VisualBasic大先生を怒らせてしまったようだな
710:デフォルトの名無しさん
19/05/05 13:41:27.68 IBoHsNppa.net
>>698
だからさ
そんな不安定なロジックを書かなくても良いようにちゃんと設計するのが並列処理の王道なんだよ
lockブロックは最初の一回を書くときは楽かもしれんがだんだん難しくなるぞ
そのコレクションを使う全てのプログラマが並列性を意識して正確に排他制御をコーディングしなければならない
これは実用的なシステムの規模になるとかなり大きな負担になる
711:デフォルトの名無しさん
19/05/05 14:02:39.93 IBoHsNppa.net
そもそもロックって論外なんだわ
世の中の並列処理の目的ってのはほぼ2種類に分類されるんだよ
①インフラストラクチャ処理中にCPUを待たせたくない
②消費コア数を増やして暇なCPUを働かせたい
よーするにCPUを無駄にしたくないわけ
でもロックしちゃうと問答無用でCPUが何もせずに止まっちゃう
ロックすると並列処理をする目的そのものに反してしまう
なのでロックは基本使わず最後の手段ってわけ
この辺りは(やや古い本だが)Microsoft Pressのプログラミング.NET Franework第4版やEffectiveシリーズでも解説されてることだね
どちらも良書なので脱初心者を目指しているだろう君達は是非とも読むべきだ
712:デフォルトの名無しさん
19/05/05 14:08:00.64 kZz1htUnM.net
その通り
極端な話、並列処理なんてそれぞれ別のサーバーで実行させりゃいいんだよ
それがレイテンシやコストなどの問題で無理なら代わりにプロセスを分ければいい
そもダメならリクエストやワーカー単位でスレッドを分け、といった具合に、共有するリソースを最小限にすることを優先する
713:デフォルトの名無しさん
19/05/05 17:40:50.25 Q2loWuJOM.net
ジジイだから能力低いだけだろ
714:デフォルトの名無しさん
19/05/05 18:00:00.04 1Pm7tIcB0.net
非同期処理全盛の時代にこれじゃ、世の中やばいコード(or非同期処理のつもりが同期処理されてるコード)だらけだろうな
Qiitaとか見ててもやばい奴だらけだ
715:デフォルトの名無しさん
19/05/05 18:04:40.39 IBoHsNppa.net
>>705
今時lockだもんな、笑えない深刻さ
お前のコード、めちゃくちゃブロックされてんだけど、って同僚の誰かが教えてやればいいのに見て見ぬ振りは可哀想だ
716:デフォルトの名無しさん
19/05/05 18:09:44.07 1Pm7tIcB0.net
そもそも、世のサンプルプログラムの多くが欠陥品なのが諸悪の根幹なのかもな
劣化コピーしちゃうQiita屋とかコピペプログラマが全部危険なコードを書いてしまう
717:デフォルトの名無しさん
19/05/05 18:19:48.84 Q2loWuJOM.net
一番パフォーマンスの良いMutexを使ってる人がどれだけいるやら
718:デフォルトの名無しさん
19/05/05 18:23:53.97 IBoHsNppa.net
>>708
よくねえよw
OSリソース消費する処理に速度を期待するな
719:デフォルトの名無しさん
19/05/05 18:27:02.59 Q2loWuJOM.net
他人に迷惑をかける基地外はシネ
720:デフォルトの名無しさん
19/05/05 18:33:04.85 Q2loWuJOM.net
webサーバでスレッド一個で処理を完結するようにはなっていないだろ
721:デフォルトの名無しさん
19/05/05 18:33:17.95 IBoHsNppa.net
Mutexは相変わらずスレッドをブロックするうえにMonitorよりも消費リソースが大きい
その代わりプロセスを超えて待機処理を実装できるというものだ
よーするにlockよりもっと遅いんだよ
722:デフォルトの名無しさん
19/05/05 18:34:49.31 Q2loWuJOM.net
>>712
実務で使ったことないんだろ
黙っとけや
自分だけの小さなアプリしか作ったことないんだろ
723:デフォルトの名無しさん
19/05/05 18:37:30.50 IBoHsNppa.net
>>713
もう無理だよ笑わせないでw
もっともパフォーマンスの良いミューテックスwwwwwww
実務で使ったことないだろwww
学生さんですかwwww
724:デフォルトの名無しさん
19/05/05 18:38:33.24 Q2loWuJOM.net
5分で確認できることをできない老害
725:デフォルトの名無しさん
19/05/05 18:41:05.51 1Pm7tIcB0.net
Mutexはロックがいらないスレッド同士でもロックしちゃうのが使いづらいな
回避できるのかはしらんが
726:デフォルトの名無しさん
19/05/05 18:41:10.65 Q2loWuJOM.net
そもそもスレッドがとまると言ってるけどCPUのスレッドと.netのスレッド混同してそう
727:デフォルトの名無しさん
19/05/05 18:41:50.97 Q2loWuJOM.net
> でもロックしちゃうと問答無用でCPUが何もせずに止まっちゃう
これ笑う所?
728:デフォルトの名無しさん
19/05/05 18:45:15.15 Q2loWuJOM.net
ロックしちゃうと問答無用でCPUが何もせずに止まっちゃうわけないだろw
729:デフォルトの名無しさん
19/05/05 18:47:01.12 uudMW5nw0.net
え?lock中にアクセスしようとしたらどうなるの?
730:デフォルトの名無しさん
19/05/05 18:48:17.37 1Pm7tIcB0.net
ロックが取得できないだけ
731:デフォルトの名無しさん
19/05/05 18:48:31.54 Q2loWuJOM.net
お前のPCは8スレッドぐらい動かしたら止まるの?
732:デフォルトの名無しさん
19/05/05 18:51:01.09 IBoHsNppa.net
>>719
うるせーなスマホで長文書くとミスるんだよ
スレッドが
733:ブロックされるってことだ
734:デフォルトの名無しさん
19/05/05 18:51:41.98 Q2loWuJOM.net
>>723
ググってきたのかよ低能さん
735:デフォルトの名無しさん
19/05/05 18:52:07.51 uudMW5nw0.net
>>721
そんときのコードってどう書くの?
736:デフォルトの名無しさん
19/05/05 18:53:42.23 IBoHsNppa.net
>>724
調子のんなよ重箱の隅つつきマン
737:デフォルトの名無しさん
19/05/05 18:55:47.24 Q2loWuJOM.net
>>726
lockとMutexのパフォーマンスのベンチ比較して
結果を出せよ
それまで書き込みするな
738:デフォルトの名無しさん
19/05/05 19:00:35.89 IBoHsNppa.net
>>727
はぁ?
言い出しっぺのてめーがパフォーマンス一番良いミューテックスのベンチ出せや
一番ってんならロックと比較なんてケチくせえこと言わんで他の排他制御機構とも比較しろよ?
739:デフォルトの名無しさん
19/05/05 19:00:46.75 Q2loWuJOM.net
どう見ても間違っている内容で煽られると人はどう思うのか
どう考えても仕組み上Mutexのほうが遅い
740:デフォルトの名無しさん
19/05/05 19:07:06.98 1Pm7tIcB0.net
>>725
普通に取得できるのを待ってるな
まあ、ロックが取得できるまで制御を戻したりはしておらんわ
741:デフォルトの名無しさん
19/05/05 19:12:25.48 uudMW5nw0.net
>>730
だよね
ちょっと調べてるけど
普通の排他処理組んでおきたくて
lock
ReaderWriterLockSlim
UpgradeableReadLock
なんか普通の排他処理したいだけなのに
たくさん出てきちゃったぞ
これ全部使っても
ん?排他処理できてんのか?
って疑問が晴れない
この言語非同期処理の対応手薄なんだよねまだ
時期尚早として触らんことにしたw
742:デフォルトの名無しさん
19/05/05 19:21:47.99 1Pm7tIcB0.net
LockやMutexは初心者本の範囲内だからしらんのはまずいよ
743:デフォルトの名無しさん
19/05/05 19:45:53.31 VmrJwxHQM.net
非同期のチートシートないの?
744:デフォルトの名無しさん
19/05/05 19:57:32.38 LYwUBfu90.net
URLリンク(qiita.com)
測った人によると
nterlocked > lock > SemaphoreSlim > Semaphore > Mutexだってさ
745:デフォルトの名無しさん
19/05/06 02:20:35.00 wkmj+bF20.net
並列処理なら.netなんだからF#でSTM使え。
何で関数型言語が注目されたんだよ。
並列処理に有利だからだろ。
746:デフォルトの名無しさん
19/05/06 04:59:30.75 wr9bFPpT0.net
マルチスレッドなんか無理!
だから、Ruby の人は、Elixir を使う
作るのに何百年も掛かる、人類の成果、Erlang VM + Ruby = Elixir。
ErlangVMを、Rubyでラップしたもの
Elixirの小プロセスなら、10万プロセスも余裕!
パイプラインと同じ
関数型だから状態を持たない。
ただ、データを変換していく関数をつなげていくだけ!
747:デフォルトの名無しさん
19/05/06 07:40:48.06 WDjCowqB0.net
>>736
Rubyにマルチスレッドは、無理!
RubyはいわゆるGILといって、同時に複数のスレッドが走らないような排他制御がVMレベルでかかっている
これはVM自体がスレッドセーフでないクソ実装であることに起因する制約である
もちろんC#にはそんなものはないし、ベンチマークだとErlangより速い
748:デフォルトの名無しさん
19/05/06 12:19:36.88 zGa1jTsu0.net
Windows8.1/10の令和対応アップデートでWinFormsの画面レイアウトが崩れるらしいね
749:デフォルトの名無しさん
19/05/06 12:48:42.80 w2Z6VwVJ0.net
お前んとこのWinformsいつもレイアウト崩れてんな
750:デフォルトの名無しさん
19/05/06 12:59:34.99 rtkPFZMSd.net
>>738
俺のとこも昨日発生した
AutoScaleModeをNoneにして対応できたから令和のせいではないと思う
751:デフォルトの名無しさん
19/05/06 13:02:49.51 4h7Vjk7HM.net
>>739
は?崩れてねーし
OKボタンが画面外にいって押せないだ
752:けだ
753:デフォルトの名無しさん
19/05/06 21:06:24.34 Gi+4ls7q0.net
画面レイアウトがクソみたいに崩れたぞ死ねや
754:デフォルトの名無しさん
19/05/06 21:19:39.33 Gi+4ls7q0.net
>>740
どうやってやるのそれ?
visual studio開いた時点ですでに崩れてて手動で戻すしかなさそうなんだが。
【警鐘】[改元][Windows][.NET] 「令和」対応パッチで画面が横に伸びる、文字が見切れる ― Windows Update 手動更新はちょっと待った方がいい
URLリンク(qiita.com)
755:デフォルトの名無しさん
19/05/06 21:32:21.57 lj/6a9HB0.net
>>743
デザイナ表示壊れてんのなら.Designer.csの中身書き換えるしかないんじゃね
AutoScaleMode.FontをAutoScaleMode.Noneに全部置換したらいい
756:デフォルトの名無しさん
19/05/06 21:39:51.78 Gi+4ls7q0.net
>>744
ありがとう
form1.csのデザインのAutoScaleModeをNoneにしたけど何も起こらなかったからあきらめてたけど、そっちを修正したら解決したわ。
757:デフォルトの名無しさん
19/05/07 00:11:46.09 HkLoI6gC0.net
>>740
令和を1文字で表すやつのために、フォントをいじったんだが、そのときに既存の文字の幅が変わったらしい
なのでまあ、令和対応のせいだと言えばそうなんじゃね
つか明日からどれだけ影響出てるか考えると鬱だわ
758:デフォルトの名無しさん
19/05/07 01:24:56.82 A2KlUElc0.net
納期直前でGW返上してる最中にこの不具合対応しなきゃいけなくなってかなりイラッとした
759:デフォルトの名無しさん
19/05/07 08:16:44.51 h85TWq9Qa.net
URLリンク(devblogs.microsoft.com)
.NET Framework 終了のお知らせ
Coreへ移行できないドカタは永遠に4.xに取り残されることが決定したようだ
760:デフォルトの名無しさん
19/05/07 08:55:31.55 H2EGG+st0.net
>>748
すげーな。20年以降毎年バージョン上がる予定か
2020 .net5
2021 .net6
2022 .net7
2023 .net8
.net4で停滞した10年とは一体
761:デフォルトの名無しさん
19/05/07 08:58:10.52 Q8AOfbVkd.net
Java interoperabilityって何なんだよ…
762:デフォルトの名無しさん
19/05/07 09:30:59.37 n4vre8LhM.net
>>748
出来損ないは過去に葬った方が世の中のためだぁ
763:デフォルトの名無しさん
19/05/07 10:21:58.95 vw5zJnlq0.net
バージョンを頻繁に上げるのは、
成熟していないってことでは?
764:デフォルトの名無しさん
19/05/07 11:33:46.06 4Mlb2ms50.net
FrameworkからCoreに移行できないのはどういう場合ですか?
765:デフォルトの名無しさん
19/05/07 11:59:10.66 25JpTCOf0.net
え、winformはどうなるの??
766:デフォルトの名無しさん
19/05/07 12:06:04.60 b+Ix+FO0a.net
最近のmicrosoftかなり攻めてるな
767:デフォルトの名無しさん
19/05/07 13:10:26.59 eYh/lhy30.net
.net frameworkからcoreなんてどこかちょろっといじったらいいだけじゃないの?
VB6からVB.netほどの変化はないんだろ?
768:デフォルトの名無しさん
19/05/07 13:37:50.62 9iRY6hHtM.net
>>753
そんなワケのわからんもん使こて何かあったらどないすんねん!責任取れるんかい!
わりとこれ
769:デフォルトの名無しさん
19/05/07 13:46:35.16 9CwYXDcE0.net
別に移行しなくてもいいですけど保守には特別料金いただきまっせ
770:デフォルトの名無しさん
19/05/07 13:47:55.21 Q8AOfbVkd.net
>>756
Web FormsはほぼUI作り直し
771:デフォルトの名無しさん
19/05/07 13:50:03.67 9iRY6hHtM.net
あと技術的な最大の障害はWebFormsだろう
WebFormsは.NET Coreではサポートされてないし、される気配もない
既存資産の移行もさることながら、.NETドカタはWebForms頼りで標準的なWeb開発のスキルを持たない奴も多い
彼らはWebアプリケーションの開発が不可能になり、路頭に迷うことになる
772:デフォルトの名無しさん
19/05/07 17:00:19.52 1tK/VkfG0.net
すまんが、Stream型って前の方だけメモリを解放するとか器用なことは出来ないの?
773:デフォルトの名無しさん
19/05/07 19:17:09.01 9iRY6hHtM.net
>>761
意味不明
お前の考えはどうでもいいから具体的に何が問題になっているのか、もしくは何が気になっているのか書け
774:デフォルトの名無しさん
19/05/07 19:23:08.04 VnMa5nf90.net
Stream型ってなんか確保してんの?
775:デフォルトの名無しさん
19/05/07 19:29:05.20 n4vre8LhM.net
Streamの実装によるだろ
776:デフォルトの名無しさん
19/05/07 21:03:30.48 FJj2rymy0.net
>>761
Streamクラスは抽象クラスだけど、MemoryStreamクラスを想定してるのかな。
何となくMemoryMappedFileクラスが要望に合ってるような気がする。
777:デフォルトの名無しさん
19/05/08 21:27:25.44 4kxgmlsqa.net
C#でwindowsPCのマイク音量設定を設けたアプリを作りたいんですが情報がいまいち出てきません
今現在どのような方法が推奨として使われているのでしょうか
778:デフォルトの名無しさん
19/05/08 21:33:29.28 UPhx/0uCM.net
おとなしくNAudioと言うのを使いなさい
779:デフォルトの名無しさん
19/05/09 20:00:37.76 25KQckNoa.net
>>767
ありがとうございます
調べてみます!
780:デフォルトの名無しさん
19/05/10 07:09:33.41 8h0VP8xa0.net
RPgエディタみたいなタイルマップを配置する機能を作る場合、画像を配置するフォームは何が適切でしょうか?
前にも聞いた気がするんですが、レスを忘れてしまって、、、
781:デフォルトの名無しさん
19/05/10 07:45:25.60 guXEw79XM.net
モデリングソフトに決まってんじゃん
2Dでもプラグインあるからプロならモデリングソフト
個人製作ならエクセルで代用しとけ
ってスレ違うやん
782:デフォルトの名無しさん
19/05/10 07:46:35.31 guXEw79XM.net
いや、すまん、質問内容取り違えてたw
ピクチャーボックスで
783:デフォルトの名無しさん
19/05/10 08:14:45.00 uov0WiW1d.net
>>769
Panelを継承したカスタムコントロールのOnPaint内で描画する事だな
784:デフォルトの名無しさん
19/05/10 12:26:08.70 8h0VP8xa0.net
>>771
ピクチャボックスですね
毎回忘れちゃうです
785:デフォルトの名無しさん
19/05/10 17:41:55.34 ZtjlRqB/0.net
質問するだけで自分でやらないから忘れるんだよ
>>772
継承させる意味が分からないしOnPaintならPanelでなくてもいい
786:デフォルトの名無しさん
19/05/10 18:53:28.94 8h0VP8xa0.net
visual studioのhddへのアクセスは制限できますか?
激重です
SSDにしろって話ですけどね
787:デフォルトの名無しさん
19/05/10 19:04:05.18 8h0VP8xa0.net
>>774
picturebox自体を何個も並べるんですか?
picturebox1つの中に複数の画像を並べるですか?
788:デフォルトの名無しさん
19/05/10 19:28:03.03 tfYAY6pzM.net
>>776
どっちでもいいよ
どのみち今の君のレベルで作ってもまともに使い物になるようなものにはならないから、うだうだ考えるより手の届く範囲で経験値を積んだ方がいい
行き詰まる頃にはだいぶレベルが上がってるはずだから、また作り直す
三周目くらいになればまともに作れるようになってるよ
789:デフォルトの名無しさん
19/05/10 19:30:30.41 uRQk/IXU0.net
3週でいけるのだろうか?
790:デフォルトの名無しさん
19/05/11 12:14:17.95 kDrnBD/r0.net
低レベルな質問で申し訳ないのですが、循環バッファって凄い便利だから
全ての配列は循環バッファで実装すればいいと思うのですが、デメリットはあるんでしょうか?
Delete
Insert
Add
が全てO(1)で出来るって凄くないですか?
791:デフォルトの名無しさん
19/05/11 12:25:39.14 E3skkYkSM.net
>>779
俺は必要になったことないよ
どんなときにいいの?
792:デフォルトの名無しさん
19/05/11 12:30:42.30 qR2J3ArJM.net
下手の考えなんとかつってなー
高レベルになってから言ってくれ
793:デフォルトの名無しさん
19/05/11 12:39:31.51 td9YBJ3L0.net
>>779
>***全ての配列は***循環バッファで実装
配列のままの方が良い場合もあるが
そうしたいならそうすればいい
ただし配列以外の構造が必要になるケースでは使えないぞ
794:デフォルトの名無しさん
19/05/11 12:56:33.31 4CcYolMU0.net
>>779
トークンリングとイーサネットの
違いを理解してから再度質問を
795:デフォルトの名無しさん
19/05/11 12:59:31.48 aDjFJI/sa.net
>>779
Addは、reallocationを考慮しても償却定数時間で出来そうだが
Delete, InsertがO(1)だというソースをくれ、「末尾」という指定がない以上任意位置だよな?
途中要素をDelete,Insertしたら要素の詰め直しが必要でO(N)になると思うんだが
O(N)になるならList<T>で十分という話になる
796:デフォルトの名無しさん
19/05/11 13:05:46.01 DR+jkhoz0.net
続きはこちらでどうぞ
【O(n)】計算量の評価方法について【O(log n)】
スレリンク(tech板)
797:デフォルトの名無しさん
19/05/11 13:06:24.02 aDjFJI/sa.net
考え直したらQueueやStackのことを言っている気がしてきた
それらのデータ構造がもうあるんだからそれ使えば良いんじゃね
798:デフォルトの名無しさん
19/05/11 15:39:49.17 8cYUuN//0.net
すべての配列は~というのが考え方が
そもそも乱暴で
目的に合わせてデータ構造を選ぶものじゃ
799:デフォルトの名無しさん
19/05/11 16:14:40.10 MBpEq5nf0.net
Visual C#で電卓を作ってます。
ある数字ボタンをクリックしたとき、(Button)sender).TextでTextran欄の文字を取得できますが
クリックではなく、キーボード入力で同様にしたいのですが、どうすればできますか?
800:デフォルトの名無しさん
19/05/11 16:26:29.83 VR7g318H0.net
>>788
KeyPressやKeyDownなどのイベント
ただし該当するコントロールにFocusされてないと反応しないのでフォームで全部受けるようにするとはかどる
URLリンク(dobon.net)
801:デフォルトの名無しさん
19/05/11 17:24:06.36 qy13k0f30.net
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(@"C:\Users\◎◎\Desktop\volly.gif");
this.pictureBox1.Image = bmp;
パスについてなのですが、相対パスは使えないということがあるんでしょうか。相対パスだとパラメータが違うというエラーが出ます。
フォームアプリケーションなので、form1.csにコードを書いています
form1.cs
img(フォルダ)
└volly.gif
という構造になっています
しかし、img\volly.gif
だとエラーになります
何が悪いでしょうか。
802:デフォルトの名無しさん
19/05/11 17:26:35.03 Q2bK8ZXg0.net
>>790
.\img\volly.gifじゃね?
803:デフォルトの名無しさん
19/05/11 17:31:33.00 vfaLavs00.net
実行時のカレントフォルダーが合ってないと思う
804:デフォルトの名無しさん
19/05/11 17:56:52.10 lpN0Lm9o0.net
デバッガでブレイクしてイミディエイトウィンドウとかで
Environment.CurrentDirectory確認すると良いよ
805:デフォルトの名無しさん
19/05/11 18:25:33.06 dxU2Wm5sa.net
>>790
相対パスとかの以前の問題
実際の環境にimgフォルダが作られているか?
*.exeと言った実行ファイルのある場所を見てみたらいい
多分作られてないしその�
806:�にgifファイルも作られてない
807:デフォルトの名無しさん
19/05/11 18:56:38.28 VR7g318H0.net
>>790
>>794を参考にするべきだけどパスの位置を確認したいのなら読み込む前のところで
MessageBox.Show(System.IO.Path.GetFullPath(@"img\volly.gif"));//指定しようとしているパスを入れる
とでも入れとけばその相対パスがどこを指しているのか絶対パスが表示される
相対パスはソースファイルの位置からじゃなく実行ファイルの位置から作られる
808:デフォルトの名無しさん
19/05/11 19:09:02.07 vfaLavs00.net
>>795
> 相対パスはソースファイルの位置からじゃなく実行ファイルの位置から作られる
これは正しくないよ。その時のカレントフォルダが基準。
何もしていなければ多くの場合は実行ファイルの場所と一致するから、結果としてそうなることが多いけど。
809:デフォルトの名無しさん
19/05/11 19:52:49.57 VR7g318H0.net
>>796
それならexeと同じディレクトリのところから使うには
System.IO.Path.GetDirectoryName(Application.ExecutablePath)とか使って必ず絶対パスに直さないと危ないってことか
810:デフォルトの名無しさん
19/05/12 10:29:51.59 zQc98Y8H0.net
Console.WriteLine(System.Environment.CurrentDirectory);
としても出力には何も出てこないのですか?
出てこないです
作業フォルダっていうのはform1.csとは別のファイルのことなんですね
811:デフォルトの名無しさん
19/05/12 10:48:00.86 NzWVi3Qm0.net
console覗くか
traceあたりに出力しないとでは
812:デフォルトの名無しさん
19/05/12 10:52:27.58 zQc98Y8H0.net
おっ いけました
'2d_engine.exe' (CLR v4.0.30319: 2d_engine.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\mscorlib.resources\v4.0_4.0.0.0_ja_b77a5c561934e089\mscorlib.resources.dll' が読み込まれました。モジュールがシンボルなしでビルドされました。
これで正しいのかわからないですが、なんで実行ファイルがこんな場所にあるんでしょうか。プロジェクト内にあるのかと思ってましたが
813:デフォルトの名無しさん
19/05/12 10:53:02.25 M17KJIhd0.net
>>798
WinFormsアプリはそのままではConsoleを使用できない
Consoleを自分で準備すれば使えるが、通常は使わないかな
フォルダ(≒ディレクトリ)とファイルは違うぞ
814:デフォルトの名無しさん
19/05/12 11:02:52.23 NzWVi3Qm0.net
謎は解けた
815:デフォルトの名無しさん
19/05/12 11:03:02.94 PIRDu/CH0.net
>>800
その絶対パスは実行ファイルじゃない
その表示されているところにConsole.WriteLineで書き込んだ内容出てくるはず
816:デフォルトの名無しさん
19/05/12 11:04:19.53 JwWGS0EoM.net
空のコンソールアプリ作ってそこで実行して
817:デフォルトの名無しさん
19/05/12 11:06:21.31 JwWGS0EoM.net
そのgifファイルは実行ファイルが作られた場所に自動でコピーされてないので
コピーされるようにgifファイルの設定帰るしかない
818:デフォルトの名無しさん
19/05/12 11:08:55.17 M17KJIhd0.net
>>800
勘違いしてる。Console使わず、
MessageBox.Show( System.Environment.CurrentDirectory );
ってやってみてよ。
819:デフォルトの名無しさん
19/05/12 11:35:01.56 1UlYWsgm0.net
>>800
カレントディレクトリはexeのあるディレクトリとは別物だからです
System.AppDomain.CurrentDomain.BaseDirectory
を使ってください
820:デフォルトの名無しさん
19/05/12 11:42:27.50 Zs5BDDrj0.net
AllocConsole() してみなされ
821:デフォルトの名無しさん
19/05/12 11:46:33.54 7nn+3/Jt0.net
>>800
プログラムの実行ファイルがある場所とは別に、プログラムの実行時に「どのフォルダでプログラムを実行するか」という概念があるのは分かる?
822:デフォルトの名無しさん
19/05/12 11:49:29.62 PIRDu/CH0.net
先生多すぎて混乱してそうw
823:デフォルトの名無しさん
19/05/12 13:55:38.46 zQc98Y8H0.net
混乱してるんで一度整理します
824:デフォルトの名無しさん
19/05/12 14:13:47.11 PIRDu/CH0.net
そもそもカレントディレクトリを表示させる必要があるのか?
画像をPictureBoxに表示するのが目的じゃなかったのか
825:デフォルトの名無しさん
19/05/12 15:18:28.27 zQc98Y8H0.net
そうなんですが、そのために相対パスを設定したいんです
絶対パスでも別に不自由しないですが、ソフトを作るときは相対パスも使う�
826:ニ思うので
827:デフォルトの名無しさん
19/05/12 15:40:46.00 Q+XtJRAz0.net
>>790
VisualStudioでF5実行やデバッグをすると(何も設定を変えてなければ)ビルド出力先がカレントディレクトリになる
相対パスでエラーになる原因はビルド出力先にimg\volly.gifが存在しないから
なのでimg\volly.gifをビルド出力先にコピーしてやれば相対パスで読み込めるようになる
プロジェクトエクスプローラーでimg\volly.gifを右クリックしてプロパティを開いて
「ビルド時のアクション」を「なし」に変更
「出力ディレクトリにコピー」を「新しい場合はコピーする」に変更
これでビルドすると出力先フォルダにimg\volly.gifがコピーされるようになる
828:デフォルトの名無しさん
19/05/12 15:41:40.00 CayLEbz10.net
>>813
実は業務ではカレントディレクトリをあてにした動作はさせない
なぜなら制御できないから
なので相対パスをプログラムで取得したら
自分が基準とするディレクトリパスと自力で連結させて絶対パスにして使う
829:デフォルトの名無しさん
19/05/12 15:43:12.88 Q+XtJRAz0.net
画像ファイルがたくさんあって1こ1こ設定するのがめんどくさい場合は
imgフォルダを右クリックして同じようにコピーの設定をする
そうすれば1つの設定でフォルダごとまるごとコピーしてくれる
830:デフォルトの名無しさん
19/05/12 15:54:06.76 0iYfvooEa.net
まあ、そもそも特に理由がなければ画像ファイルはリソースに突っ込むべきだね。
どうしても生の画像ファイルを使いたいならソリューションエクスプローラーからプロジェクトに追加して
プロパティウィンドウの「出力ディレクトリにコピー」の値を「常にコピーする」にすれば
ビルトすると自動的に実行ファイルと同じディレクトリにコピーされるようになる。
ディレクトリの階層を作りたいならソリューションエクスプローラ上で階層を作れば
それがそのまま反映されてコピーされる。
実行ファイルのディレクトリはこれで
URLリンク(docs.microsoft.com)