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

■ このスレッドは過去ログ倉庫に格納されています
2017/11/28(火) 21:30:48.55ID:7U+HR4FY
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。

他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。

内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。

なお、テンプレが読めない回答者は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください

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

■前スレ
ふらっと C#,C♯,C#(初心者用) Part133
http://mevius.5ch.net/test/read.cgi/tech/1510056685/

■関連スレ
C#, C♯, C#相談室 Part95
http://mevius.5ch.net/test/read.cgi/tech/1508180530/

■コードを貼る場合は↓を使いましょう。
http://ideone.com/
https://dotnetfiddle.net/

■情報源https://msdn.microsoft.com/ja-jp/library/gg145045.aspx
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index
https://msdn.microsoft.com/en-us/library/gg145045.aspx
http://referencesource.microsoft.com/
-
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2017/12/16(土) 12:03:55.12ID:8r44i3VV
ないですね
2017/12/16(土) 12:07:33.63ID:EDRAYm5f
>>658
複数のreturnの前の同一処理ならreturnの代わりにgotoでその処理へ飛ばせばいいだろ
2017/12/16(土) 12:08:12.20ID:VgVQwchc
try { return; } finally { } でいいだろ
2017/12/16(土) 12:08:20.45ID:2xEHZCIG
>>658
try, finallyだけもあるけど
2017/12/16(土) 12:14:22.30ID:oPhsj9qx
>>658
finallyだけじゃどこを抜けたらか分からないよ、ちゃんとそれぞれ有ります
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/try-finally
664デフォルトの名無しさん
垢版 |
2017/12/16(土) 12:51:36.41ID:8tD9WB4W
>>663
ああ、出来るじゃない!
今日は気分がいい。さんきゅ
665デフォルトの名無しさん
垢版 |
2017/12/16(土) 16:35:16.86ID:gJhjPx+L
C#初心者の頃(いまもかわらんけど)、一番悩んだのは
インターフェースが分からない。
何がわからないかというと、インタフェースって、自分で一から定義するような
ことが書かれていたが、既存のプログラムで使用しているインタフェースって
何かやってる。
何か定義しないと何もやらないはずなのに・・・・・めちゃ気持ち悪いしわからない。

システムで処理を記述したものも、インターフェースとそのまま呼んでいるから、
わけわからなくてさ〜。
なんだ、処理が記述されているものがあるのねと、理解するのにひと月かかったアホ出した。

まあ今も変わらんんけど。
2017/12/16(土) 16:39:09.26ID:ghluEyaB
設計書も書かないくせに
インターフェース定義するやつがこれまたわからん
馬鹿だろお前
って素で聞いてしまった
2017/12/16(土) 16:42:29.58ID:6gulH/Qw
インターフェースを機械とか現実の何かで例えたらなんですか?
2017/12/16(土) 16:45:05.86ID:ghluEyaB
強いて言えば型
100Vコンセントって型=インターフェース
669デフォルトの名無しさん
垢版 |
2017/12/16(土) 16:53:14.91ID:DOHaPC3l
backgroundWorkerにおいて、ある関数を実行していて
その関数内である条件になった時にbackgroundWorkerを停止したいのですが
何か簡単な方法はないでしょうか?
backgroundWorkerで無限ループで関数を実行していて、関数の中の関数でエラーが発生した時にbackgroundWorkerを緊急停止する様に
プログラムが組みたいのです。
2017/12/16(土) 16:56:31.41ID:ghluEyaB
>>669
今どうなるの?
エラー出ると死んじゃう?
2017/12/16(土) 16:59:30.93ID:Ul/CFAof
>>669
マイクロソフトの方針でできなくなってます
2017/12/16(土) 17:03:29.56ID:ghluEyaB
普通に無限ループ抜ければええんちゃうのん?
673デフォルトの名無しさん
垢版 |
2017/12/16(土) 17:05:51.65ID:DOHaPC3l
backgroundWorker内でAという関数を無限ループ実行していて
Aの中ではB、Cという関数が続けて実行されていて
Bである条件(エラー)になった時、ここで全ての動きを停止したいです。
現在はエラーが発生してそのままBと処理が続いていって死にはしませんが意図しない動きをしている感じです

