ふらっと C#,C♯,C#(初心者用) Part142at TECH
ふらっと C#,C♯,C#(初心者用) Part142 - 暇つぶし2ch358: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時に済ませるだろうし
デストラクタにわざわざ処理を書いて、しかもその処理が例外を引き起こすパターンって
具体的にどんなのがありうるんだ?

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)に値を書き込んでから最後に単一スレッドでマージするのが定番


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch