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

レス数が1000を超えています。これ以上書き込みはできません。
1デフォルトの名無しさん (ワッチョイ 8b75-uWnk)
垢版 |
2018/02/04(日) 22:02:28.59ID:FbKpa1HN0
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください

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

■前スレ
ふらっと C#,C♯,C#(初心者用) Part134
http://mevius.5ch.net/test/read.cgi/tech/1511951038/
■関連スレ
C#, C♯, C#相談室 Part95
http://mevius.5ch.net/test/read.cgi/tech/1508180530/
C#, C♯, C#相談室 Part93
https://mevius.5ch.net/test/read.cgi/tech/1492818720/

■コードを貼る場合は↓を使いましょう。
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: default:vvvvv:1000:512:----: EXT was configured
2018/03/02(金) 00:27:57.99ID:RRk6A7H1M
>>925
https://www.infoq.com/jp/news/2013/07/async-await-pitfalls
https://www.google.co.jp/amp/s/www.red-gate.com/simple-talk/dotnet/net-framework/the-overhead-of-asyncawait-in-net-4-5/amp/
ちょっとググっただけでいくらでも出てくるな
2018/03/02(金) 00:29:15.66ID:k6O24zwX0
個人的には非同期IOのシナリオの場合ならクライアントでも積極的に非同期使うようにしてるにゃ
2018/03/02(金) 00:31:40.92ID:glQGbmO9a
普通はそうだろ
2018/03/02(金) 00:32:45.87ID:ORIKCzBj0
そもそもなぜ非同期なんかにしたいのか?
すっげー不具合増えそうだしぶっちゃけやるんじゃねーよ
ぶっころ
2018/03/02(金) 00:36:23.51ID:biZ1zUn80
>>926
> 結論 – 非常に短いメソッドにasync/awaitを使うことを避ける、あるいはきついループ内でawaitステートメントを持つことをを避ける
使い所を間違えるなとしか書いて無い。
「一般にはなるべく使わないほうがいい」とか、曲解だよ。
2018/03/02(金) 00:39:03.88ID:SqtcRaFRa
>>930
じゃあ言い換えようか?
複雑になる、オーバーヘッドが増える、それをペイするだけのメリットはない。
GUIをブロックしないという超重大な目的さえ達成できれば十分。
2018/03/02(金) 02:39:53.79ID:kefJfyuu0
>>920
クライアントアプリならREST API叩くのもごく一般的だと思うが、それも全部同期でやるのかい?
2018/03/02(金) 03:52:57.49ID:QlU5Q+B8M
>>932
理解してないのは君だけ
イベントハンドラでだけawait Task.Runしてその中は全部同期でやれって話だぞ
2018/03/02(金) 04:11:03.94ID:kefJfyuu0
>>933
ねーよwww
935デフォルトの名無しさん (ワッチョイ df9d-wl/W)
垢版 |
2018/03/02(金) 04:58:14.52ID:IwZ3DIkv0
936デフォルトの名無しさん (ワッチョイ df9d-wl/W)
垢版 |
2018/03/02(金) 05:58:54.00ID:IwZ3DIkv0
var cant = new System.Threading.CancellationTokenSource();//なんじゃこれは?
Task taskA = Task.Run(async () => {
int count = 60;//6sec
while (count-- > 0) {
 〜処理
 cant.Token.ThrowIfCancellationRequested();//例外発生
}
}, cant.Token );
何じゃらほい? 大したことできんのにたいそうな名前を付けやがって笑える。普通にflg使ったらいいだけだろ。
2018/03/02(金) 08:09:20.83ID:XunmkkLx0
相変わらずの浅はかさだ
1mmも成長していない
2018/03/02(金) 09:21:22.43ID:QlU5Q+B8M
>>934
何が面白いのか知らないけど、同期でREST APIを呼ぶケースなんて普通にあるぞ

>>936
正しい非同期メソッドは必ずCancellationTokenを引数として受け取る
そして、非同期メソッドからさらに別の非同期メソッドを呼ぶときには引数にcantを渡す
そうやって共通のCancellationTokenを引き回すことで、別の非同期メソッドを呼んでる間でも待機状態を確実にキャンセルできる
同期ならabortすりゃいいだけだけどね
939デフォルトの名無しさん (ワッチョイ df9d-wl/W)
垢版 |
2018/03/02(金) 12:17:26.88ID:IwZ3DIkv0
>>938
すいません。笑えませんでした。
2018/03/02(金) 12:27:24.77ID:4zkyzZ2fd
ふふってなった
2018/03/02(金) 12:41:04.31ID:Ej2mk6Y7d
>>938
日本語
942(ワッチョイ df9d-wl/W)
垢版 |
2018/03/02(金) 13:28:13.40ID:IwZ3DIkv0
これってどういう意味があるの?単純にフラグを叩けばいいだけだろ。大して利点があるようには思えんが?
ManualResetEventの代わりにflg=Flseで初期化しておいて、setのところでflg=trueにして、
while(!flg);で待機したらいいだけではないのか?

var waitHandle = new ManualResetEvent(false);
Task.Run(() => {Thread.Sleep(2000);  waitHandle.Set(); });
 Console.WriteLine("Wait");
waitHandle.WaitOne(Timeout.Infinite);
2018/03/02(金) 14:13:57.43ID:rvZjiwte0
>>942
もはやWin32絡むし煩わしいので、ドキュメントでも読んどってください
https://msdn.microsoft.com/library/cc429052
https://docs.microsoft.com/dotnet/standard/threading/manualresetevent-and-manualreseteventslim
944デフォルトの名無しさん (ワッチョイ df9d-wl/W)
垢版 |
2018/03/02(金) 15:56:09.38ID:IwZ3DIkv0
100msecのタイマー割り込みの中でこういうのを順番に実行する。
void timer1(){
switch( state){
case 0:
if( do1() ){state++;}; break;
case 1:
if( do2() ){state++}; break;
case 2:
if( do2() ){state=0}; break;
}
}
何かもっとスマートな書き方はないか?
2018/03/02(金) 16:01:28.48ID:MD67uZj00
デリゲート配列ってのもありますが、賛否両論です。
2018/03/02(金) 16:10:39.54ID:MD67uZj00
stateがマジックナンバー感があるので、配列よりDictionaryクラスっても、

でも賛否両論です。
947デフォルトの名無しさん (ワッチョイ df9d-wl/W)
垢版 |
2018/03/02(金) 16:57:54.42ID:IwZ3DIkv0
Stateを使いたくない。
while(1){
while(!do1()){ wait(100);}
while(!do2()){ wait(100);}
while(!do3()){ wait(100);}
}
こんな感じでなんかいい書き方は?
2018/03/02(金) 17:11:36.53ID:ORIKCzBj0
>>944
state++;
if(state>2)state=0;
ってやればスマートにならね?
2018/03/02(金) 17:55:24.18ID:z8blm8BJM
>>947
doの処理ステップによって遅延がでてこない?
950デフォルトの名無しさん (ワッチョイ df9d-wl/W)
垢版 |
2018/03/02(金) 18:21:47.40ID:IwZ3DIkv0
>>949
 遅延は無視できるレベル。
>>948
 ならない。というかStateは使いたくない。
2018/03/02(金) 18:26:56.36ID:AXJZJbYfa
>>944
ネタっぽい質問だけどこんなのでも作るとか

public class RoundRobin
{
  int index = 0;

  RoundRobin(params Action[] jobs)
  {
    if (jobs == null || jobs.Length == 0) jobs = new Action[] { () => { } };
    this.Jobs = new ReadOnlyCollection<Action>(jobs);
  }

  public ReadOnlyCollection<Action> Jobs { get; private set; }

  public void DoNext()
  {
    Jobs[index]();
    index = ++index % Jobs.Count;
  }
}