戻り値と条件分岐で場合分けしていけばいいのかなとも思いましたが関数が大量にあり複雑で何か簡単な手段はないものかとお聞きしてみました
2017/12/16(土) 17:06:41.02ID:na0PR4/Y
>>669
https://dobon.net/vb/dotnet/programing/progressdialogbw.html
CancelAsync()でだめな理由があるの?
関数の中でエラー検出できないとかじゃないよね
675デフォルトの名無しさん
垢版 |
2017/12/16(土) 17:13:01.57ID:DOHaPC3l
>>674
キャンセルボタンは一応ついていまして
Aの実行後にボタンが押されていればCancelAsync()を使っています
AやBの関数中でもCancelAsync()と書いて一発で止められればいいのに…という感じです
2017/12/16(土) 17:14:42.73ID:na0PR4/Y
>>673
通常のスレッドで実行するにしても考え方おかしいと思う
下流で発生したエラーを捕捉できない設計になっています、って言っているのと同じ
C#の問題じゃないんじゃないかな
677デフォルトの名無しさん
垢版 |
2017/12/16(土) 17:19:57.99ID:DOHaPC3l
>>676
そんな気もします…
2017/12/16(土) 17:31:29.65ID:na0PR4/Y
>>677
同じような質問でTaskの場合
https://stackoverflow.com/questions/4359910/is-it-possible-to-abort-a-task-like-aborting-a-thread-thread-abort-method
Henk Holtermanさんは「そういうことを(安全に)したいのならその部分を別アプリにしろ」と言っている
2017/12/16(土) 17:41:39.84ID:qA7A9B95
>>678
それ、スレッドでタスクのようにキャンセルしたいって話だぞ。
2017/12/16(土) 17:48:31.95ID:ghluEyaB
普通にstaticのフラグ作って強引に無限ループ抜けちゃうのは?
2017/12/16(土) 17:50:37.53ID:oGvDk6LW
>>675
まず「止める」って発想がおかしい。
各メソッドが「止まる」ように設計しなきゃ。

各メソッドの引数に処理がキャンセルされたかどうかを返すFunc<bool>を追加して
void A(Func<bool> canceled) {...}

呼び出すときに
A(() => backgroundWorker1.CancellationPending);

とかすればいいんじゃないか
2017/12/16(土) 17:52:34.38ID:qA7A9B95
>>673
Bでエラーが発生したら例外投げて、backgroundWorker.DoWork内のループでその例外を補足してe.Cancel=trueにするようにすれば。
2017/12/16(土) 17:58:55.94ID:qA7A9B95
>>678
ごめん。
>>679は全くの間違い。ぼけてた。

ただ、今回はワーカーメソッドの中から中断したいって話なので、外から強引に中断する話とは違う。
684デフォルトの名無しさん
垢版 |
2017/12/16(土) 18:12:53.74ID:DOHaPC3l
>>681
() =>この書き方がよくわからないので
とりあえず今のメソッドを全てvoidからboolに変え、エラー時にfalseを返して
if(メソッド==true)の時だけその後の処理を実行する様にしてみます

>>682
例外を投げるっていう方法がわかりません…調べてみます

みなさん色々ありがとうございました
2017/12/16(土) 18:22:29.26ID:cphXnYZp
>>666
何言ってんだこいつ?
2017/12/16(土) 19:04:01.72ID:ghluEyaB
>>685
じゃあ俺が作った
「USBちんぽん」って
使ってくれる?
2017/12/16(土) 19:11:54.53ID:FKHtpILn
>>686
うん、ほしい
2017/12/16(土) 19:14:12.13ID:ghluEyaB
>>687
やったぜ
頭悪いんだねw
2017/12/16(土) 19:15:20.72ID:FKHtpILn
>>688
はやくちょーだい?
2017/12/16(土) 19:18:34.13ID:cphXnYZp
>>686
疲れてるのか?
日曜日は10時に寝るといいぞ
2017/12/16(土) 19:19:38.55ID:ghluEyaB
>>690
お前は「USBちんぽん」使ってくれるの?
2017/12/16(土) 21:53:57.13ID:B4/eWtrI
>>689
https://dotup.org/uploda/dotup.org1414162.exe
2017/12/17(日) 01:36:39.71ID:hpnS8mLh
Chartを2個置いているのですが、このフォームを最大化した際にこの比率のままChartをフォームに合わせてリサイズするにはどのように設定すればいいのでしょうか?
Anchorを上下左右全てオンにした場合、自動的にリサイズした際に右側のChartが隠れてしまいます
https://i.imgur.com/53dfVWo.jpg
2017/12/17(日) 01:40:47.18ID:hpnS8mLh
>>693
補足です
直撮りで申し訳ないですが、1枚目が正常な場合です
これを最大化した時もそのままにしたいのですがanchorを全部設定するだけだと2枚目のように手前側の設定が反映されて被ってしまいます
https://i.imgur.com/ZQsJtG4.jpg
https://i.imgur.com/lR2CXSU.jpg
2017/12/17(日) 01:41:46.33ID:CSXOgBDh
>>693
わかる
俺も知りたい
2017/12/17(日) 01:50:14.52ID:CSXOgBDh
でもanchorでは多分できないということもなんとなくわかる
比率を自分で計算して位置サイズ合わせするしかないんじゃないかと
2017/12/17(日) 02:03:32.25ID:hpnS8mLh
>>696
どもです
検索ワード少し変えて探したらこんなのが出てきました
https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/44b83f8c-7ac1-463f-9153-3d1a67197a8d?forum=csharpgeneralja

