ふらっと C#,C♯,C#(初心者用) Part131 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2017/09/08(金) 18:12:11.06ID:Ej7G00WU
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。

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

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

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

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

■前スレ
ふらっと C#,C♯,C#(初心者用) Part130
https://mevius.2ch.net/test/read.cgi/tech/1500327645/
■関連スレ
C#, C♯, C#相談室 Part94 [無断転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/tech/1492843013/

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

■情報源
https://msdn.microsoft.com/en-us/library/gg145045.aspx
http://referencesource.microsoft.com/
2017/09/08(金) 21:39:46.11ID:mcCYyLIS
>>1

ボーリング処理だったか..
2017/09/08(金) 21:41:20.91ID:13cy/HVm
そうそうw
ボーリング処理ってなんだよ
わかるかよ

957 名前:デフォルトの名無しさん (ブーイモ MMba-d5PD)[sage] 投稿日:2017/09/07(木) 16:48:04.48 ID:CjGXGOTyM [2/2]
1秒毎にボーリング処理するなかであるクラスのメソッドを呼び出す場合、毎回newするのは悪手ですか?staticが基本でしょうか?
2017/09/08(金) 21:44:51.40ID:13cy/HVm
答え

普通のstaticで済む用途ならstaticで書いたほうがいい
負荷やリソースじゃなくて毎回newする意味がない

sin計算するとして毎回Mathインスタンスをnewしなくてはいけない設計だったら糞だなって思う
2017/09/08(金) 21:52:15.93ID:nZ7nhjDi
前スレ >>968 の ID:VpThhHIU0 さん。

助かりました。ありがとう。
その例外メッセージ後半が目に入っていませんでした。。おバカでした。

後半の方法で対応できたのですが。
この方法で派生先クラスをシリアライズすると、クラスの情報も一緒に出力されるんですね。
出力しない方法があったら知りたいです。もっと探せば見つかるかなあ。
2017/09/08(金) 22:04:57.94ID:5liNTHI5
前スレ>>975
> 1分以上止まっちゃってたことあるよ
その時の.Net Frameworkのバージョンいくつだったんだろ。
今はバックグラウンドGCとか、GCも改良されてて長期間止まり難くなってるけど。
2017/09/08(金) 22:10:04.29ID:5liNTHI5
改良されたとは言っても、全く止まらない訳じゃないから、
数100msecでも止まって欲しくない場合は、やっぱり手動でGCを制御する必要があるけどね。
2017/09/08(金) 22:45:19.27ID:Ej7G00WU
>>4
答になってないよw
staticで済む用途ならstaticで書いたほうがいい、ではなくてそれはstaticで書かなきゃだめw

最初から言ってるように、毎回newするのと対立する方法は、
フィールドでインスタンスを持っておこくと。
2017/09/08(金) 23:26:37.19ID:13cy/HVm
>>8

>普通のstaticで済む用途なら
2017/09/08(金) 23:50:16.96ID:Ej7G00WU
>>9
意味が分からない

普通であろうがなかろうが、staticで書けるメソッドをインスタンスメソッドで書く意味はないし
やってはダメだろうに
2017/09/08(金) 23:53:51.95ID:mcCYyLIS
気分はstaticになってきたな
2017/09/09(土) 02:26:05.00ID:QZscGhnQ
staticおじさんがまた大勝利してしまったと聞いて
2017/09/09(土) 03:16:09.56ID:ZyaEKkZw
前すれワッチョイとかいうのだったんだな
2chのシステムよく知らんので普通のスレで立てちゃったよ
やり方知らんしw

気に入らなかったら別のスレ立ててね
2017/09/09(土) 03:27:48.28ID:Dk6TKP7N
1月強で1000行くんだから我慢して使い切れよ
2017/09/09(土) 06:30:41.62ID:mbeKZ08U
おまいらに真実を話す。ポーリングって確かに打ったんだわ。スマホが勝手にボーリングに変換してたんだわ
ATOKあほすぎんだろ
2017/09/09(土) 08:37:40.24ID:GUslkcWv
変換はgoogleのが絶対いいな
流行りのワードも出てくるし
これ以外考えられないって性能になっちゃってないか?
2017/09/09(土) 10:04:18.06ID:m2qj4yLN
インスタンスをキープしたいのなら、ポーリングのクラスにフィールド設定してそこに置けば済むわけでstatic classは有り得ないわな
static classはグローバル参照がどうしても必要な設定値とか、拡張メソッドとか、Mathのようなライブラリで使うもので
不用意に使うとろくな事がない代物だ
18デフォルトの名無しさん
垢版 |
2017/09/09(土) 10:20:42.56ID:6JP7a1zU
>>5
DataContractSerializer系じゃ無理なはず
飽くまでシリアライザなんでデシリアライズできなきゃならない
型情報が無くなったら元のどの型にデシリアライズすればいいか分からなくなっちゃう
2017/09/09(土) 10:39:45.84ID:IbIBfPO7
それでも書いた処理によってガベコレまでの一時メモリリークは起こるので強制ガベコレの管理はどうせ必要になる