余談だけど、組み込みか何かの人?
タイマー割り込みてw
2018/03/02(金) 18:30:28.03ID:+QaGy5B+0
どんどんソースが長くなる不思議。タイマー割り込みを馬鹿にしてるからだな。
2018/03/02(金) 18:31:43.84ID:ORIKCzBj0
まあ、動いてるならスマートにする必要ってないよな
普通に記述してそれがイモっぽいなら
そりゃ言語がイモなんでしょうがないんだよ
2018/03/02(金) 18:37:23.64ID:Ht5IxdGD0
>>944
マルチキャスティングデリゲートは?
2018/03/02(金) 18:37:24.20ID:+QaGy5B+0
stateいらないとか、テストやデバッグするときstateが分からなくなるのに。
マルチスレッドや同期を書かせたらいけない人。
956デフォルトの名無しさん (ワッチョイ df9d-wl/W)
垢版 |
2018/03/02(金) 18:46:01.75ID:IwZ3DIkv0
Timer1のなかにステートマシンつくったらなんでもできるけど、わかり難いだろ。
フローチャートのように上から下へ自然に流れる方がいい。
2018/03/02(金) 18:48:03.88ID:Ej2mk6Y7d
おじいちゃんか
958デフォルトの名無しさん (ワッチョイ df9d-wl/W)
垢版 |
2018/03/02(金) 18:50:30.27ID:IwZ3DIkv0
>>952
var cts = new CancellationTokenSource();
Task.WhenAll(
Task.Run(() => EventLoop(cts)),
TimerLoop(cts.Token)
).Wait();
こういう書き方を見るにつけ、なにかいい方法はないかとつらつらと考えてる。
2018/03/02(金) 18:56:31.02ID:AXJZJbYfa
あとはこんなの
IEnumerable<Action> JobSequece()
{
  while (true)
  {
    yield return () => { ... };
    yield return () => { ... };
    ....
  }
}

async Task RoundRobin()
{
  foreach(var j in JobSequece())
  {
    await Task.Run(() =>Thread.Sleep(100));
    j();
  }
}

タイマー割り込みって言葉使うのはHW直接いじる超低水準のコード書いてる人か
80年代マイコン少年のおじさんだろうねw
2018/03/02(金) 18:58:45.70ID:EhvNkrDWa
>>958
WhenAllをよく使う人はTPL Dataflowを覚えたほうがいい
961デフォルトの名無しさん (ワッチョイ df9d-wl/W)
垢版 |
2018/03/02(金) 19:02:23.48ID:IwZ3DIkv0
C++ならTimer割り込みって言葉は普通につかうぜよ。
2018/03/02(金) 19:43:53.86ID:kefJfyuu0
>>961
c#スレやでここ
2018/03/02(金) 19:48:25.47ID:uaCZv/NI0
重大インシデント発生させそうな輩ばっかやな。
2018/03/02(金) 21:11:38.83ID:Gwpj8bix0
>>960
TPL Dataflow便利そうやね
2018/03/03(土) 00:37:31.41ID:wLcwZl2a0
本を読みながらUnityでC#を勉強しているのですが・・・
それぞれのコードの最後の行にあるnewは何をしているのか教えて下さい。

public class ArrowGenerator : MonoBehavior {
public GameObject arrowPrefab;
float span = 1,0f;
float delta = 0;

void Update()
this.delta > this.span) {
GameObject go = Instantiate(arrowPrefab) as GameObject:
int px = Random.Range(-6, 7);
go,tansform.positon = new Vector3(px, 7, 0);
}
}
}

他にも

public class IgaguriController : MonoBehavior {
public void Shoot(Vector3 dir) {
GetComponent<Rigidbody>().AddForce(dir);
}

void Start() {
Shoot(new Vector3(0, 200, 3000));
}
}

長いので分割します。すみません。
2018/03/03(土) 00:38:39.14ID:wLcwZl2a0
それぞれ最後の行の、
go,tansform.positon = new Vector3(px, 7, 0);
Shoot(new Vector3(0, 200, 3000));

このnew演算子?は何をしているのでしょうか?
それぞれVector3というメソッドが直後のカッコの中の引数を渡していると思うのですが
その手前のnewが何なのかわかりません
クラスをインスタンスにするときに使用するnewとは若干形が違いますよね
いくら調べてもこの形のタイプのnewが出てこなくて・・・。

どなたか宜しくお願いします・・・。
2018/03/03(土) 00:41:09.07ID:wLcwZl2a0
ああ・・・空白が埋まってしまっていてとても見づらいですね
本当にすみません
2018/03/03(土) 00:55:45.51ID:FSjtVpQl0
値型のnewだから意味は違うけど形は一緒やろ
2018/03/03(土) 01:03:49.08ID:SBEkwl3H0
>>966
いや、見た通りやよ
Vector3クラスのインスタンスを作成しつつ代入しとるんや
2018/03/03(土) 01:15:14.08ID:gHPIEkfR0
Vector3(x,y,z)はコンストラクタだよ
だからnewを付けて呼び出す
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/using-constructors

基本文法をどっかで学んでからのほうがいいんでないかい?
2018/03/03(土) 01:34:37.27ID:wLcwZl2a0
メソッドではなくクラスですね。

newは
クラス名 変数 = new クラス名()
の形しか見たことなくて・・・

上は
Vector3 go,tansform.positon = new Vector3(px, 7, 0);
という風に頭にもVector3 を付けないのですか?

下は
Shoot(Vector3 ABC = new Vector3(0, 200, 3000));
といった風に、ABCの様な変数は表記しないで、クラス名にnewを添えただけでも
クラスをインスタンス化できるのでしょうか?

>>970
一応、上のは入門書に書いてあるコードなのですよね
入門書が不親切なのか私に応用力がないのか・・・後者っぽいですね
他の入門書も調べて買ってみます
2018/03/03(土) 01:40:19.42ID:L5H5D1W/0
C#は糞だから初心者が混乱するのも無理はない。
2018/03/03(土) 02:15:20.99ID:kXsLgfSK0
コードを形で覚えてるのかなぁ
式という概念は分かるかな?
2018/03/03(土) 02:45:02.94ID:jgGrGcb50
>>971
コードがタイポってる気がするが、上はフィールドへの代入だから
TransformクラスでpositionはVector3Dであると既に定義されている
下はコードにメソッド定義も含まれていて仮引数の型が書いてあるよね

変数宣言の型指定であって、インスタンス化には代入を伴う制約はない
未初期化の変数は参照できないから殆どは宣言時に代入もされるけど
それぞれの字句に切り分けて意味を把握しないと歪んだ理解になります
2018/03/03(土) 07:33:03.46ID:wLcwZl2a0
>>974
とても詳しく教えて頂きありがとうございます
そういうことなのですね・・・やっと少し理解できました