少しこの辺りの試そうと思います
回答通り、標準ではそういう機能無いみたいですね
ありがとうございました
2017/12/17(日) 11:39:32.44ID:hpnS8mLh
>>697
自己解決できました
今さっき使い方少し調べて試したら
TableLayoutPanelで無事目的達成できました
https://i.imgur.com/SkP2OHD.jpg
2017/12/17(日) 12:05:55.48ID:4m+VWQn4
>>665
あえて書くけど
個人で小規模なアプリの場合はインターフェースなんて不要

商用大規模アプリでも使ってないところが多いくらいw
2017/12/17(日) 12:08:11.46ID:opp+Hz1N
>>699
なわけないでしょ
2017/12/17(日) 12:08:27.63ID:4m+VWQn4
>>673
Task使え
2017/12/17(日) 12:12:30.50ID:ILWlCk8x
>>699
これは恥ずかしい
2017/12/17(日) 12:49:56.01ID:gfqG1JvG
基底クラスとインターフェースって何が違うんですか?
2017/12/17(日) 12:55:53.21ID:OwhBw4on
>>703
そこは基底じゃなくてabstractの抽象クラスじゃね
違いは実装の有無と多重継承かなあ?
2017/12/17(日) 14:27:27.54ID:sFu7AEYs
>>699
大規模とかそういう問題じゃない
あえて100Vコンセントにする仕様がないとインターフェースは役に立たない

USBちんぽんを採用する理由がプロジェクトにないと意味がない
2017/12/17(日) 14:51:02.99ID:RNTbc2+q
意味の共有ができない喩えいいかげんやめたら
2017/12/17(日) 15:33:24.95ID:sFu7AEYs
>>706
君が普段やってることじゃんw
USBちんぽんの使用の押し付け
やられて嫌ならやめるべきだねw
2017/12/17(日) 20:19:06.53ID:6F/MtA/p
>>699
またテメエか
公害は死ねっていったろ
2017/12/17(日) 21:06:17.16ID:8SWMSnGu
static な関数を複数のスレッドから利用するのは危険ですか?
具体的に言うと、データベースを読み書きするような処理です。
注意事項など教えて下さい。
2017/12/17(日) 21:44:44.79ID:sFu7AEYs
>>709
トランザクションどうなってるの?
2017/12/17(日) 22:21:15.29ID:qS3H4jkn
>>710
何もしてません。と言うかトランザクションってよく分かっていません。
どうすべきでしょうか?
2017/12/17(日) 22:22:18.95ID:sFu7AEYs
>>711
いい機会なのでトランザクションについて調べてみるでFA
2017/12/17(日) 22:25:31.50ID:ZCl426tV
なんがどうなれば危険なのかしらんが、そんなものはその関数の実装によるわ
2017/12/17(日) 22:27:39.83ID:sFu7AEYs
>>711
序盤の入金出金の説明がわかり易かった
http://itpro.nikkeibp.co.jp/article/COLUMN/20080123/291846/?ST=spleaf
2017/12/18(月) 09:06:05.17ID:325qmzym
>>709
ef噛まして楽観的排他制御でfa
2017/12/18(月) 09:47:39.52ID:BBY2VQE+
排他制御なんて自分でやらなくてもDB側で勝手にやってくれるんじゃないのか?
717デフォルトの名無しさん
垢版 |
2017/12/18(月) 09:50:45.06ID:/wskk4Cx
public static double keisuu(string mojiretu)
{
switch (mojiretu)
{
case "aaa": return 1.2; break;
case "bbb": return 1.6; break;
default: return 0; break;
}
}