誰かのライブラリ使ってて中がブラックボックスだったときにガベコレまでの一時メモリリークは気づけない

staticで変数用意してもそれがすべてと言い切れないなら意味がない
無駄な努力じゃねーかな?
2017/09/09(土) 10:42:06.00ID:bgDvHBVU
>>17
だいたいあっているけどstaticにしようとしていたのはメソッド
2017/09/09(土) 11:56:12.29ID:usm4kYFG
ライブラリだったら内部の構造は考えられずガンガン使われるから
ポーリングクラスが1000個とか作られてつかえねーなって言われる
だったらstaticな要素にしといたほうがいい
2017/09/09(土) 13:29:46.77ID:WZb5jfgG
なんか昨日から変なところでstatic使えとか意味不明なこと言ってる人がいるけど、
Cのstatic付きのローカル変数と勘違いしてないか?w

それC#にはないよ
VBにはあるけどねw
2017/09/09(土) 13:49:42.28ID:mQdlpUO1
>>22
何の話をしているんだ
元の質問が別のclass内のメソッドを呼びたいが1秒ごとに呼び出すのに毎回インスタンスを作りたくないので
そのメソッドをstaticにしてインスタンス作らずに呼べるようにした方がいいかってものだった
だから上の方でそのインスタンスをフィールドで持っておけば済むって話になってんの
2017/09/09(土) 14:06:55.82ID:WZb5jfgG
>>23
だから、(これは質問者の質問のせいでもあるけど)話の最初からstaticなんて
まったく関係ない。そんなことは機能かれ俺自身が言ってるのよ

それとは別に、>>19とか>>21とか読むと、C#にもCのstaticなローカル変数が存在すると
勘違いしてるんじゃないかと
2017/09/09(土) 14:17:10.91ID:yizOjyJK
質問でも回答でもない雑談なら他でやれよ
2017/09/09(土) 15:31:26.30ID:mbeKZ08U
>>23
わかりやすい
2017/09/09(土) 15:55:44.10ID:usm4kYFG
>>24
誰もそんなことは言ってないのに
勝手にそう思ってるのはよくわかった

質問はstaticメソッドの話をしてるのはみんなわかってる
2017/09/09(土) 17:51:48.60ID:f8+hvMV6
>>27
じゃあ何の話をしてるの?
率直に言って>>21は何を言ってるのかさっぱり分からん

昨日から言ってるし>>23も言ってるように、そももも元の質問者の話とstaticは何の関係もない。
恐らく質問者は何か勘違いしてstaticと書いてるだけ
2017/09/09(土) 18:18:19.52ID:usm4kYFG
>>28
え?

憶測だけど
イベント内で毎回生成される
var a=new ClassA();
a.Do(b);

staticメソッドのClassA.Do(b)にしようかということじゃないのか?
;初心者の質問なんてその程度だろ
どこからc++のstaticと勘違いしてるなんて変な主張が出てくるのかわからない
2017/09/09(土) 18:24:38.82ID:usm4kYFG
インスタンスのフィールドでaを持てって話も出てるけど
そもそもインスタンス作る必要もないものをわざわざ保存しておく意味はないよ

それがなぜだか生成コストの話になりそっちに付き合って話したら妙な揚げ足取りみたいのに
絡まれていいことないわ
2017/09/09(土) 18:28:32.66ID:f8+hvMV6
>>29
何周遅れの話をしてるのよ。疲れるわ

だから、staticで書けるメソッドならstaticで書くのが当たり前で、
それをあえてインスタンスメソッドとして書くという選択肢は存在しない。

何が「え?」だよ。こっちが言いたいよw
2017/09/09(土) 18:30:13.39ID:usm4kYFG
だからそこでおわってんだよ
でなんでc++のstaticが出てきたり
質問者が勘違いしてstaticって言ってるみたいなトンチンカンな話になるのかと
もうおとなしくしてればいいのに
2017/09/09(土) 18:32:50.82ID:usm4kYFG
>昨日から言ってるし>>23も言ってるように、そももも元の質問者の話とstaticは何の関係もない。
>恐らく質問者は何か勘違いしてstaticと書いてるだけ

