!extend:checked:vvvvv:1000:512
次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為)
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください
>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。
■関連スレ
C#, C♯, C#相談室 Part93
http://mevius.5ch.net/test/read.cgi/tech/1492818720/
■前スレ
ふらっと C#,C♯,C#(初心者用) Part141
http://mevius.5ch.net/test/read.cgi/tech/1544839627/
■コードを貼る場合は↓を使いましょう。
http://ideone.com/
https://dotnetfiddle.net/
■情報源
https://docs.microsoft.com/ja-jp/dotnet/standard/class-libraries
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index
https://docs.microsoft.com/en-us/dotnet/standard/class-libraries
http://referencesource.microsoft.com/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
ふらっと C#,C♯,C#(初心者用) Part142
■ このスレッドは過去ログ倉庫に格納されています
1名無C ◆jPpg5.obl6 (ワッチョイ 762c-FuHz)
2019/03/07(木) 06:35:41.12ID:6L3KEJfe0583デフォルトの名無しさん (アウアウエー Sa13-OsmV)
2019/04/28(日) 19:22:22.23ID:JJw12cyBa リソースのライフタイムの管理とリソースを使用して何かする責務を別の責務として分離したほうがいい
リソースの取得だけを分離する場合はファクトリーパターンが使われる
ただしこの場合はリソースを閉じる責務とリソースを使用する責務が同じクラスに混在してしまう
結果としてデストラクタでの例外といった問題が連鎖して発生する
これに対応するためにはファクトリーアイソレーションパターンを使う
このパターンならリソースのライフタイム管理とリソースの使用を完全に分離できる
コンストラクタでもデストラクタでもリソースの開閉に由来する例外は発生しなくなる
リソースの取得だけを分離する場合はファクトリーパターンが使われる
ただしこの場合はリソースを閉じる責務とリソースを使用する責務が同じクラスに混在してしまう
結果としてデストラクタでの例外といった問題が連鎖して発生する
これに対応するためにはファクトリーアイソレーションパターンを使う
このパターンならリソースのライフタイム管理とリソースの使用を完全に分離できる
コンストラクタでもデストラクタでもリソースの開閉に由来する例外は発生しなくなる
584デフォルトの名無しさん (アウアウウー Sae9-HJzg)
2019/04/28(日) 19:23:12.72ID:KKCCRPTWa デストラクタでたとえば解放忘れの大きなメモリを開放するとしても
その前に他で大きなメモリを確保しようとすると死ぬ
デストラクタでファイルのクローズ忘れをクローズしようとしても
その前に他でファイルを開こうとするとエラーになる
デストラクタでいろいろ開放しても何も助けてない
役に立ったとしても偶然であって実質はバグを握りつぶしてるだけ
その前に他で大きなメモリを確保しようとすると死ぬ
デストラクタでファイルのクローズ忘れをクローズしようとしても
その前に他でファイルを開こうとするとエラーになる
デストラクタでいろいろ開放しても何も助けてない
役に立ったとしても偶然であって実質はバグを握りつぶしてるだけ
585デフォルトの名無しさん (アウアウウー Sae9-HJzg)
2019/04/28(日) 19:25:35.89ID:KKCCRPTWa586デフォルトの名無しさん (アウアウエー Sa13-7ni7)
2019/04/28(日) 19:26:43.51ID:kMBz0MBMa >>580
関係あるからw
同じことをくどくど書くのは嫌いだが、デストラクタの存在理由は
コードの利用者がClose/Disposeを呼び忘れる、というヒューマンエラーに対するフェイルセーフ。
これは議論の余地はないよ
関係あるからw
同じことをくどくど書くのは嫌いだが、デストラクタの存在理由は
コードの利用者がClose/Disposeを呼び忘れる、というヒューマンエラーに対するフェイルセーフ。
これは議論の余地はないよ
587デフォルトの名無しさん (アウアウウー Sae9-HJzg)
2019/04/28(日) 19:26:58.59ID:KKCCRPTWa みんなフェイルセーフって言葉を使うけど大体意味間違ってる
588デフォルトの名無しさん (アウアウエー Sa13-mEZ1)
2019/04/28(日) 19:28:16.75ID:uWFo9H7Wa ああ、Dispose呼び出し忘れ対策のデストラクタか
それなら、自分の場合は
・デストラクタには「Dispose(false)」以外書かない(trycatchもしない)
・Dispose()側が例外を投げるかどうかは解放するリソース次第
・デストラクタの中に延々とリソース解放処理なりtry-catchが必要な処理なりを書いてるのだとすれば
そのソースコードは根本的におかしい
それなら、自分の場合は
・デストラクタには「Dispose(false)」以外書かない(trycatchもしない)
・Dispose()側が例外を投げるかどうかは解放するリソース次第
・デストラクタの中に延々とリソース解放処理なりtry-catchが必要な処理なりを書いてるのだとすれば
そのソースコードは根本的におかしい
589デフォルトの名無しさん (アウアウエー Sa13-7ni7)
2019/04/28(日) 19:30:31.27ID:kMBz0MBMa >>585
だから、デストラクタ「で」積極的にClose処理をするんじゃないの。
Close処理は普通にDispose/Closeに書くに決まっているわけだが、
使用者がそれを呼び忘れても最悪GCのお片付けのタイミングで
Close処理が行われるようにするための仕組みがデストラクタ
だから、デストラクタ「で」積極的にClose処理をするんじゃないの。
Close処理は普通にDispose/Closeに書くに決まっているわけだが、
使用者がそれを呼び忘れても最悪GCのお片付けのタイミングで
Close処理が行われるようにするための仕組みがデストラクタ
590デフォルトの名無しさん (アウアウエー Sa13-mEZ1)
2019/04/28(日) 19:32:19.82ID:uWFo9H7Wa ごめんもいっこ
・IDisposableなオブジェクトをDisposeせず使用している時点で実装不備とみなしてよい
(フィールド変数だったらポカミスで解放し忘れはあるかもしれないけど、
少なくともローカル変数ならusingを意図的に使ってない時点でコーダーが悪意を持ってると判断する)
・IDisposableなオブジェクトをDisposeせず使用している時点で実装不備とみなしてよい
(フィールド変数だったらポカミスで解放し忘れはあるかもしれないけど、
少なくともローカル変数ならusingを意図的に使ってない時点でコーダーが悪意を持ってると判断する)
591デフォルトの名無しさん (アウアウウー Sae9-HJzg)
2019/04/28(日) 19:32:33.80ID:KKCCRPTWa592デフォルトの名無しさん (アウアウエー Sa13-OsmV)
2019/04/28(日) 19:35:22.92ID:JJw12cyBa >>590
DIに管理させるからusingもDisposeもしないという構成は非常に多い
DIに管理させるからusingもDisposeもしないという構成は非常に多い
593デフォルトの名無しさん (アウアウウー Sae9-HJzg)
2019/04/28(日) 19:35:29.40ID:KKCCRPTWa 自分の使ってるコードで完結してるのにデストラクタでアンマネージなどのリソースを
開放するのは間違った使い方
いくら自信たっぷりに書いてるのか知らないけど間違ってる
開放するのは間違った使い方
いくら自信たっぷりに書いてるのか知らないけど間違ってる
594デフォルトの名無しさん (アウアウエー Sa13-OsmV)
2019/04/28(日) 19:44:53.23ID:JJw12cyBa595デフォルトの名無しさん (ワッチョイ 2301-4ufv)
2019/04/28(日) 19:47:01.57ID:Cfig35XD0 >>582
そんなレスしかできないなら黙ってろよw
そんなレスしかできないなら黙ってろよw
596デフォルトの名無しさん (アウアウウー Sae9-HJzg)
2019/04/28(日) 19:50:07.37ID:KKCCRPTWa >>594
IDisposable無視して放置する人を野放しにしないためにもデストラクタは不要だと思うわ
デストラクタが呼ばれたか呼ばれないかで意図しないタイミングで不具合が出たりでなかったりするだけだろ
そんなの余計に邪魔だろ
IDisposable無視して放置する人を野放しにしないためにもデストラクタは不要だと思うわ
デストラクタが呼ばれたか呼ばれないかで意図しないタイミングで不具合が出たりでなかったりするだけだろ
そんなの余計に邪魔だろ
597デフォルトの名無しさん (アウアウエー Sa13-mEZ1)
2019/04/28(日) 19:50:40.18ID:uWFo9H7Wa さすがに自前で生成してない(解放しなくていい)オブジェクトはわざわざ解放しないよ
んーと、デストラクタを書かないといけないような処理があるならDispose(false)だけ書く、んだけど
なにか間違ったこと言ったかな
んーと、デストラクタを書かないといけないような処理があるならDispose(false)だけ書く、んだけど
なにか間違ったこと言ったかな
598デフォルトの名無しさん (ワッチョイ 2301-4ufv)
2019/04/28(日) 19:53:00.38ID:Cfig35XD0599デフォルトの名無しさん (アウアウエー Sa13-mEZ1)
2019/04/28(日) 19:54:05.58ID:uWFo9H7Wa 書く必要がないデストラクタなら書かずに済ませるというのは同意
というか普段アンマネージドリソースなんて滅多にさわらないし
まともにデストラクタを書いたのはいったい何年前だろう
というか普段アンマネージドリソースなんて滅多にさわらないし
まともにデストラクタを書いたのはいったい何年前だろう
600デフォルトの名無しさん (アウアウウー Sae9-HJzg)
2019/04/28(日) 20:00:46.55ID:KKCCRPTWa601デフォルトの名無しさん (アウアウクー MM81-K6Yl)
2019/04/28(日) 20:04:36.28ID:PHvM++pOM602デフォルトの名無しさん (アウアウエー Sa13-OsmV)
2019/04/28(日) 20:21:04.08ID:JJw12cyBa 解放忘れを本気で潰そうと思ったらさっき書いたようにファクトリーアイソレーションパターンを使う
Task ExecuteAsync(Func<ISomeResource, Task> job) {
using (var resource = new SomeResource()) {
await resource.OpenAsync();
await job?.Invoke(resource);
await resource.CloseAsync();
}
}
サービス利用者には生成も解放もインターフェースを提供しない
ExecuteAsyncを通さないとリソースにアクセスできないようにすれば解放忘れを完全に予防できる
Task ExecuteAsync(Func<ISomeResource, Task> job) {
using (var resource = new SomeResource()) {
await resource.OpenAsync();
await job?.Invoke(resource);
await resource.CloseAsync();
}
}
サービス利用者には生成も解放もインターフェースを提供しない
ExecuteAsyncを通さないとリソースにアクセスできないようにすれば解放忘れを完全に予防できる
603デフォルトの名無しさん (アウアウエー Sa13-7ni7)
2019/04/28(日) 20:28:37.93ID:kMBz0MBMa604デフォルトの名無しさん (ブーイモ MMa9-HJzg)
2019/04/28(日) 20:33:15.98ID:3t4t6vYZM605デフォルトの名無しさん (アウアウエー Sa13-7ni7)
2019/04/28(日) 20:37:42.11ID:kMBz0MBMa606デフォルトの名無しさん (ブーイモ MMa9-HJzg)
2019/04/28(日) 20:39:59.68ID:3t4t6vYZM バカチョンは意味が違う
607デフォルトの名無しさん (ブーイモ MMa9-HJzg)
2019/04/28(日) 20:42:39.60ID:3t4t6vYZM バカヨケ 失敗しないような仕組み
バカチョン 誰でも使える
バカチョン 誰でも使える
608デフォルトの名無しさん (ワッチョイ 2342-KxX0)
2019/04/28(日) 21:44:36.92ID:nV7r0mI50 >>592
コンテナdisposeしたら、ついでに中身も自動でやってほしいよな・・・
コンテナdisposeしたら、ついでに中身も自動でやってほしいよな・・・
609デフォルトの名無しさん (ワッチョイ 252d-t87J)
2019/04/29(月) 12:55:34.62ID:pjV/Nimc0 横からすまんがさあ
DIにMicrosoft.Extensions.DependencyInjection使ってるんだけど、これってコンテナから生成されたオブジェクトって永遠と生き続けるの?
どうやって開放するん?
DIにMicrosoft.Extensions.DependencyInjection使ってるんだけど、これってコンテナから生成されたオブジェクトって永遠と生き続けるの?
どうやって開放するん?
610デフォルトの名無しさん (ワッチョイ 23ad-O4pN)
2019/04/29(月) 13:05:11.30ID:ehYnqzb50 >>609
Scopeでググれ
Scopeでググれ
611デフォルトの名無しさん (アウアウエー Sa13-OsmV)
2019/04/29(月) 13:39:51.85ID:NUp+Ex1Ma 基本的に生成元になったスコープをDisposeするとスコープ管理下のオブジェクトがまとめて消える
スコープはCreateScopeで再帰的に生成できる
BuildServiceProviderで作ったプロバイダーはルートのスコープに生えてるプロバイダーと考えればいい
アッドシングルトンで登録したやつは親子関係にある全てのスコープで1つしか作れずルートスコープと寿命が同期
アッドスコープドで登録したやつは各スコープ内で1つしか作れず作ったスコープと寿命が同期
アッドトランジエントで登録したやつはスコープ内で何個でも作れて作ったスコープと寿命が同期
ASP.NET Coreでは暗黙的に1つのリクエストに1つのスコープを割り当てる
訂正あったらヨロ
スコープはCreateScopeで再帰的に生成できる
BuildServiceProviderで作ったプロバイダーはルートのスコープに生えてるプロバイダーと考えればいい
アッドシングルトンで登録したやつは親子関係にある全てのスコープで1つしか作れずルートスコープと寿命が同期
アッドスコープドで登録したやつは各スコープ内で1つしか作れず作ったスコープと寿命が同期
アッドトランジエントで登録したやつはスコープ内で何個でも作れて作ったスコープと寿命が同期
ASP.NET Coreでは暗黙的に1つのリクエストに1つのスコープを割り当てる
訂正あったらヨロ
612デフォルトの名無しさん (ワッチョイ 252d-t87J)
2019/04/29(月) 13:43:03.33ID:pjV/Nimc0 Scope = Asp.net用みたいな気になっていて全然知らなかったよ、ありがとう
ただDIなしの場合にusing句で書けるようなのはDIありでも簡単にかけそうだけど、オブジェクトを扱う箇所が数箇所に分かれてるときは難しそう・・・・
ScopeをDIコンテナに突っ込んだら突っ込んだでまた問題が増えるのかな・・・・
ただDIなしの場合にusing句で書けるようなのはDIありでも簡単にかけそうだけど、オブジェクトを扱う箇所が数箇所に分かれてるときは難しそう・・・・
ScopeをDIコンテナに突っ込んだら突っ込んだでまた問題が増えるのかな・・・・
613デフォルトの名無しさん (ワッチョイ 8dda-KxX0)
2019/04/30(火) 20:23:22.69ID:IHLGrYrL0 System.Globalization.JapaneseCalendarでeraを取得しているんだけど
Rが入ってこない・・・
Windows10でWindowsUpdateも最新なんだけど、何で入ってこないんでしょう
Rが入ってこない・・・
Windows10でWindowsUpdateも最新なんだけど、何で入ってこないんでしょう
614デフォルトの名無しさん (アウアウエー Sa13-jWJP)
2019/04/30(火) 20:28:08.43ID:w+F7NKD3a >>613
https://docs.microsoft.com/en-us/windows/uwp/design/globalizing/japanese-era-change
> 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以降にする必要があるらしい
https://docs.microsoft.com/en-us/windows/uwp/design/globalizing/japanese-era-change
> 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以降にする必要があるらしい
615デフォルトの名無しさん (ワッチョイ 4b2c-t8aL)
2019/04/30(火) 20:38:50.44ID:LbZ9KfXX0 まずまだアップデートはオプション段階だが、KB4493443入れてる?
正式なWindowsアップデートは5月以降だよ
正式なWindowsアップデートは5月以降だよ
616デフォルトの名無しさん (ワッチョイ 5d6f-KxX0)
2019/04/30(火) 20:45:03.73ID:YvhWBPAF0 KB4493443って、Windows8.1用だったような。
ちなみに、Windows10, version1809用は「近日公開予定」だそうで。
https://support.microsoft.com/ja-jp/help/4469068/summary-of-new-japanese-era-updates-kb4469068
ちなみに、Windows10, version1809用は「近日公開予定」だそうで。
https://support.microsoft.com/ja-jp/help/4469068/summary-of-new-japanese-era-updates-kb4469068
617デフォルトの名無しさん (アウアウエー Sa13-7ni7)
2019/04/30(火) 21:35:51.80ID:u6t/T7mma もう元号とかやめて欲しいよねほんとw
いい加減役所も西暦に一本化しろよ
いい加減役所も西暦に一本化しろよ
618デフォルトの名無しさん (アウアウエー Sa13-OsmV)
2019/04/30(火) 21:36:53.61ID:TyGEr2d8a 統一したら雑務が減っちゃうだろ
619デフォルトの名無しさん (ワッチョイ 4b2c-t8aL)
2019/04/30(火) 22:02:27.50ID:LbZ9KfXX0 >>616
訂正ありがと 手元にあるのが8.1で全部おんなじかと
訂正ありがと 手元にあるのが8.1で全部おんなじかと
620デフォルトの名無しさん (ワッチョイ 8dda-KxX0)
2019/05/01(水) 06:30:43.85ID:+0nnIASf0 皆さんレスどうもです
まだ対応待ちってことですね・・・
とりあえずいまはテスト用にレジストリいじれるしかなさそうですね
まだ対応待ちってことですね・・・
とりあえずいまはテスト用にレジストリいじれるしかなさそうですね
621デフォルトの名無しさん (ワッチョイ 252d-t87J)
2019/05/01(水) 14:39:10.04ID:NTU1YIA40 インデクサーってpublic T this[int I]{}みたいに定義するらしいけどさあ
ここに出てくるthisの部分って、this以外も入りうる余地ってあるの?
ここに出てくるthisの部分って、this以外も入りうる余地ってあるの?
622デフォルトの名無しさん (ワッチョイ 2d5f-KI0z)
2019/05/01(水) 14:49:13.86ID:lxO04VNX0623デフォルトの名無しさん (アウアウエー Sa13-jWJP)
2019/05/01(水) 14:51:52.86ID:U25K78xGa >>621
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/classes#indexers
> indexer_declarator
> : type 'this' '[' formal_parameter_list ']'
> | type interface_type '.' 'this' '[' formal_parameter_list ']'
> ;
入るのはthisだけで、this以外が入る余地はない
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/classes#indexers
> indexer_declarator
> : type 'this' '[' formal_parameter_list ']'
> | type interface_type '.' 'this' '[' formal_parameter_list ']'
> ;
入るのはthisだけで、this以外が入る余地はない
624デフォルトの名無しさん (ワッチョイ 252d-t87J)
2019/05/01(水) 15:04:58.50ID:NTU1YIA40 ありがとう
無いものについてパッとわかるとか驚くぜ
無いものについてパッとわかるとか驚くぜ
625デフォルトの名無しさん (ワッチョイ 67da-RYFy)
2019/05/02(木) 05:11:25.37ID:fWQ7EMkU0 メモ
https://www.enterprisedb.com/download-postgresql-binaries
https://www.devart.com/odbc/postgresql/
https://visualstudio.microsoft.com/ja/thank-you-downloading-visual-studio/?sku=Community&rel=16
https://www.nuget.org/packages/MySql.Data/
https://www.nuget.org/packages/Npgsql/
https://www.nuget.org/packages/dotConnect.Express.for.PostgreSQL/
https://www.nuget.org/packages/Microsoft.Office.Interop.Excel/
https://www.pgadmin.org/download/pgadmin-4-windows/
https://dev.mysql.com/downloads/
https://www.enterprisedb.com/download-postgresql-binaries
https://www.devart.com/odbc/postgresql/
https://visualstudio.microsoft.com/ja/thank-you-downloading-visual-studio/?sku=Community&rel=16
https://www.nuget.org/packages/MySql.Data/
https://www.nuget.org/packages/Npgsql/
https://www.nuget.org/packages/dotConnect.Express.for.PostgreSQL/
https://www.nuget.org/packages/Microsoft.Office.Interop.Excel/
https://www.pgadmin.org/download/pgadmin-4-windows/
https://dev.mysql.com/downloads/
626デフォルトの名無しさん (ワッチョイ 6763-7dwh)
2019/05/02(木) 06:26:48.77ID:qeQLZJi00 そういうのはQiitaでやれ(Qiita警察激怒)
627デフォルトの名無しさん (ワッチョイ 6763-xbwF)
2019/05/02(木) 12:04:50.67ID:ir+Ne9RR0 メモ系ツールなんて山ほどあるのにわざわざこんなところに書くのか
俺こんなの調べてんだぜすごいだろ?みたいな承認欲求なのかね?
俺こんなの調べてんだぜすごいだろ?みたいな承認欲求なのかね?
628デフォルトの名無しさん (ワッチョイ ce4a-S1/C)
2019/05/02(木) 19:31:55.56ID:Plm8DXbx0 初心者ですが、乱数系列の初期化(Randomクラスのオブジェクトの生成)は
どこに書くのが正解なんでしょうか?
関数の中に書くと、関数が呼び出されるたびに初期化されるんじゃ?と思えるのでちょっと拙い
関数の外側にプログラムの初めの辺に書いておけばいいのかなあ?とも思うのですが、それもカッコ悪い
どこに書くのが正解なんでしょうか?
関数の中に書くと、関数が呼び出されるたびに初期化されるんじゃ?と思えるのでちょっと拙い
関数の外側にプログラムの初めの辺に書いておけばいいのかなあ?とも思うのですが、それもカッコ悪い
629デフォルトの名無しさん (アウアウエー Sa3a-kXAv)
2019/05/02(木) 19:36:11.39ID:rtZHUO2Da >>628
依存性として注入するのが定石
依存性として注入するのが定石
630デフォルトの名無しさん (ワッチョイ ce4a-S1/C)
2019/05/02(木) 20:19:04.27ID:Plm8DXbx0 依存性 注入で検索したらいろいろ出てきたので調べてみます
631デフォルトの名無しさん (ワッチョイ cb02-Xm0a)
2019/05/03(金) 03:27:08.36ID:eVcW5sZJ0632デフォルトの名無しさん (ワッチョイ 9b61-oppc)
2019/05/03(金) 03:31:56.40ID:t597qxt20633デフォルトの名無しさん (アウアウエー Sa3a-3WjD)
2019/05/03(金) 12:41:41.06ID:Xwdpydd1a >>628
訳分からん解答が続いてるけど、素直に
インスタンス固有である必要があるならコンストラクタに
staticでよいなら静的コンストラクタに
書けばいいだけ。かっこ悪いとか、くだらないことに悩むのは時間の無駄。
この場合は不要だと思うけど、静的コンストラクタが実行されるのはそのクラスの
静的メンバーに初めてアクセスされたタイミングだと思ったので、その点は場合によっては注意
訳分からん解答が続いてるけど、素直に
インスタンス固有である必要があるならコンストラクタに
staticでよいなら静的コンストラクタに
書けばいいだけ。かっこ悪いとか、くだらないことに悩むのは時間の無駄。
この場合は不要だと思うけど、静的コンストラクタが実行されるのはそのクラスの
静的メンバーに初めてアクセスされたタイミングだと思ったので、その点は場合によっては注意
634デフォルトの名無しさん (アウアウエー Sa3a-kXAv)
2019/05/03(金) 12:51:40.57ID:JARezKaea635デフォルトの名無しさん (ドコグロ MM7a-jhVB)
2019/05/03(金) 13:16:48.56ID:JqDPcuspM private staticなら単体テストには支障ないだろ
厳密な再現性を求めるなら本来はシードを固定するべきだが
厳密な再現性を求めるなら本来はシードを固定するべきだが
636デフォルトの名無しさん (アウアウエー Sa3a-3WjD)
2019/05/03(金) 13:23:25.74ID:Xwdpydd1a どっからテストとか出てくるんだw
意味が分からん
意味が分からん
637デフォルトの名無しさん (ドコグロ MM7a-oppc)
2019/05/03(金) 13:28:31.30ID:5Dkgrzu1M638デフォルトの名無しさん (ドコグロ MM2b-jhVB)
2019/05/03(金) 13:39:56.17ID:ffSbfxo8M >>636
staticだとコンストラクタで実装を差し替えられないから単体テストの邪魔になりやすいというのは一般論としてはある
Randomを差し替える必要があるケースは極めて稀だが、上で述べたように厳密な再現性が求められるケースならありえなくもない
staticだとコンストラクタで実装を差し替えられないから単体テストの邪魔になりやすいというのは一般論としてはある
Randomを差し替える必要があるケースは極めて稀だが、上で述べたように厳密な再現性が求められるケースならありえなくもない
639デフォルトの名無しさん (アウアウエー Sa3a-kXAv)
2019/05/03(金) 13:45:36.92ID:JARezKaea640デフォルトの名無しさん (ワッチョイ f72d-/hjB)
2019/05/03(金) 13:57:48.60ID:Zy40eisO0641デフォルトの名無しさん (ドコグロ MM7a-jhVB)
2019/05/03(金) 14:05:21.52ID:N/aYDMHoM >>640
例えばガチャを作ってるとして、0-999の乱数で0-9が出たらSSRを排出する仕様なら、
0と9と10くらいを決め打ちでテストしたくなるだろ?
まあそのために乱数生成器をモックしなきゃいけないような設計には再考の余地があると思うが、状況としては普通にありえるだろう
例えばガチャを作ってるとして、0-999の乱数で0-9が出たらSSRを排出する仕様なら、
0と9と10くらいを決め打ちでテストしたくなるだろ?
まあそのために乱数生成器をモックしなきゃいけないような設計には再考の余地があると思うが、状況としては普通にありえるだろう
642デフォルトの名無しさん (ワンミングク MM92-sito)
2019/05/03(金) 14:07:16.80ID:roEz64M2M あなるあなる肛門肛門
643デフォルトの名無しさん (ワンミングク MM92-sito)
2019/05/03(金) 14:07:36.88ID:roEz64M2M すまん誤爆でした!!!
644デフォルトの名無しさん (アウアウエー Sa3a-3WjD)
2019/05/03(金) 14:09:46.15ID:Xwdpydd1a だから質問者はそんなこと聞いてないって...
どんだけ独りよがりの妄想展開するんだよ
どんだけ独りよがりの妄想展開するんだよ
645デフォルトの名無しさん (ワンミングク MM92-sito)
2019/05/03(金) 14:11:43.11ID:roEz64M2M >>644
うるせーばか子ね
うるせーばか子ね
646デフォルトの名無しさん (アウアウエー Sa3a-kXAv)
2019/05/03(金) 14:16:40.44ID:JARezKaea 現在時刻とか乱数みたいな制御しにくい値はインジェクションする
これ常識な
勉強になったねきみたち
これ常識な
勉強になったねきみたち
647デフォルトの名無しさん (ワッチョイ 9b61-oppc)
2019/05/03(金) 14:47:40.00ID:3MJf1YjB0648デフォルトの名無しさん (ワッチョイ 8252-M0pk)
2019/05/03(金) 15:12:05.72ID:uS7vqCXY0649デフォルトの名無しさん (アウアウエー Sa3a-kXAv)
2019/05/03(金) 15:31:58.12ID:JARezKaea >>648
それはアマチュアの考え方
それはアマチュアの考え方
650デフォルトの名無しさん (ワッチョイ 0b17-ahOC)
2019/05/03(金) 15:33:51.16ID:wCLW0/2P0 >>649
スレタイ読め
スレタイ読め
651デフォルトの名無しさん (スカファーイ FA9e-sito)
2019/05/03(金) 15:38:42.54ID:q0Uiy+aiA どーでもええわ
652デフォルトの名無しさん (ワッチョイ 6240-51S+)
2019/05/03(金) 15:58:52.41ID:Ue5NRrHW0 教えてください。
以下のコードで、x の定義は問題ないのに y の定義だけコンパイルエラーになってしまいます。
==
const Exception e = null;
const bool x = e == null; // エラーなし、true が設定される。
const Type t = null;
const bool y = t == null; // CS0133 y' に割り当てられた式は定数でなければなりません。
==
何が原因でこのような違いがでるのでしょうか。
また、y を定数のままエラーが出ないように修正することは可能でしょうか。
よろしくお願いいたします。
以下のコードで、x の定義は問題ないのに y の定義だけコンパイルエラーになってしまいます。
==
const Exception e = null;
const bool x = e == null; // エラーなし、true が設定される。
const Type t = null;
const bool y = t == null; // CS0133 y' に割り当てられた式は定数でなければなりません。
==
何が原因でこのような違いがでるのでしょうか。
また、y を定数のままエラーが出ないように修正することは可能でしょうか。
よろしくお願いいたします。
653デフォルトの名無しさん (ワッチョイ 9b61-oppc)
2019/05/03(金) 16:01:49.32ID:3MJf1YjB0 >>652
結果によってtrueやfalseになるようなんは定数と呼ばん
結果によってtrueやfalseになるようなんは定数と呼ばん
654デフォルトの名無しさん (アウアウエー Sa3a-3WjD)
2019/05/03(金) 17:46:27.38ID:Xwdpydd1a655デフォルトの名無しさん (アウアウエー Sa3a-3WjD)
2019/05/03(金) 17:53:37.68ID:Xwdpydd1a あ、なんか例外とか意味不明なこと書いてるけど突っ込まないでねw
656デフォルトの名無しさん (ワッチョイ 9b61-oppc)
2019/05/03(金) 18:53:11.77ID:78NC+NUs0657デフォルトの名無しさん (アウアウエー Sa3a-3WjD)
2019/05/03(金) 19:21:25.35ID:Xwdpydd1a 言語仕様の「定数式」の項を見れば別に不思議はないんだけど、
他人の書いたコードでこういう式を見たら一瞬「何の意図でこんな式を書いてるんだ?」
と思っちゃうね。
他人の書いたコードでこういう式を見たら一瞬「何の意図でこんな式を書いてるんだ?」
と思っちゃうね。
658デフォルトの名無しさん (ワッチョイ 6240-51S+)
2019/05/03(金) 20:24:56.25ID:Ue5NRrHW0 >>653
レスありがとうございます。
定数のまま、というのは const を付けたまま、という意味のつもりだったのですが、
表現が不適切だったかもしれません。失礼いたしました。
>>654
ありがとうございます!うまくいきました。
ちなみにいろいろ試してみると、
string は == が定義されているもののエラーが出ないようです。
さすがに string は特別ということのようですね。
(ただ、typeof(string).IsPrimitive は false にだったりして
いまいちしっくりきませんが。。。)
==
const string s = null;
const bool z = s == null; // エラーなし、true が設定される。
==
何にせよ、問題はすっきり解消いたしました。
適切なアドバイスどうもありがとうございました。
レスありがとうございます。
定数のまま、というのは const を付けたまま、という意味のつもりだったのですが、
表現が不適切だったかもしれません。失礼いたしました。
>>654
ありがとうございます!うまくいきました。
ちなみにいろいろ試してみると、
string は == が定義されているもののエラーが出ないようです。
さすがに string は特別ということのようですね。
(ただ、typeof(string).IsPrimitive は false にだったりして
いまいちしっくりきませんが。。。)
==
const string s = null;
const bool z = s == null; // エラーなし、true が設定される。
==
何にせよ、問題はすっきり解消いたしました。
適切なアドバイスどうもありがとうございました。
659デフォルトの名無しさん (ワッチョイ 6240-51S+)
2019/05/03(金) 20:25:45.58ID:Ue5NRrHW0 >>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 到達できないコードが検出されました
==
実際に 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 到達できないコードが検出されました
==
660デフォルトの名無しさん (アウアウエー Sa3a-3WjD)
2019/05/03(金) 20:54:20.72ID:mscz+0vpa >>659
いやいやいや、俺はおたくにケチつけたわけじゃないよw
const bool y = t == (object)null;
こういうのはぱっと見て意図が分からないと言っただけ。
むしろ「マジックナンバー」を避けるのは良い習慣ですよ
いやいやいや、俺はおたくにケチつけたわけじゃないよw
const bool y = t == (object)null;
こういうのはぱっと見て意図が分からないと言っただけ。
むしろ「マジックナンバー」を避けるのは良い習慣ですよ
661デフォルトの名無しさん (アウアウエー Sa3a-3WjD)
2019/05/03(金) 20:57:46.12ID:mscz+0vpa >>658
>string は == が定義されているもののエラーが出ないようです。
上にも書いたけど、その辺のモヤモヤはC#の言語仕様の「定数式」の箇所を見れば解消するよ。
VSのインストールフォルダに入ってる
>string は == が定義されているもののエラーが出ないようです。
上にも書いたけど、その辺のモヤモヤはC#の言語仕様の「定数式」の箇所を見れば解消するよ。
VSのインストールフォルダに入ってる
662デフォルトの名無しさん (アウアウエー Sa3a-UklA)
2019/05/03(金) 21:13:39.41ID:rGk2iQn5a ひょっとして、ES6あたりの感覚で代入onlyの変数を宣言したくてconstキーワードを使おうとしてるのかなと思ってみたり
readonlyなローカル変数みたいな構文ってC#にはまだないんだよね
readonlyなローカル変数みたいな構文ってC#にはまだないんだよね
663デフォルトの名無しさん (ワッチョイ 6240-51S+)
2019/05/03(金) 22:02:39.62ID:Ue5NRrHW0 >>660
> const bool y = t == (object)null;
> こういうのはぱっと見て意図が分からない
そうですねw
式の意味を考えるなら t == (object)null は
ReferenceEquals(t, null) と書くのがわかりやすいんでしょうけど
const うんぬんの話の中でこれはダメですし。
ちなみに今ふと思いついて試してみたんですが、
t is null も == の定義には依存しないものの定数扱いにはならないようです。
>>661
ありがとうございます。
言われてみると、そもそも C# と CLR の役割自体が正確に区別できていないような
気がしてきたので、これを機会に勉強してみようと思います。
> const bool y = t == (object)null;
> こういうのはぱっと見て意図が分からない
そうですねw
式の意味を考えるなら t == (object)null は
ReferenceEquals(t, null) と書くのがわかりやすいんでしょうけど
const うんぬんの話の中でこれはダメですし。
ちなみに今ふと思いついて試してみたんですが、
t is null も == の定義には依存しないものの定数扱いにはならないようです。
>>661
ありがとうございます。
言われてみると、そもそも C# と CLR の役割自体が正確に区別できていないような
気がしてきたので、これを機会に勉強してみようと思います。
664デフォルトの名無しさん (ワッチョイ 6240-51S+)
2019/05/03(金) 22:03:15.73ID:Ue5NRrHW0 >>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);
}
==
質問させていただいたのは、
>>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);
}
==
665デフォルトの名無しさん (ワッチョイ 6240-51S+)
2019/05/03(金) 22:05:09.07ID:Ue5NRrHW0 何度もすみません。。。上の妄想コードは間違いです。
正しくはこちら。
==
static class MathEx
{
public const double Square(double x) => x * x;
}
static class MyConstants
{
public const double SquarePI = MathEx.Square(Math.PI);
}
==
正しくはこちら。
==
static class MathEx
{
public const double Square(double x) => x * x;
}
static class MyConstants
{
public const double SquarePI = MathEx.Square(Math.PI);
}
==
666デフォルトの名無しさん (ドコグロ MM02-jhVB)
2019/05/03(金) 22:55:31.79ID:1vSUmwo4M 実質的に定数ならJITコンパイル時に定数に置き換わるからそんなものは要らん
667デフォルトの名無しさん (ワッチョイ 7b38-lZel)
2019/05/03(金) 23:53:26.41ID:BZD1sthA0 decimalの定数は内部的にアレだけどな
668デフォルトの名無しさん (ブーイモ MM93-Mzt1)
2019/05/04(土) 07:03:09.32ID:Y3LpLEUoM >>667
詳しく
詳しく
669デフォルトの名無しさん (アウアウエー Sa3a-cevp)
2019/05/04(土) 13:03:57.01ID:3sktWiiHa670デフォルトの名無しさん (ワッチョイ f72d-/hjB)
2019/05/04(土) 14:32:15.09ID:IHSUUilV0 List.Addって、複数のスレッドから同時に呼び出したらデータが壊れる可能性ってあるの?
671デフォルトの名無しさん (ワッチョイ 06e3-ahOC)
2019/05/04(土) 15:00:48.03ID:NSx1pb1m0 >>670
スレッドセーフじゃないからlock制御を自前で持つか、System.Collections.Concurrentのコレクション使うべき
スレッドセーフじゃないからlock制御を自前で持つか、System.Collections.Concurrentのコレクション使うべき
672デフォルトの名無しさん (ワッチョイ c6da-ahOC)
2019/05/04(土) 15:23:49.46ID:H40F3Pfj0 Queueの出し入れもlock必要だし、マルチスレッドはめんどいよな。
なんでConcurrentDictionaryはあるのにListは無いのか
なんでConcurrentDictionaryはあるのにListは無いのか
673デフォルトの名無しさん (アウアウエー Sa3a-kXAv)
2019/05/04(土) 15:37:29.51ID:uz0VN5nda >>672
使い道がない
使い道がない
674デフォルトの名無しさん (ドコグロ MM7a-oppc)
2019/05/04(土) 15:38:02.55ID:vy21Hr2ZM 個人的にはスレッド自体に特定のスレッドからのデータを受け取る処理がある方が好き
675デフォルトの名無しさん (ドコグロ MM7a-jhVB)
2019/05/04(土) 15:57:05.65ID:qIB0qWQDM 別々のスレッドから生成された値を集めたいなら、
各スレッドで別のバッファ(List)に値を書き込んでから最後に単一スレッドでマージするのが定番
各スレッドで別のバッファ(List)に値を書き込んでから最後に単一スレッドでマージするのが定番
676デフォルトの名無しさん (ワッチョイ 9b61-oppc)
2019/05/04(土) 17:20:59.03ID:pMssk1qR0 スレッドセーフって実はどういう動作するのかよく知らないぜ
677デフォルトの名無しさん (ワッチョイ 06f2-ahOC)
2019/05/04(土) 17:27:01.27ID:0zm1CIpf0678デフォルトの名無しさん (ワッチョイ 9b61-oppc)
2019/05/04(土) 20:18:11.93ID:pMssk1qR0 APIのマニュアルにおいて「スレッドセーフ」という言葉が用いられる場合、たいていは「複数のスレッドからアクセスされても例外を出さない、プログラムがクラッシュしない」というような意味です。
しかしプログラムの目的によっては、例外が出ないだけでは不適切です。
例えば対象が、100個のデータを管理する変数だとします。
その100個のデータに対して、1つ目から順に処理するスレッドと、50個目から変更するスレッドが同時に動いたらどうなるでしょうか? 結果は不定です。
この例では、排他処理 (C#なら lock ステートメントなど) と呼ばれる処置が必要になります。
ってググって出たサイトで拾った
しかしプログラムの目的によっては、例外が出ないだけでは不適切です。
例えば対象が、100個のデータを管理する変数だとします。
その100個のデータに対して、1つ目から順に処理するスレッドと、50個目から変更するスレッドが同時に動いたらどうなるでしょうか? 結果は不定です。
この例では、排他処理 (C#なら lock ステートメントなど) と呼ばれる処置が必要になります。
ってググって出たサイトで拾った
679デフォルトの名無しさん (ワッチョイ 9b61-oppc)
2019/05/04(土) 20:25:20.65ID:pMssk1qR0 つまり
for(int i=0;i<lst.count;i++)
{
unk un=lst[i];
略
}
みたいなプログラムを組んだとき
どっかでいきなり要素をゼロにされて死ぬってことは
スレッドセーフだろうがどうだろうが可能性はあるってことだよね
ってことを考えるとスレッドセーフである意味ってあんまりなくて
排他処理は絶対実装しないと駄目だよね?ってこと?
誰か違うと言ってくれ
for(int i=0;i<lst.count;i++)
{
unk un=lst[i];
略
}
みたいなプログラムを組んだとき
どっかでいきなり要素をゼロにされて死ぬってことは
スレッドセーフだろうがどうだろうが可能性はあるってことだよね
ってことを考えるとスレッドセーフである意味ってあんまりなくて
排他処理は絶対実装しないと駄目だよね?ってこと?
誰か違うと言ってくれ
680デフォルトの名無しさん (ブーイモ MM93-R0y6)
2019/05/04(土) 20:59:32.71ID:Ui9BQ5TxM スレッドセーフはメソッド内などで一貫性を保てる作り
排他制御が必要な場面でやってないなど作り手のロジックミスには対応出来るわけがない
排他制御が必要な場面でやってないなど作り手のロジックミスには対応出来るわけがない
681デフォルトの名無しさん (ブーイモ MM93-R0y6)
2019/05/04(土) 21:06:21.08ID:Ui9BQ5TxM スレッドセーフである意味
あるオブジェクトがプロパティAを持っててメソッド内で
b=aaa(A)+bbb(A);
を計算しようとしても複数のスレッドからアクセスされることを考慮されていなければ
最初のAと次のAが違う場合があり計算結果が期待したものにならないかもしれない
スレッドセーフはこういう場合でもちゃんと計算される仕組みを持つ
あるオブジェクトがプロパティAを持っててメソッド内で
b=aaa(A)+bbb(A);
を計算しようとしても複数のスレッドからアクセスされることを考慮されていなければ
最初のAと次のAが違う場合があり計算結果が期待したものにならないかもしれない
スレッドセーフはこういう場合でもちゃんと計算される仕組みを持つ
682デフォルトの名無しさん (アウアウエー Sa3a-cevp)
2019/05/04(土) 21:07:23.59ID:3sktWiiHa >>679
その処理は要素数チェックと要素アクセスが分かれているから、間に他スレッドからの処理が割り込み得る
System.Collections.Concurrent系のコレクションは、
例えば「要素があるなら取得」のようなまとまった処理がatomicになっているので、他スレッドからの割り込まれない(=スレッドセーフ)
どっかのスレッドで詰めて、別のスレッドでループ処理、がやりたいのならBlockingCollectionが楽
その処理は要素数チェックと要素アクセスが分かれているから、間に他スレッドからの処理が割り込み得る
System.Collections.Concurrent系のコレクションは、
例えば「要素があるなら取得」のようなまとまった処理がatomicになっているので、他スレッドからの割り込まれない(=スレッドセーフ)
どっかのスレッドで詰めて、別のスレッドでループ処理、がやりたいのならBlockingCollectionが楽
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- バリ島で男子生徒ら集団万引きか、防犯カメラ映像が拡散 京都の大谷中学・高校が「窃盗行為」謝罪★5 [七波羅探題★]
- 【速報】 米トランプ政権声明 「中国が台湾を奪おうとする、いかなる試みも阻止する」 中国「レッドラインだ」 ★2 [お断り★]
- 元プロ野球選手・堂上隼人(43)を20代女性2人へのわいせつ未遂容疑で8回目の逮捕…これまでの被害者は10代・20代の女性11人に [Anonymous★]
- 「残業キャンセル界隈」若者が増加?「職務放棄」との批判も…“定時退社の権利”どこまで通用するか [七波羅探題★]
- 【高校野球】なぜ『7回制』は反対多数でも止まらないか… 高野連が「全員の命」守るために貫く伝統より改革の姿勢 [冬月記者★]
- 体調不良で番組欠席続く山里亮太「この度は申し訳ございません」 [ひかり★]
- 日帝復活 ソースは高市 [402859164]
- 【高市悲報】中国軍「公海で空母の発着訓練するって事前通告したのになんで自衛隊機は急接近してきたんだ…?」中国軍困惑 [931948549]
- 【高市悲報】自衛隊「実は事前に現場海域で中国軍から空母での発着訓練をすると通告がありました」え…?😨😨 [931948549]
- 【悲報】高市早苗の出国税、日本人も対象にwmwmwwmwmwmwmw [834922174]
- 【高市速報】中国「このままだと日本が先制攻撃してくる」 [583597859]
- ダウンタウン+(月額1,100円)、再生回数100万超え連発wwwwwwwwwwwwwwwwwwww [329329848]