全てのbreakのとこで到達できないコードが検出されました
と出るのですが何がいけないのでしょうか
2017/12/18(月) 09:53:30.03ID:I3I0Txu7
>>717
returnしたらbreakに到達出来ないからbreakは要らない
719デフォルトの名無しさん
垢版 |
2017/12/18(月) 09:58:58.14ID:/wskk4Cx
ありがとうございます!
720デフォルトの名無しさん
垢版 |
2017/12/18(月) 10:05:08.96ID:/wskk4Cx
break消してもフォールスル―とかにはなりませんよね?
2017/12/18(月) 10:19:47.17ID:I3I0Txu7
なりません
722デフォルトの名無しさん
垢版 |
2017/12/18(月) 11:01:50.77ID:/wskk4Cx
ありがとうございます!
2017/12/18(月) 20:04:12.41ID:+/hEAeWc
>>716
楽観的に考えるとやってくれないが悲観的に考えるとやってくれる。
2017/12/18(月) 20:15:27.26ID:pniu1iMQ
上手いこと言ってる場合ですか
2017/12/18(月) 21:09:49.51ID:ce0jsCws
>>709
状態を持っていない関数なら安全
フツーのstatic関数はこれなハズ
immutableな状態を持つ関数も安全
mutableな状態を持つ関数ならそれを作った人を処刑すべきw
2017/12/18(月) 21:33:23.50ID:6wmobrlb
それは甘い

例えばConsole.Writeは当然状態と持たないが、
何か適当な文字列(πでも聖書でも何でもいい)を少しずつ標準出力に
書き出すメソッドを2つのスレッドで実行したらどうなる
2017/12/18(月) 21:40:21.06ID:+HXT0ym6
パソコンが爆発する
2017/12/18(月) 21:42:12.35ID:YSeGcmGL
Consoleクラスってスレッドセーフじゃなかったっけ
2017/12/18(月) 21:54:40.33ID:aYaUR9Gg
コンボボックスで中身を設定するときコードを書いてロード時に呼び出す方法以外に、visualstadioでコードを書かずに中身を設定するような機能はないのでしょうか?
そういうコントロールなどないでしょうか?
2017/12/18(月) 21:56:53.79ID:z1EessDi
>>729
画面編集モードのプロパティウィンドウから設定できるじゃん
2017/12/18(月) 21:57:37.55ID:ce0jsCws
>>726
残念ながら「コンソール」と言う外部IOを持っているんだよ
2017/12/18(月) 22:15:16.76ID:ce0jsCws
>>728
せやね
2017/12/18(月) 22:18:38.50ID:aYaUR9Gg
>>730
助かりました感謝します
2017/12/18(月) 22:53:45.36ID:kRxIzXOP
https://ideone.com/eFQ05c
上のようなjson形式があった場合にTestのcount,pageは問題なくデシリアライズできるのですがPersonのname,ageは下のように書いてみてもまったくできません
var Test = JsonConvert.DeserializeObject<Test>(Json);
foreach (var r in Test.status)
{
Console.WriteLine(r.name);
}
Json.netを使っているのですがどのようにしたらいいでしょうか?
2017/12/18(月) 23:11:52.12ID:3CP1/jFn
>>734
http://beachside.hatenablog.com/entry/2016/08/30/190000
これ参考にJsonConverterを継承すりゃいいんじゃねーの?
736デフォルトの名無しさん
垢版 |
2017/12/18(月) 23:28:28.84ID:pniu1iMQ
>>734
ワシの環境だとこれで成功したんだがどこがやりたいことと違うんやろう
https://ideone.com/4MqfUE
2017/12/19(火) 00:49:42.79ID:aZpIRKJe
>>735
その2 JsonConverterを使ってデシリアライズの10行目p.nameでnameが見えずエラーになります…