こういうこと書いててよく言えるな
2017/09/09(土) 18:34:06.78ID:xrlCaMPb
「staticは関係ない」って書いている奴はC#の前に日本語勉強しろよ
2017/09/09(土) 18:34:21.92ID:f8+hvMV6
なんか日本語「も」不自由な人みたいだね
何言ってるのかさっぱり分からんw
2017/09/09(土) 18:35:50.91ID:usm4kYFG
>>35

じゃあ
>>28の説明をまともにしてみろ
2017/09/09(土) 19:41:37.58ID:FYc/xt6+
荒れてるので、名のりにくいのですが、私が質問者です。
>>23
この記載で、最適解はこれだと認識しました。

で、質問した時点では
>>29の憶測通り。

とりあえず個人的にはもう納得してるので、これで終わりにしてほしい。

皆さんありがとう
2017/09/09(土) 19:47:52.23ID:m2qj4yLN
>>31
それは大間違い。staticで書かなくても良いものは極力インスタンスメソッドにするべきだな
2017/09/09(土) 19:52:01.12ID:GUslkcWv
>>38
理由を書けよw
いったいどういう育ち方したらそんな投げっぱなしのジャーマンなんだ?
2017/09/09(土) 19:55:18.70ID:G5uGYTR5
>>38-39
いつまで続けてるの?
質問者が終了を宣言してんだよ
2017/09/09(土) 19:59:42.49ID:GUslkcWv
>>40
は?お前はどうしたいの?
2017/09/09(土) 20:03:34.87ID:suZLJloi
ワッチョイが無いとこの一連全部同一人物なんじゃないのと勘ぐっちゃうわ
2017/09/09(土) 20:29:10.27ID:f8+hvMV6
>>39
>>38は釣りじゃなく本気で言ってるなら(恐らくそうw)
関わっても時間の無駄にしかならないお方だ。暇つぶしにはいいかもしれないけどw