意味を捉えようとは思って勉強していたのですが形で覚えていたんですね
1単語?ずつ意味を捉える様に意識してみます
皆さん変な質問にお答え頂きありがとうございました!
976デフォルトの名無しさん (ワッチョイ 6775-LhZF)
垢版 |
2018/03/03(土) 08:22:24.39ID:kknO3Mli0
Vector3 vec; 変数定義
vec = new Vector3(1,3,2); インスタンス生成後、変数に代入
2018/03/03(土) 09:12:41.41ID:PjugdM0i0
処理の結果を返してくれるapiで、例えば
貼り付けるテキストを決める
フォント名設定
色設定
文字の大きさ設定
なと細かくapiを呼び出ししないといけない場合でも、結果を受け取る変数はやっぱり使い回ししないほうがいいですか?その変数はapi呼び出したあとエラー確認するだけです
2018/03/03(土) 09:16:04.27ID:+71LGCxR0
使いまわせばいーじゃない
2018/03/03(土) 09:28:58.08ID:lW22yPgRa
個人的には、
異なるインスタンスなら原則使い回さない
インスタンスが同じなら使い回す
2018/03/03(土) 09:51:44.83ID:7F+xAEZYM
>>977
そもそも変数いらんのでは?
if (api.Foo().HasErros) return;
if (api.Bar().HasErrors) return;
...
2018/03/03(土) 10:35:24.42ID:/0Rk5gcF0
>>980
次スレお願い
2018/03/03(土) 10:44:16.70ID:PjugdM0i0
>>978-980
ありがとうございます。
変数を使用しない方法もありますね。ただメソッドは引数が多く、文が長くなるため悩み中です
2018/03/03(土) 14:40:32.75ID:9mjwXL/k0
pythonで言うデコレーターはC# のどれに辺りますか?
2018/03/03(土) 14:44:33.19ID:9mjwXL/k0
C# 修飾子 でググるとC++ 修飾子の記事しかHITしません。
2018/03/03(土) 15:04:07.52ID:VVolGUCSM
属性(Attribute)
Pythonのデコレータとは違って、それ自体はメソッドに純粋にメタデータを付けるだけの機能なので、
属性を処理するにはリフレクションを駆使する必要がありクソ面倒臭い
フレームワーク作る人のための機能
2018/03/03(土) 15:09:36.90ID:SBEkwl3H0
ふらっと C#,C♯,C#(初心者用) Part136
http://mevius.5ch.net/test/read.cgi/tech/1520057345/
2018/03/03(土) 15:25:54.77ID:9mjwXL/k0
>>985
どうも
2018/03/03(土) 16:48:44.55ID:gHPIEkfR0
>>980
HasErros!!!
常に真だな
2018/03/03(土) 16:55:57.03ID:jgGrGcb50
>>983-985
デコレータ自体を実現しようとするなら厄介よね、一般的なデコレータに相当するもので良ければ
@propertyならC#プロパティがあるし、@classmethodや@classmethodならstatic修飾子で済むんだけど
実装に関わってきそうなのはデリゲートとかかな、Pythonで言えばbound/unbound methodに相当する
2018/03/03(土) 17:36:42.16ID:gHPIEkfR0
デコレーターをC#で実現するなら
インターフェース使って素直にパターン実装するか
横断的関心事なら属性使うかのどっちかじゃない?
使いたい目的次第
2018/03/04(日) 02:14:29.34ID:DWVE2Vb50
2018/03/04(日) 02:14:43.92ID:DWVE2Vb50
993デフォルトの名無しさん (ワッチョイ 6775-LhZF)
垢版 |
2018/03/04(日) 08:15:41.15ID:J/ZR4f1P0
994デフォルトの名無しさん (ワッチョイ 6775-LhZF)
垢版 |
2018/03/04(日) 08:16:54.70ID:J/ZR4f1P0
995デフォルトの名無しさん (ワッチョイ 6775-LhZF)
垢版 |
2018/03/04(日) 08:17:03.97ID:J/ZR4f1P0
996デフォルトの名無しさん (ワッチョイ 6775-LhZF)
垢版 |
2018/03/04(日) 08:18:43.29ID:J/ZR4f1P0
997デフォルトの名無しさん (ワッチョイ 6775-LhZF)
垢版 |
2018/03/04(日) 08:18:57.30ID:J/ZR4f1P0
998デフォルトの名無しさん (ワッチョイ 6775-LhZF)
垢版 |
2018/03/04(日) 08:21:21.48ID:J/ZR4f1P0
999デフォルトの名無しさん (ワッチョイ 6775-LhZF)
垢版 |
2018/03/04(日) 08:24:24.96ID:J/ZR4f1P0
1000デフォルトの名無しさん (ワッチョイ 6775-LhZF)
垢版 |
2018/03/04(日) 08:26:06.35ID:J/ZR4f1P0
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 27日 10時間 23分 38秒
レス数が1000を超えています。これ以上書き込みはできません。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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