>>736
デバックを行うと
foreach (var r in Test.status
{
Console.WriteLine(r.name);
}
のrの部分がnullになり結果が何も表示されません
cvrl + spaceでr.name自体は出るのですが…
2017/12/19(火) 00:53:59.81ID:ySpyuYdG
>>737
変数名Testを違うのに変えてもダメですか?
2017/12/19(火) 01:03:43.75ID:aZpIRKJe
>>738
deserializeに変えてみても駄目ですね
とりあえず今日は寝て明日先輩にも聞いてみます
2017/12/19(火) 07:59:35.15ID:ChgNtW7Q
c#にレクトトラッカーってないですか?
2017/12/19(火) 08:27:59.60ID:JkA1xsmg
非同期な複数のスレッドから、staticクラスの中のstreamwriterでcsvにログを書いてます
タイミングにより、ファイル競合?ロック?するようで、一つのスレッドからしかログが出力されません
ロック解除を待機するみたいなことはどうやるのでしょうか?
2017/12/19(火) 08:36:09.07ID:ChgNtW7Q
>>741
俺、そういうログ一生懸命作ろうとしたらスレッド毎にログ出してよって言われたよ
結局待ちが発生すると
ログの発生タイミングっていうか順序が全くの嘘っぱちになっちゃうじゃん
そんなゴミいらねーって言われたぜ
上司がいるならちょっと仕様確認オススメ
2017/12/19(火) 08:44:00.33ID:LhTNVyY+
Queue使えばよくね
ログ出力メソッドはエンキューするだけ
ログ出力はワーカスレッドでのんびりやればいい
2017/12/19(火) 09:13:04.87ID:nH54/Jdj
素直にLoggingライブラリ使う
メンテナンスする人の気持ちも考えなきゃ
2017/12/19(火) 09:18:25.50ID:yH1cU4+B
いつも思うけど、やっぱAutoRrsetとかのイベント付きキューなんてないの?
2017/12/19(火) 09:53:23.28ID:33gf6qei
>>745
BlockingQueueのコンストラクタにConcurrentQueueを渡す
2017/12/19(火) 10:25:11.81ID:OVvTmQOX
BlockingCollectionだな
ちなみにコンストラクタに基になるコレクション渡さなかったら既定でConcurrentQueueが使われる
2017/12/19(火) 10:28:02.49ID:gf33i/87
>>741
SeriLogの実装みてみ
2017/12/19(火) 10:32:13.69ID:NMj9FFtI
やってみた感じぶっちゃけ難しい
片方のスレッドが超忙しいとき待ちが発生すると他のスレッドが全く動かなくなっちゃう
2017/12/19(火) 11:33:40.95ID:Ck77l9Yv
もう書いてる人がいるけど、前後関係が重要なら文字通りバッファーを設けるだけだよね
ライブラリのQueueは使いづらいからたぶん自作することになるけど、そんな難しくない
2017/12/19(火) 11:52:48.64ID:VR9xxmjw
Nlogじゃないの?
2017/12/19(火) 12:08:45.23ID:K2Dj0raT
C#特有というわけでは無いですが、例えば抽象クラス「費用」を作った後、費用合計を求めたい場合、費用の各サブクラスから値を取得し合算するのと「費用合計」クラスを作って、そこだけに問い合わせるの、どちらが良い作りでしょうか
2017/12/19(火) 12:10:26.76ID:yH1cU4+B
>>746
>>747
へーそうかい!?
調査してみるよ。

ありがとうね
754741
垢版 |
2017/12/19(火) 12:37:26.95ID:JkA1xsmg
順序は気にしません
2つのスレッドそれぞれから1回/秒ずつ出力されるだけです
2017/12/19(火) 12:43:08.19ID:tMFeAU0g
>>752
サンプルコードを見せてよ
2017/12/19(火) 14:22:15.69ID:Ck77l9Yv
>>752
何を聞きたいのかよく分からないw
たぶん俺だけじゃないと思う

とりあえず「費用合計」クラスは普通に考えればない

合計を求める費用を集約しているオブジェクトがあるなら、そのオブジェクトに
合計させる(LINQのSum使ってもいいし自分でメソッドかプロパティを書いてもいい)のが普通

そんなものなくても配列にでもぶち込んでLINQ使うだけじゃないの?
2017/12/19(火) 14:32:35.77ID:f0pyN6AV
いやなかなかいい質問だと思うよ
初心者でそこに気付けるのはいい視点だと思う
素質がある

中級者でもそこに全然思いが至らない人がいて困る
素質のない人だ


Sumを呼ぶとその時点で計算が行われるのことが困る場合がある
10個スレッドがあってそれぞれでSUM呼ばれて値が一致しないとか
そのつどDB読んじゃって負荷がかかりすぎるとか
758デフォルトの名無しさん
垢版 |
2017/12/19(火) 14:44:56.70ID:/RoT047O
>>752
費用クラスが合って費目毎にインスタンスを作るとか
費用合計クラスとか
何かを大きく勘違いしている
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況