時々対面の世界でもこういうガチで盛大な勘違いをやらかしてる人がいるから困るよ本当w
2017/09/09(土) 21:30:45.08ID:usm4kYFG
前に会ったRuby使いはクラスメソッド(c#のstaticメソッド)は極力使わないで
インスタンスメソッドを使うべきだって言ってたのを思い出した

何らかの理由があるんだろうけど無視した
2017/09/09(土) 22:09:15.56ID:wzTKK5fz
どっちがいいって話じゃないけど、あとで実装を差し替える可能性があるなら
クラスメソッドを直接使わずにシングルトンにするって手法はある。
2017/09/09(土) 22:28:01.73ID:m2qj4yLN
インスタンスってのは主に多重実行のための仕組みなんだから、ある程度適当に作ってもスレッドセーフな物が出来上がる
staticで作るなら、複数のスレッドから同時多数アクセスが有っても大丈夫なように組まないといけないし
それが面倒だから極力スタティックは避けるべきだと思うんだがな
47デフォルトの名無しさん
垢版 |
2017/09/09(土) 23:17:45.56ID:nwiyZr1T
Taskでも内部でThreadPoolを使うから
(ThreadPool.SetMinThreads(実行したい数))は必要だけど
ThreadPool実行で実行して待ち合わせ
とTaskで実行して、Task.WhenAll
は何が違いますか?
そもそも、ThreadPoolは必要ないですけど気になったので、質問します。
2017/09/09(土) 23:20:05.29ID:5C7c1QNW
極力staticメソッドを使うという方針を取ると
関数用クラスとデータ用クラスに分かれやすくオブジェクト指向の考え方からは離れやすい
OO的にはアンチパターンになる可能性もあるけどトレードオフを理解して方針を決めればいいと思うよ
2017/09/10(日) 00:19:09.54ID:0Cs8J57s
>>18
そうですね。
今回の場合、相手がアレで。向こうが予期しない要素を含むデータを送ると不正終了するらしく。
最初の質問前に時間がなかったのでデータクラスを完全に2つに分けて作ってしのいでたのですが、そのままにするしかないかも。。
50デフォルトの名無しさん
垢版 |
2017/09/10(日) 00:57:09.14ID:pV2ta4X5
>>47
既定ではスレッドプール使うってだけでTaskが後ろで何使うかは規定されてない
あとWhenAllはasync/await向けに作られてる
51デフォルトの名無しさん
垢版 |
2017/09/10(日) 01:13:53.87ID:dSp+Ezdg
>>50
規定なら同じですか?
async/await使わないならthread poolの方が良いのかな?
52デフォルトの名無しさん
垢版 |
2017/09/10(日) 01:40:04.99ID:pV2ta4X5
>>49
Json扱うならJson.NET使うのが良いよ
基本ライブラリ以外使っちゃダメとか言われてるならSystem.Web.Script.Serialization名前空間
2017/09/10(日) 01:42:59.22ID:MMSQKBM8
>>51
いや普通にTask実行Task.WhenAllで良いんじゃね
54デフォルトの名無しさん
垢版 |
2017/09/10(日) 02:11:55.78ID:dSp+Ezdg
>> 53
やっぱり、メソッド分けてasync/await使いたくなる気がする。
ThreadPoolの方がメソッド分けしない糞コードでも書きやすい。
2017/09/10(日) 03:56:30.01ID:6GasKA+m
わざわざ低位のThreadPoolを使うメリット無いだろ。
ちなみにTaskの方は生成時のオプションでThreadPool使わず専用スレッドを割り当てたりも出来る。
2017/09/10(日) 04:49:01.84ID:hdyOlPd+
超低レベルな質問ですみません
wpfで実験しています
ボタンを押すとLabelが回転するというテストです

ボタンはトグル処理してあって押すと回転、もう一度押すと止まっるという作動です

int band = 0;
DispatcherTimer tim = new DispatcherTimer();
public void Rotet()
{
label01.Content = "自動回転";
tim.Start();
tim.Interval = TimeSpan.FromMilliseconds(10);
tim.Tick += Tim_Tick1;
}
public void Rotstop()
{
label01.Content = "自動回転停止";
tim.Stop();
}
2017/09/10(日) 04:49:17.97ID:hdyOlPd+
public void Tim_Tick1(object sender, EventArgs e)
{

band++;
label01.RenderTransform = new RotateTransform
{
Angle = band
};
}

10ミリ秒毎に1度回転するという作動を希望しています
が、トグルボタンを押してRotetを呼び出すたびに、band++での増加量が加算されてしまいます
5回Rotetを呼び出すと10ミリ秒毎に5増えます
増加量は常に1であって欲しいのですが、これの根本原因はなんでしょうか?
2017/09/10(日) 05:21:45.40ID:6GasKA+m
>>56
Tickイベントのハンドラ登録だけを毎回してるから。
登録は1度だけにするか、毎回解除もするようにしないと。
後、質問とは関係ないけど、タイマーを開始するタイミングもおかしい。
2017/09/10(日) 07:49:42.90ID:hdyOlPd+
>>58
どうもありがとうございます
今VS立ち上げられないので確認はあとになりますが、教えていただいた内容は把握できました
後、たしかにstartのタイミングおかしかったですね
こっちも直してみます

どうもありがとうございました
2017/09/10(日) 08:59:57.01ID:hdyOlPd+
>>58
今VS2017C#で修正確認できました
ありがとうございました
61デフォルトの名無しさん
垢版 |
2017/09/10(日) 11:02:35.14ID:u2dcVsCu
>>55
既存のメソッドに手を加えずtaskにできますか?
62デフォルトの名無しさん
垢版 |
2017/09/10(日) 18:43:13.56ID:yZp0NmX3
Macで開発されている方がいましたら環境を教えて欲しいです
visual studio for macはwindowsアプリを作らなければ不便はありませんか?
2017/09/11(月) 03:02:17.61ID:OjrsKbwz
>>61
TaskでもThreadPoolでもThreadでも同じだけど、
既存メソッドがスレッドセーフでないなら、一般的なマルチスレッド対策は必要。
64デフォルトの名無しさん
垢版 |
2017/09/11(月) 04:22:03.43ID:xOd8/hnB
インターフェイス(ICollection)を実装しています。
例えば、.Clear() メソッドを実装するときに、

public void ICollection<String[]>.Clear()
{

のように、public を付けると、怒られます。
修飾子 public がこの項目に対して有効ではありません。

合理的な理由でもあるのでしょうか。
65デフォルトの名無しさん
垢版 |
2017/09/11(月) 06:00:48.58ID:dDtMImyT
>>63
ThreadPoolが長時間処理に向かないって書いてあったけど、それも嘘だと思う。
GUIアプリとかゲームなら表示を妨げるけど、データ処理だけやるなら変わらない。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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