「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください
>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。
■関連スレ
C#, C♯, C#相談室 Part93
https://mevius.5ch.net/test/read.cgi/tech/1492818720/
■前スレ
ふらっと C#,C♯,C#(初心者用) Part137
https://mevius.5ch.net/test/read.cgi/tech/1523004019/
■コードを貼る場合は↓を使いましょう。
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
ふらっと C#,C♯,C#(初心者用) Part138
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 369a-msj4)
2018/06/05(火) 19:32:42.28ID:70UTtyrn092デフォルトの名無しさん (ワッチョイ a98a-Duqg)
2018/06/12(火) 08:51:11.88ID:l+dIOx6V0 デバイスドライバーみたいに処理をチェーンさせるってのもあり
93デフォルトの名無しさん (ブーイモ MM05-BJSQ)
2018/06/12(火) 09:12:16.14ID:HMj9ZmCFM スクリプト言語のインタプリタなんかでも巨大switchが普通だぞ
断言するが、先を見通せない状況でヘタにコマンドパターンとか入れても、後で横断的な変更が多発して
すべてのコマンドクラスに手を入れて回るアホみたいな作業に追われることになるだけ
断言するが、先を見通せない状況でヘタにコマンドパターンとか入れても、後で横断的な変更が多発して
すべてのコマンドクラスに手を入れて回るアホみたいな作業に追われることになるだけ
94デフォルトの名無しさん (ワッチョイ 1311-V68u)
2018/06/12(火) 10:49:11.67ID:Blmm4zE90 コード増加はともかく予約を変更すんな・・・
95デフォルトの名無しさん (アウアウエー Sa23-SCrG)
2018/06/12(火) 11:04:17.10ID:O2DKnY7ra >>90
どっちにしろ「便利な関数なんかないでしょうw
ちっとも汎用的じゃない処理をエレガントに書く方法なんか用意されてるはずがないw
泥臭い物は泥臭く書くしかないかと
オペコードがそれ以上分解できない前提で
(1) オペコードをenumにキャストしてswith、でも
(2) ジャンプテーブル(デリゲートの配列)を使う、でもお好みで
もし仮に受信するデータが常にこちらから要求したデータである、
つまり、どういうデータが送信されてくることをこちら側が期待しているか事前に分かっている場合は
別の方法論もあると思う
その場合はこちらがリクエストを出す段階で、期待する種類のデータだけを読解できるオブジェクトを
生成してタイムアウト付きで待機させればいい
どっちにしろ「便利な関数なんかないでしょうw
ちっとも汎用的じゃない処理をエレガントに書く方法なんか用意されてるはずがないw
泥臭い物は泥臭く書くしかないかと
オペコードがそれ以上分解できない前提で
(1) オペコードをenumにキャストしてswith、でも
(2) ジャンプテーブル(デリゲートの配列)を使う、でもお好みで
もし仮に受信するデータが常にこちらから要求したデータである、
つまり、どういうデータが送信されてくることをこちら側が期待しているか事前に分かっている場合は
別の方法論もあると思う
その場合はこちらがリクエストを出す段階で、期待する種類のデータだけを読解できるオブジェクトを
生成してタイムアウト付きで待機させればいい
96デフォルトの名無しさん (ワントンキン MM53-7qxP)
2018/06/12(火) 12:12:37.91ID:yJ6G/fgzM97デフォルトの名無しさん (ササクッテロ Spdd-rXIk)
2018/06/12(火) 14:41:16.06ID:dH3jUIiRp それより、データの先頭を識別できるフォーマットにしたか?
98デフォルトの名無しさん (ワッチョイ 53c3-jpFx)
2018/06/12(火) 15:40:05.30ID:wFgJsw9E0 固定長なら先頭コード種類分のデリゲートを割り付けるってのもあるが、こればっかしは好みだな。
99前スレ976 (ブーイモ MMeb-tDoJ)
2018/06/12(火) 20:18:08.93ID:qsxFIdydM ありがとうございます。
ベタベタに書いてみます。
1バイトが1ビットごとのフラグになっている場合はビットマスクで一つずつ抽出するのが一般的でしょうか?
ベタベタに書いてみます。
1バイトが1ビットごとのフラグになっている場合はビットマスクで一つずつ抽出するのが一般的でしょうか?
100デフォルトの名無しさん (ワッチョイ 9361-6Jh4)
2018/06/13(水) 22:29:58.82ID:T96Fk9Se0 SQLについて質問ですが
INSERT INTO T_USER (
ID, PASSWORD
) VALUES (
@ID, @PASSWORD
);
のINSERT分を
INSERT INTO T_USER (
ID = @ID,
PASSWORD = @PASSWORD
);
のように書く場合はどのようにしたらよいでしょうか。
INSERT INTO T_USER (
ID, PASSWORD
) VALUES (
@ID, @PASSWORD
);
のINSERT分を
INSERT INTO T_USER (
ID = @ID,
PASSWORD = @PASSWORD
);
のように書く場合はどのようにしたらよいでしょうか。
101デフォルトの名無しさん (ワッチョイ 8917-LHz9)
2018/06/13(水) 22:33:15.48ID:8SXHgjst0 スレチ
102デフォルトの名無しさん (ワッチョイ e9e3-HWv4)
2018/06/13(水) 22:40:13.78ID:dwe0uTDh0 そういうメソッド作ったらいいじゃん
setInsert(new dictionary略);
みたいなの
setInsert(new dictionary略);
みたいなの
103デフォルトの名無しさん (ワッチョイ c68a-3+MO)
2018/06/14(木) 08:40:57.01ID:tUkyOm+Z0 クラスの構造体(ただint型のデータが複数個しかない)をXMLに変換したいのだが
XMLSerializer以外に何かないかな?
XMLSerializerは以前にバグを起こしたことがあって使いたくないんだ
XMLSerializer以外に何かないかな?
XMLSerializerは以前にバグを起こしたことがあって使いたくないんだ
104デフォルトの名無しさん (ワッチョイ c211-jgxh)
2018/06/14(木) 09:14:05.32ID:o3acK5Uh0 >>100
UPDATEじゃないんだから・・・
UPDATEじゃないんだから・・・
105デフォルトの名無しさん (ラクッペ MM61-h/p3)
2018/06/14(木) 09:54:39.43ID:A8NrLUZ4M クラスの構造体…?
106デフォルトの名無しさん (ワッチョイ 42a4-/RsH)
2018/06/14(木) 11:31:35.89ID:/+f4Bre90 >>103
全手動
全手動
107デフォルトの名無しさん (ワッチョイ 2260-BQKd)
2018/06/14(木) 12:02:09.33ID:cv0ACSdK0 最終的に配列を書きだしたいのですが
それまでに色んなクラスのインスタンスからその配列の読み書きがされるのですが
どういうふうにクラスを作ればいいですか?
その配列はグローバルでstaticで宣言するか、インスタンス作るごとに参照を引き渡すのですか?
それまでに色んなクラスのインスタンスからその配列の読み書きがされるのですが
どういうふうにクラスを作ればいいですか?
その配列はグローバルでstaticで宣言するか、インスタンス作るごとに参照を引き渡すのですか?
108デフォルトの名無しさん (ブーイモ MMb6-OAOp)
2018/06/14(木) 13:20:39.46ID:NMzxKZ+IM >>107
日本語でおk
日本語でおk
109デフォルトの名無しさん (ブーイモ MM62-l11B)
2018/06/14(木) 14:19:07.38ID:KBTpBKAkM110デフォルトの名無しさん (ササクッテロ Spf1-8opj)
2018/06/14(木) 15:31:16.28ID:fa4YRdZnp アクセス関数を作ってインスタンス取得用に一つスタティック関数を用意するだけ。
アクセス関数介さないと、排他処理とかいちいち入れるの面倒だぞ。
アクセス関数介さないと、排他処理とかいちいち入れるの面倒だぞ。
111デフォルトの名無しさん (スプッッ Sd61-3+MO)
2018/06/14(木) 17:22:37.66ID:Omv9hEYDd 初歩的な質問なんだけど
プロパティ?(get;set;)ついてるやつと、ついていないやつの差がわからないから教えてほしい
プロパティつけててもprivateはアクセスできないみたいだから
結局、両方ともpublicになって何が違うん?ってなってる
プロパティ?(get;set;)ついてるやつと、ついていないやつの差がわからないから教えてほしい
プロパティつけててもprivateはアクセスできないみたいだから
結局、両方ともpublicになって何が違うん?ってなってる
112デフォルトの名無しさん (ワッチョイ 2e9a-gvEZ)
2018/06/14(木) 17:40:33.14ID:T0JMmz9y0 >>111
プロパティにするとメソッドを組み込めたりgetとsetでアクセスレベル変えられたり
あと取りあえずこの辺とか
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/properties
特定のソースで何が変わるの?って言う話なら書いた人に聞かないと分からない
プロパティにするとメソッドを組み込めたりgetとsetでアクセスレベル変えられたり
あと取りあえずこの辺とか
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/properties
特定のソースで何が変わるの?って言う話なら書いた人に聞かないと分からない
113デフォルトの名無しさん (アウアウウー Saa5-m0US)
2018/06/14(木) 17:41:27.02ID:im2Z0uooa クラスのメンバーでプロパティじゃない変数はフィールドと言う
フィールド (C# プログラミング ガイド)
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/fields
プロパティ (C# プログラミング ガイド)
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/properties
フィールドは代入も参照も同じ制限になる
プロパティは別々に設定できる
しかもgetだけ setだけというのも可能
フィールド (メンバ変数) とプロパティはここが違う
https://code.msdn.microsoft.com/windowsdesktop/5-5f828cde
フィールド (C# プログラミング ガイド)
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/fields
プロパティ (C# プログラミング ガイド)
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/properties
フィールドは代入も参照も同じ制限になる
プロパティは別々に設定できる
しかもgetだけ setだけというのも可能
フィールド (メンバ変数) とプロパティはここが違う
https://code.msdn.microsoft.com/windowsdesktop/5-5f828cde
114デフォルトの名無しさん (ワッチョイ d2eb-hrcC)
2018/06/14(木) 18:59:14.79ID:UejGuppF0 クラスのプロパティに「型」を変数みたいにおけますか?
外部から「型」をセットして、クラスの中でその型を使って new して実体を作って利用したいのです。
外部から「型」をセットして、クラスの中でその型を使って new して実体を作って利用したいのです。
115デフォルトの名無しさん (ワッチョイ d2eb-hrcC)
2018/06/14(木) 19:03:10.93ID:UejGuppF0 気持ちをコードで表すと
public class Test
{
public <T> PersonClass;
public void Unko()
{
var p = new PersonClass();
p.unko();
}
}
ってな感じです。
※PersonClass にメソッド unko() がある前提
public class Test
{
public <T> PersonClass;
public void Unko()
{
var p = new PersonClass();
p.unko();
}
}
ってな感じです。
※PersonClass にメソッド unko() がある前提
116デフォルトの名無しさん (スップ Sdc2-bwM/)
2018/06/14(木) 19:09:01.39ID:Cyktia16d117デフォルトの名無しさん (ワッチョイ 0699-pByW)
2018/06/14(木) 19:15:40.41ID:5YiZsxt70118デフォルトの名無しさん (アウアウエー Sa4a-jhA2)
2018/06/14(木) 19:19:58.23ID:w+8RUA83a119デフォルトの名無しさん (ワッチョイ 41da-4dYe)
2018/06/14(木) 19:26:49.09ID:dsNhKni40 >>99
enumにFlagsAttributeを付ける
[Flags]
enum Hoge : byte
{
Bit0 = 1 << 0,
Bit1 = 1 << 1,
Bit2 = 1 << 2,
Bit3 = 1 << 3,
Bit4 = 1 << 4,
Bit5 = 1 << 5,
Bit6 = 1 << 6,
Bit7 = 1 << 7,
}
var hoge = Hoge.Bit1 | Hoge.Bit4;
if ( hoge.HasFlag( Hoge.Bit3 ) )
{
enumにFlagsAttributeを付ける
[Flags]
enum Hoge : byte
{
Bit0 = 1 << 0,
Bit1 = 1 << 1,
Bit2 = 1 << 2,
Bit3 = 1 << 3,
Bit4 = 1 << 4,
Bit5 = 1 << 5,
Bit6 = 1 << 6,
Bit7 = 1 << 7,
}
var hoge = Hoge.Bit1 | Hoge.Bit4;
if ( hoge.HasFlag( Hoge.Bit3 ) )
{
120デフォルトの名無しさん (アウアウウー Saa5-l11B)
2018/06/14(木) 23:44:33.25ID:rYhQU2t8a >>119
そんな見てて痒くなる書き方しなくても今のC#は2進数リテラル使えるぞ
そんな見てて痒くなる書き方しなくても今のC#は2進数リテラル使えるぞ
121デフォルトの名無しさん (ワッチョイ 31b5-8opj)
2018/06/14(木) 23:56:40.66ID:9S9/LeJo0 1
2
4
8
16
32
64
128
でいいよ。
2
4
8
16
32
64
128
でいいよ。
122デフォルトの名無しさん (アウアウエー Sa4a-jhA2)
2018/06/15(金) 00:31:01.58ID:UuMD2cf2a >>119みたいなのならHexで書くのが一番だろうねw
少なくとも俺ならそうする
少なくとも俺ならそうする
123デフォルトの名無しさん (ブーイモ MM62-l11B)
2018/06/15(金) 01:23:47.16ID:hh/0fz+KM 10進よりマシだが一番ではない
2進があるならどう考えても2進が一番
2進があるならどう考えても2進が一番
124デフォルトの名無しさん (アウアウエー Sa4a-jhA2)
2018/06/15(金) 01:34:20.89ID:UuMD2cf2a 書いてみりゃ分かるよw
単に一つのビットだけ立っている値を列挙するなら2進リテラルは冗長過ぎる。
そもそも何のためにHexなんかあると思ってるの
2進リテラルっていうのは、例えば組み込みで7セグのパターンのテーブルを定義する時とか、
bit5-bit7みたいにニブル単位じゃないビット範囲のビットマスクを定義する時とかに使う
単に一つのビットだけ立っている値を列挙するなら2進リテラルは冗長過ぎる。
そもそも何のためにHexなんかあると思ってるの
2進リテラルっていうのは、例えば組み込みで7セグのパターンのテーブルを定義する時とか、
bit5-bit7みたいにニブル単位じゃないビット範囲のビットマスクを定義する時とかに使う
125デフォルトの名無しさん (ブーイモ MM62-l11B)
2018/06/15(金) 02:40:57.81ID:3RK99arqM 君にとってはCが頭に染み付いてるからそうかもしれないけど、
現に>>119にとっては分かりにくいからわざわざこんな書き方をしてるんだろう
今時のプログラマはC経験ない人も多いんだから実情に合わせることも必要
そういう連中を見下すのもいいけど老害呼ばわりされないように気をつけてね
現に>>119にとっては分かりにくいからわざわざこんな書き方をしてるんだろう
今時のプログラマはC経験ない人も多いんだから実情に合わせることも必要
そういう連中を見下すのもいいけど老害呼ばわりされないように気をつけてね
126デフォルトの名無しさん (アウアウエー Sa4a-jhA2)
2018/06/15(金) 03:02:28.24ID:UuMD2cf2a127デフォルトの名無しさん (アウアウエー Sa4a-jhA2)
2018/06/15(金) 03:07:31.98ID:UuMD2cf2a どーでもいいけど、こういう自分を客観視できない単細胞な奴がネトウヨとかなるんだろうね
128デフォルトの名無しさん (ワッチョイ ddc3-ttgq)
2018/06/15(金) 03:33:39.61ID:/sL5C1h/0 ネトウヨってつまりどういう定義なんですか
マンコ吸わせてくださいs
マンコ吸わせてくださいs
129デフォルトの名無しさん (ワッチョイ 2e81-h/p3)
2018/06/15(金) 06:19:02.91ID:9gOvrFZ50 5分かけて最後に煽っていくというだけで
自分が嫌ってるゴミと大差なくなっているというね
自分が嫌ってるゴミと大差なくなっているというね
130デフォルトの名無しさん (ドコグロ MM29-1Yxh)
2018/06/15(金) 07:16:26.72ID:Cd+XXhnVM 今どきビット演算なんてしてるやつはゴミ
131デフォルトの名無しさん (ドコグロ MM29-1Yxh)
2018/06/15(金) 07:16:57.07ID:Cd+XXhnVM これまで歩んだ人生がゴミ
132前スレ976 (ブーイモ MM62-C226)
2018/06/15(金) 07:27:20.01ID:A2l2tHW6M >>119
ありがとうございます
bitarrayってのがあるらしいんですけど、これって共用体とかに一括で代入できないんですかね
3バイトデータの内の下位1バイトは1bitごとのフラグなのでbitarrayで分解できそうなんですが
ありがとうございます
bitarrayってのがあるらしいんですけど、これって共用体とかに一括で代入できないんですかね
3バイトデータの内の下位1バイトは1bitごとのフラグなのでbitarrayで分解できそうなんですが
133デフォルトの名無しさん (ワッチョイ c211-jgxh)
2018/06/15(金) 09:16:33.32ID:rymWY0Tx0 そういえばちょっと疑問なんだけど、enum定義する時に>>119みたいにbyteとか指定するのは何か意味があるの?
指定したところでbyte型の変数に代入しようとしたらキャストしなきゃいけないし、やる意味がわからないんだけど
指定したところでbyte型の変数に代入しようとしたらキャストしなきゃいけないし、やる意味がわからないんだけど
134デフォルトの名無しさん (ワッチョイ 31b5-8opj)
2018/06/15(金) 09:22:49.39ID:BTgSia3a0 >>133
え?キャスト?
え?キャスト?
135デフォルトの名無しさん (ワッチョイ c211-jgxh)
2018/06/15(金) 09:45:21.99ID:rymWY0Tx0 >>134
え?
え?
136デフォルトの名無しさん (ワッチョイ 31b5-8opj)
2018/06/15(金) 10:04:23.68ID:BTgSia3a0 ああ、enumで作った型なんだからenum型になってるだろ。
受ける変数も同じ型じゃないとダメなのは当たり前。
受ける変数も同じ型じゃないとダメなのは当たり前。
137デフォルトの名無しさん (ワッチョイ e227-hwPK)
2018/06/15(金) 11:52:41.04ID:jCp8kGwY0 >>133
シリアライズとかネイティブとの相互運用目的
シリアライズとかネイティブとの相互運用目的
138デフォルトの名無しさん (ササクッテロ Spf1-8opj)
2018/06/15(金) 11:58:42.21ID:6Dx/uRsOp 動的にenumで作った型のsizeof求めりゃいいんだが、静的に解決しなきゃならない時は指定するしか無いって話だよな?
139デフォルトの名無しさん (ワッチョイ d2eb-hrcC)
2018/06/15(金) 12:03:59.97ID:AMC7cROI0 >>116-117
コンパイル時点で型が定まらない(実行時に型が決まる)ものを new する手段という風ですよね?
使えそうです。ありがとうございました。
あとは、外部から「型」を受け取って new するまでの間、保管しておきたいのですが
型を変数(プロパティ)に格納するにはどうしたらいいんでしょ
コンパイル時点で型が定まらない(実行時に型が決まる)ものを new する手段という風ですよね?
使えそうです。ありがとうございました。
あとは、外部から「型」を受け取って new するまでの間、保管しておきたいのですが
型を変数(プロパティ)に格納するにはどうしたらいいんでしょ
140デフォルトの名無しさん (スフッ Sd62-pByW)
2018/06/15(金) 12:20:55.24ID:NFN3YtCpd >>139
117はジェネリクスなのでコンパイル時には一応定まってるハズ。
型を変数に入れたいならインスタンス.GetType()か、typeof(型)で、Type型の値が取れるけど…
本当にやりたい事と、実装の方法(型を受け取ってインスタンスを作ってそのメソッドを呼ぶ)がズレてないか心配。
117はジェネリクスなのでコンパイル時には一応定まってるハズ。
型を変数に入れたいならインスタンス.GetType()か、typeof(型)で、Type型の値が取れるけど…
本当にやりたい事と、実装の方法(型を受け取ってインスタンスを作ってそのメソッドを呼ぶ)がズレてないか心配。
141デフォルトの名無しさん (ワッチョイ c211-jgxh)
2018/06/15(金) 12:25:49.54ID:rymWY0Tx0 >>137-138
なるほど、さんくす
なるほど、さんくす
142デフォルトの名無しさん (ワッチョイ d2eb-hrcC)
2018/06/15(金) 12:48:48.68ID:AMC7cROI0 >>140
ありがとうございます。
「型」を格納する変数の型は System.Type なんですね!!
やりたいことが出来ました!!
System.Type t = typeof(××フォーム); ← ここのところを公開して外部からセット
var f = (System.Windows.Forms.Form)System.Activator.CreateInstance(t);
f.ShowDialog();
ありがとうございます。
「型」を格納する変数の型は System.Type なんですね!!
やりたいことが出来ました!!
System.Type t = typeof(××フォーム); ← ここのところを公開して外部からセット
var f = (System.Windows.Forms.Form)System.Activator.CreateInstance(t);
f.ShowDialog();
143デフォルトの名無しさん (アウアウエー Sa4a-jhA2)
2018/06/15(金) 12:57:15.01ID:PdS4cleJa >>142
それさあ、キャストしてる時点で何の意味があるんだと思わなきゃw
それさあ、キャストしてる時点で何の意味があるんだと思わなきゃw
144デフォルトの名無しさん (ブーイモ MM6d-l11B)
2018/06/15(金) 13:10:18.30ID:VuRl2MkoM >>143
Showなどのフォーム共通の操作をしたいんだろう
基底クラスにキャストする分には意味はある
設計として正しいかどうかは別問題であり今の情報だけでは何とも言えないが、
君は自分の個人的な好みを一般常識であるかのように主張して相手の事情を理解しようとせず人を一方的に批判する傾向があるようだね
Showなどのフォーム共通の操作をしたいんだろう
基底クラスにキャストする分には意味はある
設計として正しいかどうかは別問題であり今の情報だけでは何とも言えないが、
君は自分の個人的な好みを一般常識であるかのように主張して相手の事情を理解しようとせず人を一方的に批判する傾向があるようだね
145デフォルトの名無しさん (ワッチョイ d2eb-hrcC)
2018/06/15(金) 13:16:34.24ID:AMC7cROI0 本当は自作インターフェースを持った「なにか」から派生するクラスなのですが
そこまで書くと行数が凄いことになるので、Form を例にさせてもらいました。
そこまで書くと行数が凄いことになるので、Form を例にさせてもらいました。
146デフォルトの名無しさん (ワッチョイ c2d2-bwM/)
2018/06/15(金) 13:30:43.12ID:/HLz/tc50 >>145
本当は何がしたいの?
本当は何がしたいの?
147デフォルトの名無しさん (アウアウエー Sa4a-jhA2)
2018/06/15(金) 13:36:49.24ID:PdS4cleJa148デフォルトの名無しさん (ワッチョイ d2eb-hrcC)
2018/06/15(金) 14:16:21.09ID:AMC7cROI0 >>146
基底クラスから派生したクラスを動的に生成します。
142 みたいな方法が出来ることを知らなかったので
switch 〜 case でクラスの種類だけ new() やってたところをキレイにします。
基底クラスから派生したクラスを動的に生成します。
142 みたいな方法が出来ることを知らなかったので
switch 〜 case でクラスの種類だけ new() やってたところをキレイにします。
149デフォルトの名無しさん (スフッ Sd62-pByW)
2018/06/15(金) 15:03:37.25ID:NFN3YtCpd >>145
それは自作インターフェイスに「『自作インターフェイスをもった何かのインスタンス』を返す関数」を定義しておいて、
何かの方で「その関数」を実装して、
呼び出す側では普通に「その関数」を使えば良いのではなかろうか。
抽象クラスと静的関数の方がキレイかな。
「その関数」のリストが作りたいなら、そこでやっとリフレクションで取ったらいいし。
いきなりCreateInstanceは宜しくないというか危ないし、後々、各小クラスでコンストラクタがどうしようもない状況に陥ると思うよ。
それは自作インターフェイスに「『自作インターフェイスをもった何かのインスタンス』を返す関数」を定義しておいて、
何かの方で「その関数」を実装して、
呼び出す側では普通に「その関数」を使えば良いのではなかろうか。
抽象クラスと静的関数の方がキレイかな。
「その関数」のリストが作りたいなら、そこでやっとリフレクションで取ったらいいし。
いきなりCreateInstanceは宜しくないというか危ないし、後々、各小クラスでコンストラクタがどうしようもない状況に陥ると思うよ。
150デフォルトの名無しさん (ワッチョイ c29d-zq67)
2018/06/16(土) 00:47:26.32ID:i9Db63x30 Dynamicは黒歴史ですか
151デフォルトの名無しさん (ワッチョイ 9d17-Bw3Y)
2018/06/16(土) 08:04:12.32ID:axPFqDQY0 いいえ
152デフォルトの名無しさん (スップ Sdc2-bwM/)
2018/06/16(土) 08:10:11.50ID:YoGVHqI7d うんにゃ
153デフォルトの名無しさん (ブーイモ MM6d-l11B)
2018/06/16(土) 08:34:15.67ID:eKBdC14eM むしろ.NETのメインストリームがWebに移ってからはdynamic使われまくってる
JSONデータをたくさん扱ってるといちいち型付けてられない場面が多い
JSONデータをたくさん扱ってるといちいち型付けてられない場面が多い
154デフォルトの名無しさん (ワッチョイ 892b-z7gc)
2018/06/16(土) 09:57:30.72ID:fkqp7HMy0 自作のインタプリタ作った時に
Dynamic使った記憶がある
意図は・・忘れたww
Dynamic使った記憶がある
意図は・・忘れたww
155デフォルトの名無しさん (スップ Sdc2-bwM/)
2018/06/16(土) 10:02:21.77ID:v/kjTt9Bd >>153
jsonからクラスへの変換なんてVisualStudio使えば一瞬じゃない?
jsonからクラスへの変換なんてVisualStudio使えば一瞬じゃない?
156デフォルトの名無しさん (ドコグロ MM62-1Yxh)
2018/06/16(土) 10:04:46.66ID:ayiE9VmyM 大規模プロジェクトなら連想配列禁止は納得できる
157デフォルトの名無しさん (ワッチョイ c251-G00F)
2018/06/16(土) 12:20:07.70ID:omCaDuHT0 教えてください。
戻り値が async Task のメソッドで await を使わないと↓のような警告が出ます。
> CS1998 この非同期メソッドには 'await' 演算子がないため、同期的に実行されます。
> 'await' 演算子を使用して非ブロッキング API 呼び出しを待機するか、'await Task.Run(...)' を
> 使用してバックグラウンドのスレッドに対して CPU 主体の処理を実行することを検討してください。
独立したメソッドなら、await が必要ないなら async Task をやめて void にすればいいのですが、
仮想呼び出しなどの関係で戻り値を変更したくない場合の解決策に悩んでいます。
とりあえず、
[1] 警告を抑制する
[2] async だけ外して Task.CompletedTask を返す
という二つの解決策を思いついたのですが、どちらも到底正しい方法とは思えません。
いいアイディアがあれば教えてもらえると嬉しいです。
戻り値が async Task のメソッドで await を使わないと↓のような警告が出ます。
> CS1998 この非同期メソッドには 'await' 演算子がないため、同期的に実行されます。
> 'await' 演算子を使用して非ブロッキング API 呼び出しを待機するか、'await Task.Run(...)' を
> 使用してバックグラウンドのスレッドに対して CPU 主体の処理を実行することを検討してください。
独立したメソッドなら、await が必要ないなら async Task をやめて void にすればいいのですが、
仮想呼び出しなどの関係で戻り値を変更したくない場合の解決策に悩んでいます。
とりあえず、
[1] 警告を抑制する
[2] async だけ外して Task.CompletedTask を返す
という二つの解決策を思いついたのですが、どちらも到底正しい方法とは思えません。
いいアイディアがあれば教えてもらえると嬉しいです。
158デフォルトの名無しさん (アウアウウー Saa5-l11B)
2018/06/16(土) 12:52:10.42ID:Ws4rvThPa >>157
2が正しい
2が正しい
159デフォルトの名無しさん (ワッチョイ 31b5-8opj)
2018/06/16(土) 12:56:37.78ID:dmQidkOU0 同期的に結果が分かるものを非同期にして結果が欲しいとか、コールバックでも仕込んで別処理で結果得ないと正しい結果なんて分からないだろうに。
160デフォルトの名無しさん (ワッチョイ c251-G00F)
2018/06/16(土) 13:16:07.05ID:omCaDuHT0161デフォルトの名無しさん (ワッチョイ 0699-pByW)
2018/06/16(土) 13:59:46.72ID:VCIrJNT80 await Task.Run(()=>やりたいこと)
で済ますのはどうなんだろ。
で済ますのはどうなんだろ。
162デフォルトの名無しさん (アウアウウー Saa5-l11B)
2018/06/16(土) 14:16:04.53ID:Ws4rvThPa >>161
無駄にスレッド消費するしマルチスレッドによる不要なトラブルを持ち込む可能性もある最低最悪の方法
awaitを外したくないなら await Task.CompletedTask の方がクリーン
無駄にスレッド消費するしマルチスレッドによる不要なトラブルを持ち込む可能性もある最低最悪の方法
awaitを外したくないなら await Task.CompletedTask の方がクリーン
163デフォルトの名無しさん (ワッチョイ c251-G00F)
2018/06/16(土) 14:42:27.67ID:omCaDuHT0 >>161
レスありがとうございます。せっかくなのですが、私もその方法はあまり良くないと思います。
ご存知でしたら失礼を許していただきたいのですが、以下の2つの効果は同じではないのです。
async Task X() => Thread.Sleep(1000);
async Task Y() => await Task.Run(() => Thread.Sleep(1000));
>>162
確かに await Task.CompletedTask をどこかに挟むだけなら
変な副作用もなさそうですね。
ただ、警告を抑制するためだけに意味のないコードを加えるのは正しくないように思います。
私がそんなコードを見たら、await Task.Yield() のような効果を期待しているのかなと
誤解してしまいそうです。
(もちろん、 await Task.CompletedTask を勧めてくださっているわけではなく、
「await を外したくないなら」という無理のある前提に合わせて話してくださっていることは
理解しています)
レスありがとうございます。せっかくなのですが、私もその方法はあまり良くないと思います。
ご存知でしたら失礼を許していただきたいのですが、以下の2つの効果は同じではないのです。
async Task X() => Thread.Sleep(1000);
async Task Y() => await Task.Run(() => Thread.Sleep(1000));
>>162
確かに await Task.CompletedTask をどこかに挟むだけなら
変な副作用もなさそうですね。
ただ、警告を抑制するためだけに意味のないコードを加えるのは正しくないように思います。
私がそんなコードを見たら、await Task.Yield() のような効果を期待しているのかなと
誤解してしまいそうです。
(もちろん、 await Task.CompletedTask を勧めてくださっているわけではなく、
「await を外したくないなら」という無理のある前提に合わせて話してくださっていることは
理解しています)
164デフォルトの名無しさん (ワッチョイ 2ec9-Bw3Y)
2018/06/16(土) 14:59:09.83ID:ext5YZxs0 これあえて警告出しっぱなしじゃ駄目なのかね
IDEがasyncメソッドをawait無しで実行しているから警告しているだけであって、意図的に同期実行するのならコメントとかで明示しておけば良いような気もするけど
IDEがasyncメソッドをawait無しで実行しているから警告しているだけであって、意図的に同期実行するのならコメントとかで明示しておけば良いような気もするけど
165デフォルトの名無しさん (ワッチョイ c251-G00F)
2018/06/16(土) 15:23:38.22ID:omCaDuHT0 >>164
レスありがとうございます。
たかが警告を消すために実際のコードを書き換える必要があるのかという考えは
実にごもっともだと思います。
ただその場合、警告を抑制するだけでも意図は十分に伝わると思うのですが、
やはり警告はそのままにしてコメントなどで説明を行うべきなのでしょうか。
レスありがとうございます。
たかが警告を消すために実際のコードを書き換える必要があるのかという考えは
実にごもっともだと思います。
ただその場合、警告を抑制するだけでも意図は十分に伝わると思うのですが、
やはり警告はそのままにしてコメントなどで説明を行うべきなのでしょうか。
166デフォルトの名無しさん (アウアウエー Sa4a-jhA2)
2018/06/16(土) 15:24:59.98ID:gQX30pFpa #pragma warningディレクティブ使って警告を抑止するのが一番素直のような気がする。
知らんけど
っていうか、asyncなしで問題ない前提なら最初から何も悩む必要ないと思うんだけど...
知らんけど
っていうか、asyncなしで問題ない前提なら最初から何も悩む必要ないと思うんだけど...
167デフォルトの名無しさん (ワッチョイ c251-G00F)
2018/06/16(土) 15:35:00.89ID:omCaDuHT0 >>166
レスありがとうございます。やはり警告の抑制も選択肢になりますよね。
警告を抑制することに対する考え方は人それぞれということもあると思いますので、
その都度状況に応じた対処法を考えるのが一番でしょうか。
> っていうか、asyncなしで問題ない前提なら最初から何も悩む必要ないと思うんだけど...
申し訳ありません。これについてよく意味が理解できませんでした。
詳しくご説明していただけないでしょうか。
レスありがとうございます。やはり警告の抑制も選択肢になりますよね。
警告を抑制することに対する考え方は人それぞれということもあると思いますので、
その都度状況に応じた対処法を考えるのが一番でしょうか。
> っていうか、asyncなしで問題ない前提なら最初から何も悩む必要ないと思うんだけど...
申し訳ありません。これについてよく意味が理解できませんでした。
詳しくご説明していただけないでしょうか。
168デフォルトの名無しさん (アウアウエー Sa4a-jhA2)
2018/06/16(土) 15:46:13.12ID:gQX30pFpa >>167
ごめん後者アホなこと言いましたw
よく考えてみたら、asyncが付くかどうかはただのメソッドの中の実装によって決まる話であって、
ベースクラスやインターフェイスによってそれが強制されることはないよねw
普段深く考えずに使ってることがばれちゃったw
ごめん後者アホなこと言いましたw
よく考えてみたら、asyncが付くかどうかはただのメソッドの中の実装によって決まる話であって、
ベースクラスやインターフェイスによってそれが強制されることはないよねw
普段深く考えずに使ってることがばれちゃったw
169デフォルトの名無しさん (ワッチョイ 31b5-8opj)
2018/06/16(土) 16:13:25.34ID:dmQidkOU0 なぜ同期させているのかが根本的に分かって無いから、警告を解く事だけに注意が向いてるんだな。
同期が必要ならコードどころか構造を変えるくらいしないてならないだろうに。
同期が必要ならコードどころか構造を変えるくらいしないてならないだろうに。
170デフォルトの名無しさん (ワッチョイ 4206-Bw3Y)
2018/06/16(土) 17:10:20.97ID:b9GFXH4k0 状況把握しきれていないが
async()=>{}という形でラムダにasyncつけることで解決できるケースもあるんじゃね?
async()=>{}という形でラムダにasyncつけることで解決できるケースもあるんじゃね?
171デフォルトの名無しさん (ワッチョイ c251-G00F)
2018/06/16(土) 17:13:04.67ID:omCaDuHT0 >>167
ご説明ありがとうございます。 >>166 で仰っていた意味が理解できました。
async/await は糖衣構文なので確かにベースクラスなどで使用が強制されることはありませんが、
深く考えずに使えるところが糖衣構文のいいところですし、
async を使うメソッドに XxxAsync という名前をつけることが推奨されていることからも、
事実上 async/await を使うかどうかはベースクラスに依存していると言っていいと思います。
これを踏まえて、改めて >>166 にお返事したいと思います。
> っていうか、asyncなしで問題ない前提なら最初から何も悩む必要ないと思うんだけど...
文法上は async なしでも問題ありませんが、コードの一貫性を考えると async を意図した
メソッドのオーバーライドで async なしは問題だと思います。
それにもかかわらず、たまたま実装上 await を全く使わなかっただけで
async の使用をとがめるような警告が表示されてしまうので悩んでいるのです。
>>169
レスありがとうございます。他の方のご意見も聞かせていただいて、
やはりこの警告は不適切で、警告を解くことだけに注意を向ければいいように感じてきています。
それに対して異論を唱えてくださっているようなのですが、勉強不足で仰っていることが
よく理解できていないので、申し訳ないのですが詳しく説明していただけないでしょうか。
ご説明ありがとうございます。 >>166 で仰っていた意味が理解できました。
async/await は糖衣構文なので確かにベースクラスなどで使用が強制されることはありませんが、
深く考えずに使えるところが糖衣構文のいいところですし、
async を使うメソッドに XxxAsync という名前をつけることが推奨されていることからも、
事実上 async/await を使うかどうかはベースクラスに依存していると言っていいと思います。
これを踏まえて、改めて >>166 にお返事したいと思います。
> っていうか、asyncなしで問題ない前提なら最初から何も悩む必要ないと思うんだけど...
文法上は async なしでも問題ありませんが、コードの一貫性を考えると async を意図した
メソッドのオーバーライドで async なしは問題だと思います。
それにもかかわらず、たまたま実装上 await を全く使わなかっただけで
async の使用をとがめるような警告が表示されてしまうので悩んでいるのです。
>>169
レスありがとうございます。他の方のご意見も聞かせていただいて、
やはりこの警告は不適切で、警告を解くことだけに注意を向ければいいように感じてきています。
それに対して異論を唱えてくださっているようなのですが、勉強不足で仰っていることが
よく理解できていないので、申し訳ないのですが詳しく説明していただけないでしょうか。
172デフォルトの名無しさん (ワッチョイ c251-G00F)
2018/06/16(土) 17:18:42.84ID:omCaDuHT0 >>170
レスどうもありがとうございます。
このような返しばかりで情けないのですが、理解力が足りず仰っていることがよくわかりませんでした。
申し訳ありませんが詳しいご説明をお願いできないでしょうか。
レスどうもありがとうございます。
このような返しばかりで情けないのですが、理解力が足りず仰っていることがよくわかりませんでした。
申し訳ありませんが詳しいご説明をお願いできないでしょうか。
173デフォルトの名無しさん (ササクッテロ Spf1-8opj)
2018/06/16(土) 18:03:54.76ID:AoXX/TDlp 先ず、同期と非同期で何が違うのか、
同期は目的の処理を完了して戻って来る事が大前提で作られている。
非同期は目的の処理を行う指示だけをして戻って来る。
だから戻り値も自ずと意味が違って来るのが普通。
同期の戻り値は実行結果、非同期の戻り値は指示出来たかどうかで結果はまだ分からない。
そこを根本的に間違えているから、問題なんだよ。
同期は目的の処理を完了して戻って来る事が大前提で作られている。
非同期は目的の処理を行う指示だけをして戻って来る。
だから戻り値も自ずと意味が違って来るのが普通。
同期の戻り値は実行結果、非同期の戻り値は指示出来たかどうかで結果はまだ分からない。
そこを根本的に間違えているから、問題なんだよ。
174デフォルトの名無しさん (ブーイモ MM6d-l11B)
2018/06/16(土) 18:08:04.04ID:40YgBCHOM >>173
基底クラスやインターフェイスに合わせるためであったり、
後でDB使った実装に変更する予定で今はハードコードしておくみたいなときには普通にあるケースだよ
後で非同期に変えるのは影響が大きいからね
基底クラスやインターフェイスに合わせるためであったり、
後でDB使った実装に変更する予定で今はハードコードしておくみたいなときには普通にあるケースだよ
後で非同期に変えるのは影響が大きいからね
175デフォルトの名無しさん (ワッチョイ c251-G00F)
2018/06/16(土) 21:30:40.09ID:omCaDuHT0 >>173
レスどうもありがとうございます。
同期処理と非同期処理の違いは、一般論としてはおっしゃるとおりだと思うのですが、
それが >>174 でご指摘いただいているような目的を達成する上で障害になっていて、
そのような問題を解消するために async/await 構文が作られたのではないでしょうか。
だとすると、同期処理と非同期処理の違いを理由に await なしの async を
否定することは本末転倒のように感じてしまうのですがいかがでしょうか。
>>174
ご説明どうもありがとうございます。
具体例を含めてとてもわかりやすく感じたのでこのレスの前半で引用させていただきました。
私にはこれだけ要領よく説明することはできそうにないので助かりました。
レスどうもありがとうございます。
同期処理と非同期処理の違いは、一般論としてはおっしゃるとおりだと思うのですが、
それが >>174 でご指摘いただいているような目的を達成する上で障害になっていて、
そのような問題を解消するために async/await 構文が作られたのではないでしょうか。
だとすると、同期処理と非同期処理の違いを理由に await なしの async を
否定することは本末転倒のように感じてしまうのですがいかがでしょうか。
>>174
ご説明どうもありがとうございます。
具体例を含めてとてもわかりやすく感じたのでこのレスの前半で引用させていただきました。
私にはこれだけ要領よく説明することはできそうにないので助かりました。
176デフォルトの名無しさん (ワッチョイ 31b5-8opj)
2018/06/16(土) 21:44:52.43ID:dmQidkOU0 まあ、メイン処理止めていいなら待てばいいじゃない。
止めたく無いならポーリングやコールバックで終わったの知ればいいじゃない。
コーディングでワーニング出るから構造を弄るって手法そのものが間違いって言ってるの。
止めたく無いならポーリングやコールバックで終わったの知ればいいじゃない。
コーディングでワーニング出るから構造を弄るって手法そのものが間違いって言ってるの。
177デフォルトの名無しさん (ワッチョイ c251-G00F)
2018/06/16(土) 22:10:42.86ID:omCaDuHT0 >>176
メイン処理を止めたくないならポーリングやコールバックを明示的に記述する以外に
選択肢がないというように読めてしまったのですが、この部分に間違いはないでしょうか。
もしそうなら async/await 構文についてあまりお詳しくないようにお見受けしますので、
よろしければ一度お触りになってみてください。
非同期処理の大変さをご存知であればこそ、便利さを実感できるのではないかと思います。
(ちなみに、今の問題は非同期処理を行うことも可能なメソッドをオーバーライドする際に
非同期処理を全く使わないと警告が出てしまうということですので、
何かに妥協してメイン処理を止めるというわけではありません)
メイン処理を止めたくないならポーリングやコールバックを明示的に記述する以外に
選択肢がないというように読めてしまったのですが、この部分に間違いはないでしょうか。
もしそうなら async/await 構文についてあまりお詳しくないようにお見受けしますので、
よろしければ一度お触りになってみてください。
非同期処理の大変さをご存知であればこそ、便利さを実感できるのではないかと思います。
(ちなみに、今の問題は非同期処理を行うことも可能なメソッドをオーバーライドする際に
非同期処理を全く使わないと警告が出てしまうということですので、
何かに妥協してメイン処理を止めるというわけではありません)
178デフォルトの名無しさん (ワッチョイ c29d-zq67)
2018/06/17(日) 00:16:30.35ID:hCSOxZ9X0 そもそもasync修飾子そのものには、たんにawaitする目印としての意味しかないわけで
awaitしないメソッドをasyncにするのが根本的におかしいとしか思えんのだが
awaitしないメソッドをasyncにするのが根本的におかしいとしか思えんのだが
179デフォルトの名無しさん (ワッチョイ 2ee8-xBpi)
2018/06/17(日) 04:27:25.92ID:f8Zp6PCK0 wpfのフォームってhtmlとcssが合わさったようなもん?
180デフォルトの名無しさん (ワッチョイ c251-G00F)
2018/06/17(日) 05:09:52.71ID:w8cOZ/cU0 >>178
async Task Hoge() { }
↑は警告は出るもののコンパイルできますが
Task Fuga() { }
↑はコンパイルすらできないので、async がたんに awaitするための目印というのは語弊があるのではないでしょうか。
async Task Hoge() { }
↑は警告は出るもののコンパイルできますが
Task Fuga() { }
↑はコンパイルすらできないので、async がたんに awaitするための目印というのは語弊があるのではないでしょうか。
181デフォルトの名無しさん (ワッチョイ edd3-Bw3Y)
2018/06/17(日) 10:24:51.50ID:g+98DwlT0 > async を使うメソッドに XxxAsync という名前をつけることが推奨されていることからも、
> 事実上 async/await を使うかどうかはベースクラスに依存していると言っていいと思います。
TAPはTaskを返す関数の実装にasync/awaitを強要せんし使う側も関知せんじゃろ
AsyncサフィックスなんてそれこそEAPの頃からの慣例でしかない
awaitを使わず何故か付いてるasyncよりTask.CompletedTaskを返すコードの方がよほど明確だと思うがね
> 事実上 async/await を使うかどうかはベースクラスに依存していると言っていいと思います。
TAPはTaskを返す関数の実装にasync/awaitを強要せんし使う側も関知せんじゃろ
AsyncサフィックスなんてそれこそEAPの頃からの慣例でしかない
awaitを使わず何故か付いてるasyncよりTask.CompletedTaskを返すコードの方がよほど明確だと思うがね
182デフォルトの名無しさん (ワントンキン MMe1-qG2Q)
2018/06/17(日) 11:46:32.45ID:IxLGC6rAM >>180
ただの目印と理解していいよ
asyncって目印を見つけたらメソッド内だけ文法をちょっと変えますねっていう取り決めなの
目印もなしに勝手に文法を変えられたら仕事にならん
だから目印が必要なの
目印を付けただけでエラーになると言うけど
目印を付けたら文法が変わるのだから同じコードでエラーが出たってなにもおかしくないだろう?
ただの目印と理解していいよ
asyncって目印を見つけたらメソッド内だけ文法をちょっと変えますねっていう取り決めなの
目印もなしに勝手に文法を変えられたら仕事にならん
だから目印が必要なの
目印を付けただけでエラーになると言うけど
目印を付けたら文法が変わるのだから同じコードでエラーが出たってなにもおかしくないだろう?
183デフォルトの名無しさん (ワッチョイ c251-G00F)
2018/06/17(日) 12:14:10.68ID:w8cOZ/cU0 >>181
レスどうもありがとうございます。
async Task SayHello3() { await SayHello(); await SayHello(); await SayHello(); }
async Task SayHello2() { await SayHello(); await SayHello(); }
async Task SayHello1() { await SayHello(); }
は問題ないのに
async Task SayHello0() { }
ではなく
Task SayHello0() { return Task.CompletedTask; }
と書かなければならないことに不自然さを感じていたのですが、
2つ目の SayHello0() を単独で見れば、おっしゃる通り何をしているかは明確ですし、
async に固執するのもあまり良くなさそうですね。
async はそのままにして警告を抑制する方法を提案してくださる方もいらっしゃいますし
私としてもそちらの選択肢を完全に切り捨てるまでの確信は持てていないのですが、
Task.CompletedTask を返す方法も決して悪いものではないと分かりとても勉強になりました。
>>182
確かにそのとおりですね。失礼いたしました。
ただ問題なのは、「目印を付けただけでエラーになる」のではなく、
「目印を付けないとエラーになるのに目印を付けても警告が残る」という点でして、
せっかくの目印の機能を気持ちよく使うことができず、どうしたものかと考えております。
レスどうもありがとうございます。
async Task SayHello3() { await SayHello(); await SayHello(); await SayHello(); }
async Task SayHello2() { await SayHello(); await SayHello(); }
async Task SayHello1() { await SayHello(); }
は問題ないのに
async Task SayHello0() { }
ではなく
Task SayHello0() { return Task.CompletedTask; }
と書かなければならないことに不自然さを感じていたのですが、
2つ目の SayHello0() を単独で見れば、おっしゃる通り何をしているかは明確ですし、
async に固執するのもあまり良くなさそうですね。
async はそのままにして警告を抑制する方法を提案してくださる方もいらっしゃいますし
私としてもそちらの選択肢を完全に切り捨てるまでの確信は持てていないのですが、
Task.CompletedTask を返す方法も決して悪いものではないと分かりとても勉強になりました。
>>182
確かにそのとおりですね。失礼いたしました。
ただ問題なのは、「目印を付けただけでエラーになる」のではなく、
「目印を付けないとエラーになるのに目印を付けても警告が残る」という点でして、
せっかくの目印の機能を気持ちよく使うことができず、どうしたものかと考えております。
184デフォルトの名無しさん (アウアウエー Sa4a-jhA2)
2018/06/17(日) 12:46:14.26ID:JpLAIDLea 結局質問者の疑問はこういうこと?
(1) サブクラスで非同期メソッドとして実装される可能性があるメソッドの名前は
Asyncでサフィックスすべきか?
(2) (1)がYesの場合、そのメソッドが非同期で実装されなくても(awaitを含まなくても)
asyncで修飾すべきか?
正解はYes-No?
理由は、非同期メソッドは使う側がそれを非同期メソッドだと理解している必要があるのに対し、
非同期メソッドじゃないものを非同期メソッドと誤認しても弊害はないから
もちろん不要な混乱を避けるために、「このメソッドは多態の都合上Asyncでサフィックスされてるけど
非同期メソッドじゃないよ」みたいなコメントは必要か?
(1) サブクラスで非同期メソッドとして実装される可能性があるメソッドの名前は
Asyncでサフィックスすべきか?
(2) (1)がYesの場合、そのメソッドが非同期で実装されなくても(awaitを含まなくても)
asyncで修飾すべきか?
正解はYes-No?
理由は、非同期メソッドは使う側がそれを非同期メソッドだと理解している必要があるのに対し、
非同期メソッドじゃないものを非同期メソッドと誤認しても弊害はないから
もちろん不要な混乱を避けるために、「このメソッドは多態の都合上Asyncでサフィックスされてるけど
非同期メソッドじゃないよ」みたいなコメントは必要か?
185デフォルトの名無しさん (ワッチョイ c251-G00F)
2018/06/17(日) 13:22:22.85ID:w8cOZ/cU0 >>184
整理していただきどうもありがとうございます。
(1) については実は疑問であるという認識をもっていたわけではなく、
ご指摘をいただくまで当然そうするべき事柄であると考えておりました。
(2) がまさに疑問点でして、(1) が Yes/No のどちらであっても
答えが得られると嬉しいと思っています。
> 非同期メソッドは使う側がそれを非同期メソッドだと理解している必要があるのに対し、
> 非同期メソッドじゃないものを非同期メソッドと誤認しても弊害はない
おっしゃる通りだと思います。(もちろん細かなオーバーヘッドが問題にならない場合の話ですが)
> 「このメソッドは多態の都合上Asyncでサフィックスされてるけど
> 非同期メソッドじゃないよ」みたいなコメントは必要か?
インターフェース等を介さずにメソッドを呼び出す可能性がある場合は
そのようなコメントがあると親切だと思いますが、
私としては、必ずしも必要ではないように思います。
整理していただきどうもありがとうございます。
(1) については実は疑問であるという認識をもっていたわけではなく、
ご指摘をいただくまで当然そうするべき事柄であると考えておりました。
(2) がまさに疑問点でして、(1) が Yes/No のどちらであっても
答えが得られると嬉しいと思っています。
> 非同期メソッドは使う側がそれを非同期メソッドだと理解している必要があるのに対し、
> 非同期メソッドじゃないものを非同期メソッドと誤認しても弊害はない
おっしゃる通りだと思います。(もちろん細かなオーバーヘッドが問題にならない場合の話ですが)
> 「このメソッドは多態の都合上Asyncでサフィックスされてるけど
> 非同期メソッドじゃないよ」みたいなコメントは必要か?
インターフェース等を介さずにメソッドを呼び出す可能性がある場合は
そのようなコメントがあると親切だと思いますが、
私としては、必ずしも必要ではないように思います。
186デフォルトの名無しさん (ワントンキン MMe1-qG2Q)
2018/06/17(日) 14:33:41.38ID:IxLGC6rAM >>183
気持ち良い悪いみたいな感覚の話にすると結論が出なくなる
・コードに統一感があったほうが気持ちがいい(俺はこの感覚がよくわからんが)
・使ってないものを使いますと宣言するのは気持ちが悪い
どっちも言い分としては間違いではないしどちらがより正しいかとも言えない
それは見た人によるとしか言えない
君が美しいと思って書いた統一感のあるコードは、俺からすれば必要のない無駄な記述の多い汚いコードに見えるかもしれない
それはさておき
asyncメソッドはTaskインスタンスの生成とスレッドの生成に繋がる可能性がある
インスタンスの生成はともかくスレッドを無駄に消費するってことはOS全体に負荷をかけることにも繋がりかねないので意味がないなら避けるべきだ
しかし文法上の間違いではないのでエラーと断言することもできない
間をとって警告を出すってのが妥当な落とし所じゃないかな
気持ち良い悪いみたいな感覚の話にすると結論が出なくなる
・コードに統一感があったほうが気持ちがいい(俺はこの感覚がよくわからんが)
・使ってないものを使いますと宣言するのは気持ちが悪い
どっちも言い分としては間違いではないしどちらがより正しいかとも言えない
それは見た人によるとしか言えない
君が美しいと思って書いた統一感のあるコードは、俺からすれば必要のない無駄な記述の多い汚いコードに見えるかもしれない
それはさておき
asyncメソッドはTaskインスタンスの生成とスレッドの生成に繋がる可能性がある
インスタンスの生成はともかくスレッドを無駄に消費するってことはOS全体に負荷をかけることにも繋がりかねないので意味がないなら避けるべきだ
しかし文法上の間違いではないのでエラーと断言することもできない
間をとって警告を出すってのが妥当な落とし所じゃないかな
187デフォルトの名無しさん (アウアウウー Saa5-m0US)
2018/06/17(日) 21:01:18.97ID:6Wp8R37qa ・スレッド生成
勉強してから言えよって思う
勉強してから言えよって思う
188デフォルトの名無しさん (ラクッペ MM61-h/p3)
2018/06/17(日) 21:08:29.24ID:rRGqqoATM あーこれゴミクズにありがちな燃えるコメントの仕方だわ
言い争いが始まるので、賢明な諸兄は3日ほどスレを閉じておくのがよろしい
言い争いが始まるので、賢明な諸兄は3日ほどスレを閉じておくのがよろしい
189デフォルトの名無しさん (ワッチョイ ddc3-ttgq)
2018/06/17(日) 21:15:10.69ID:Z+AbfkC70 静的メソッドの中で動的メソッドって呼び出せないってあるけど、自分のクラスのインスタンスのメソッドは呼び出せるの?教えて雑魚
190デフォルトの名無しさん (アウアウウー Saa5-m0US)
2018/06/17(日) 21:27:50.40ID:6Wp8R37qa > async Task SayHello3() { await SayHello(); await SayHello(); await SayHello(); }
> async Task SayHello2() { await SayHello(); await SayHello(); }
> async Task SayHello1() { await SayHello(); }
と書くより引数nで実行回数を渡してforループで制御したらいい
n=0でasync awaitのペアがあるにかかわらず一度も実行されないawaitのついたメソッドができる
勿論警告もでないし誰かの言う一貫性のある美しいコードじゃないか
> async Task SayHello2() { await SayHello(); await SayHello(); }
> async Task SayHello1() { await SayHello(); }
と書くより引数nで実行回数を渡してforループで制御したらいい
n=0でasync awaitのペアがあるにかかわらず一度も実行されないawaitのついたメソッドができる
勿論警告もでないし誰かの言う一貫性のある美しいコードじゃないか
191デフォルトの名無しさん (アウアウウー Saa5-m0US)
2018/06/17(日) 21:32:42.49ID:6Wp8R37qa わかってると思うけどawaitがついたメソッドに突入した時点で
内部が自動的に別のスレッドで実行されるわけじゃない
中に入っても最終的にタスクにたどり着かないと別スレッドはスタートしない
System.Threading.Thread.CurrentThread.ManagedThreadIdでスレッドIDがでるから確認したらいい
内部が自動的に別のスレッドで実行されるわけじゃない
中に入っても最終的にタスクにたどり着かないと別スレッドはスタートしない
System.Threading.Thread.CurrentThread.ManagedThreadIdでスレッドIDがでるから確認したらいい
192デフォルトの名無しさん (アウアウカー Sa69-qcd4)
2018/06/17(日) 21:38:25.64ID:7lB5BPvGa >>191
await後に書いた処理って元のスレッドに同期されると思ってたけど、awaitで実行されたスレッドのまま進むよね?
Formアプリであれ?invokeしなくていいの?って思った記憶ある。思い違いだったらすまぬ
await後に書いた処理って元のスレッドに同期されると思ってたけど、awaitで実行されたスレッドのまま進むよね?
Formアプリであれ?invokeしなくていいの?って思った記憶ある。思い違いだったらすまぬ
■ このスレッドは過去ログ倉庫に格納されています
