ふらっと C#,C♯,C#(初心者用) Part146
■ このスレッドは過去ログ倉庫に格納されています
!extend:checked:vvvvv:1000:512
次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為)
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください
>>980を踏んだ人は新スレを建てて下さい。>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。
■前スレ
ふらっと C#,C♯,C#(初心者用) Part145
https://mevius.5ch.net/test/read.cgi/tech/1570446977/
■関連スレ
C#, C♯, C#相談室 Part95
https://mevius.5ch.net/test/read.cgi/tech/1508168482/
■コードを貼る場合は↓を使いましょう。
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/
・Insider.NET > .NET TIPS - @IT
https://www.atmarkit.co.jp/ait/subtop/features/dotnet/dotnettips_index.html
・DOBON.NET .NET Tips
https://dobon.net/vb/dotnet/index.html
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured 文字列やバイナリを処理する辺りでswitchが出てくるのは仕方ないにしても、それ以外でswitch文が出てきたらほぼ設計ミスだろうな ごめん、入力を受け付けるようなものは使ってもミスでも何でもないな >>583
それでいいと思うなら、もうそれでいいよ。
switchが役立つと思う場面に出会ったことがないなら無理に使わなくていい。
普通にプログラミングの学習をしたり実際に何か作り始めれば、そう遠くないうちに役に立つと思える場面に出会うはず。 重複したswitchや長大なswitchが悪いのであってswitch全てが悪いわけではない
拡張するときに不便を感じたら多態に置き換えればいい >>583
使い道がないのはお前の存在も同じだから
中央線にでも飛び込んで死ね プログラミングに限らずどのフィールドでもそうだけど、
イキってる系の連中の主張は話半分に聞いておくのがいいと思うよw >>583
条件文をマッピングテーブルで置き換えるという古典的なリファクタリング方法の一つ
どちらかが常に優れてるわけではなく状況に応じて選択するもの
C#のバージョンや分岐の数によっては
コンパイラがswitch文をdictionaryのlookupに変換してる >>593
それ今は迷信
Roslyn移行後のC#コンパイラはswitchのcase数が多い場合はハッシュに基いた二分探索のようなコードが生成される >>578
同感
業務系アプリをブラウザで動かしたいっていう潜在要求は多いと思う >>594
Roslynから変わったのは文字列で分岐される場合のみの話
文字列比較でhash tableをlookupするんじゃなく
数値比較で事前にハッシュしたsort済みarrayをlookupするようになってる
細かい部分を抜きにすると数値をキーにしたSortedDictionaryのlookupと同じ
でこういうのは今の>>583には不必要な知識 流れよく分かんないんだけど
つまりenumで分岐して処理呼び出す場合はswitchと配列のどっちが何倍くらい速いの?
public static int Execute(this Test type, int value){
// 無難にベタ書き
switch(type){
case Test.One: return Method(value);
}
// 配列からメソッドを呼ぶ
return methods[(int)type](value);
}
こんな風にenumに処理持たせてやりたいんだ俺 ケースバイケース
どっちが早いのかは実測が基本
どっちも最適化等々で逆より早くなりうる可能性がある 単純な配列はいつでも最速だと思ってたが違うのか?
読むのが単なる値じゃなくて処理な時点で誤差レベルだと思うが 配列はちゃんと理解してないと境界値チェックが入って意外に遅くなることがあるよ
だいたい気にならんレベルだけど競技プロとかやるようなら結構影響してくる >>597
仮に配列使う方が効率的だとしてもenumの値に依存するような実装は論外でしょうw
やってはいけない、の見本みたいなもの 俺もCから入ったから配列にして呼び出す処理は昔はよく書いた
enumを配列の添字にするのもよくやった
処理速度気にする開発することは多少あるけど基本的にどっちもC#ではやらんな
enumに処理持たせたいって要件ならそれぞれの値ごとにclass作って継承させるかな?
詳細仕様次第ではあるけど
そんなんめんどくせってなるようなレベルならぶっちゃけどっちだって変わらん話なんだから好きにすれば?って思う >>597
delegateの配列で試してみたが
switchのほうが2~5倍くらい速かった
最適化できる度合いの違いかな 過去に散々既出だと思うけどdelegate自体がもともと重いんだろうね。
単なる関数ポインタとは違うから >>605
デリゲートでなくインターフェースを使っても>>604と同じ結果なのが謎だった enumの実装が書けたら違うことになってるかもな
でも今はいらない >>585
内部的なロジックミスにならんようにすればいいだけ
プログラムが長大になる原因はテキストを利用しないからだと思いますよ
1万行のプログラムが果たしてそれだけ必要なのか?って思います >>589
俺も思いますね
というか文法的な事でももっと改善してよって事多いですよね!
0<input<&&input<5→うぜー
0<input<5→これでいいだろうが >>609
範囲チェックの改善なんて散々議論されてるし今も要望で上がってる
気になるなら見てくればいいよ
なぜ未だに入っていないかとかもちゃんと説明されてる >>609
もうID変わってるだろうけど>>589なのだが、皮肉のつもりで言ったのが通じてないようだ。
switchの用途として>>583みたいなのでいいのではなんて言うのは圧倒的に経験が少ない証拠だろう。ちょっと慣れて自分でコードを書けるようになればそんなバカな発想はしなくなるよ。
そんな段階で>>609みたいな文法にケチつける前に、なんでその文法が必要なのか、何でそういう形式になってるのか理解する努力をしなよ。
C#のような後発の言語が生まれる過程では、君みたいな初心者が考えるようなことはとっくの昔に議論済みでそれらを踏まえた上で今の形がある。疑問を持つのは多いに結構だけど、往々にして言語の仕様が悪いのではなく、単に自分が無知なだけだから。 そもそもシリアライズするにしても=なんかつかいたかねえ >>611
俺も面倒
請求書送っていいなら訳つけてまとめてくるよ 最近の言語の傾向見てると
どっかの言語が導入すると移植のために?かどうかはわからんが
良し悪しに関わらず他の言語も実装される感じ JavaScriptとPHPに慣れたら多次元連想配列無い言語がオワコンに見えるようになった
しかし
var obj = getExExBigData();
↑超絶巨大データ(フォーマット・ドキュメント不明)
勘弁してくれよってのも事実
c#の未来はどうなるのか? DataGridViewで、Cellに不正な値が入力された場合はフォーカスの移動を禁止するようにしたいのですが、
以下の方法では、移動してしまいます。
移動させないようにするにはどうすればよいでしょうか。
private void dataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
if (String.IsNullOrEmpty(this.dataGridView[e.ColumnIndex, e.RowIndex].Value as string))
{
e.Cancel = true;
}
} >>617
CellChangingみたいな選択セル変更前のイベントが無かったっけ? >>617
この人だけじゃないけど、まずこういうところに質問投げる前に分岐がきちんと機能しているか確かめた方がいい
それの場合は this.dataGridView[e.ColumnIndex, e.RowIndex].Value as stringの内容確認
直接の回答としてはhttp://dobon.net/vb/dotnet/datagridview/cellvalidating.htmlを参考にして書き直せ
解説を入れると
DataGridViewでセルに直接値を入力した場合はフォーカスが変わるか.EndEdit()などしないと入力された値が反映されない
そのイベント自体そのために用意されているはず
だからそのメソッドの中で「dataGridView[e.ColumnIndex, e.RowIndex].Value」は入力する前のセルの値で
入力された値を参照したかったら「e.FormattedValue」を見ないといけない >>612
この言語って文字列操作に特化してるからテキストを利用するのって
全然普通だと思いますけどね。
後0<input&&input<10じゃないとだめなのは、何となくですが
数式はポーランド記法によって処理されることに関係しますか?
分かりませんけど。 >>622
a < b < cが出来ない理由は自分で演算子オーバーロードしてみたら簡単に分かるぞ
a < bの時点でbool値を返すからcとは比較できなくなる いや構文解析での段階の話(要は3項演算的な)だろうかなそれは関係ないと思う
まあ文字列操作に特化は意味不明だけど かぶった。関係ないっていったのは演算子オーバーロードのことね。 >>623
それは出来ない理由にはなってないんじゃないの?
あんまり自信はないが、
評価結果が数値 < 評価結果が数値
評価結果が数値 < 評価結果が数値 < 評価結果が数値
両者を別の演算として区別することはやってできないことはないはず。 >>627
既存のルールに新たに3値を並べて比較する構文を追加するとしたら、既存のルールを維持したまま、新たなルールに伴う考えうる様々な組み合わせについて明確で一貫性や完全性のあるルールを作らなければならないが、かなり複雑なものになるだろう。
やってやれないことはないにしても、デメリット(手間と複雑さや混乱)に見合うメリットがないから、ほとんどの人に望まれていないし、言語仕様として追加されることもないだろう。 こんなの簡単だろ
でもやっても凄いって言われないから
実装されないだろうな <・・・小文字だからC#の言語に従う
<・・・大文字なので特別に数学的記法とみなす
これでどうだろう if(a < x < b)
実はこれは言語機能をいじらなくても自作型で再現できる >>628
python で実現してるのに何を言ってるんだよw >>627
そりゃ実装すれば何だって可能だが、論理的な矛盾になるから無理なんだよ
演算子の優先順位と結合則で二項演算するのが原則なのに、そこを横紙破りしてしまったら誰も付いて行けない どうしてもやりたいなら$"3<{x}<5".Predicate()みたいなライブラリ作ればいいんじゃね >>634
文脈依存キーワードと何も違わないと思うよ a < x の値を独自クラスのインスタンスにできるならあとの < b はどうにでもなるだろうけど
そもそも前者って可能なんだっけ? >>637の答えがほぼ>>638ってことで良いですか?
また便利な情報を得てしまったわ >>640
比較演算子をオーバーロードするだけじゃない?
false相当の値か右辺の値を戻すようにして、併せてimplicitでboolを当てておけばifでも使えるはず a b x の型が int だったりしたとき、それオーバーロードできるんだっけ? C#のターゲットフレームワークってどういう仕様なんでしょうか?
わかりやすいサイト教えてもらえると助かります。
exe 4.5 dll 3.5
→ ビルドできるからok?
exe 3.5 dll 4.5
→ コンパイルエラー
ただし動的に読み込んだ場合は動いてるっぽい? wrapする型を定義して a < x < b できるようにしてみた
https://dotnetfiddle.net/FdQsX1
が、まあ使わない visual studio2019 30日たったら使えなくなったんだけど
無料じゃないの?
PC替えるまで以前のバージョンはずっと使えてたんだけど
2019は違うの?
無料版使い方おしえてください ボタンを押すと計算開始して結果をテキストボックスに表示する処理(数十秒かかります)
まずボタンを押してその処理がまだ終わってないうちに、またボタンを押すと次の処理がどんどん溜まっていくのですが、
これを防止する方法はないでしょうか
(例えばついボタンをダブルクリックをしてしまった時に1回表示してからまた同じ処理に入ってしまう)
ボタン押したら結果が表示されるまで全部のボタンのenabledをfalseにする処理入れてみたのですがこれではうまく回避できませんでした メインスレッドには実際にボタンを無効化する作業をしてもらわないといけないので
計算はasync/await等を使って別スレッドで行う >>651-652
正直まだ難しそうですががんばってみます。ありがとうございました。 >>653
何も難しくないよw
>ボタンのenabledをfalseにする処理入れてみたのですがこれではうまく回避できません
これは「重い処理」の後にそれをやってるからそうなる
ボタンのイベントハンドラで真っ先にEnabled = falseにすればそんなことは起こらない。 >>655
やったことないアホは黙ってた方がいいぞ
あと反論するならググってから反論した方がいい なぜかコードが貼れないので割愛するけど、実際にやって>>655が正しいことを確認した
当たり前の話だがw >>657
ググることもできずに頭悪いとしか書けないとか可哀想なやつだな
>>655みたいな誰でも思いつく方法でなんとかなってたら苦労はせんよ >>658
当たり前の話だが負荷かけてテストしてるよな? つくづく馬鹿な奴w
偉そうに他人様に命令する前に自分は実際にコード書いて確認したのかとw
まあ普通こんなレベルの話は確認するまでもないけどね どうでもいいけど
(1) Thread.Sleep
(2) Task.Delay
(3) ビジーループ
いずれのダミーを使ってもイベントハンドラの頭でEnabled = falseとすることで
ボタン連打によるイベントハンドラへの意図しない「再入」を抑止できることを確認した イベントを呼び出すのが毎回同じスレッドなんだから、>>655の方法で完璧に止まると思うけどな >>662
>(例えばついボタンをダブルクリックをしてしまった時に1回表示してからまた同じ処理に入ってしまう)
再入が問題じゃないって気づけよ
タイミングによってクリックイベントが2回キューイングされることがあるのが問題なんだよ ガイジに何を気付けって?
お前も方面が違うだけで同じガイジだな >>650
イベント処理に入る前にイベントハンドラを外しておくといい。button1.Click-=button_Clickみたいな感じで
ただValueChangedとかならともかくボタンで普通はやらないと思う。「enabledをfalse」になっているボタンでイベントが実行されるのはおかしい
計算処理を非同期に渡して計算が終わらないうちにEnabledを復帰させるとか変なことやっていないか?
EnabledでなくVisibleをfalse->trueに変えてみて確認したら?
動作に関しては他の人がいろいろ言っているようだけど一度ミニマムコード作って自分で動作確認するのが一番確実 private void button1_Click(object sender, EventArgs e) {
button1.Enabled = false;
//重い処理
button1.Enabled = true;
}
上のコードでもユーザーが最初のクリックをしてから
イベントハンドラが呼ばれてEnabled = falseが設定されて
さらにそれからクリックできなくなるまでの間に
複数回のクリックが発生する可能性がある
(Windowメッセージのキューに溜まる)
だからEnabled = trueに戻す前に
溜まったクリックイベントを流してやる必要がある >>663
イベントは非同期でキューイングされるから>>655では不完全
アマチュアレベルとか自分しか使わないならそれで良いけど不特定多数が使うようなソフトだとダメダメ
ID:59NEldNlaはコード書いて確認する姿勢は良いけど確認がザル過ぎる
てか、アプリ作ってたらこの手の経験はしてるはずなんだが… >>667
そんな必要ないってば...
君がOSのコード書く立場になってよく考えてよ。
君はメッセージをエンキューする時にウィンドウが無効化されているかどうか
ノールックでやっちゃうような間抜けなコード書くの?w
そんなのありえへん いやだから、無効化されるまでに2回以上キューにたまる可能性があるって話なんだが... よくわからんけど痛い人が大声で独演会をやっています 再現できるコードも示さずにこんな現象があるんだって書き続けるのは他でやれよ
それにかまう連中も荒らしと同じ
>>1を読んで理解してから書き込め 今日も仕事で新型コロナウイルスなんて騒ぎすぎだという老人の独演会を30分聞かされた
対策も必要ない死ぬ人は死ぬでいいじゃないかと言う話
老害しなないかな キューが溜まる派は、button1.Enabled = false;なし、かつ、非同期処理なしにすれば簡単に再現コードができるんだろう
でも現実には再現しないから困ってんだろうな キューが溜まる派は、button1.Enabled = false;なし、かつ、非同期処理なしにすれば簡単に再現コードができるんだろう
でも現実には再現しないから困ってんだろうな ちなみに念のためこんなのもやってみたが
//button1をクリックした後button2を連打せよ
private void button1_Click(object sender, EventArgs e)
{
Thread.Sleep(5000);
}
private void button2_Click(object sender, EventArgs e)
{
MessageBox.Show("Button Clicked !");
}
Win32に詳しくないので理由を与えることが出来ないけど、
この場合もメッセージボックスは1度しか表示されない >>676
完全スレ違いだけどそれはその老害の言ってることの方がただしいw
専門家はたいしたリスクないから騒ぎすぎだと言ってるのに
どっかの怪しいネットde真実クンの被害妄想を真に受ける奴がどうかしてるよ
こういうの認知バイアスって言うんだけどさ 一流の専門家wとWHOと各国の対応見る限り
誰かの方が認知バイアスかかってると思う
世の中でこういわれてるけど逆の方に○○と言うのを言って俺スゲーしたいのが老害 >>679
いや待て、ひょっとしてMessageBoxがフォーカスを奪うのが関係しているのかと思って
Console.WriteLine("Button Clicked !");
に変えてみたらなんと複数回表示されるなww
何てこったw
この現象は以下のコードで回避できた
private void button2_Click(object sender, EventArgs e)
{
if (button2.Enabled)
{
button2.Enabled = false;
Console.WriteLine("Button Clicked !");
}
Application.DoEvents();
button2.Enabled = true;
} >>675, >>677
だからテストするなら負荷かけろって話な
>>667の話を理解できてたらわかると思うんだが、>>671みたいな絶望的なアホもいるからなぁw >>681
WHOは声明で過剰反応するなと言ってる。
多くの伝染疾患の専門家の意見も同じ
各国政府の対応はよく言えば安全牌、悪く言えば役人や政治家の保身だね
テールリスクとしてはヤバいことになる可能性は確かにゼロではない。
その場合に誰も批判されたくないしね。
費用負担するのは納税者であって役人でも政治家でもないし でも新型ウイルスで色々と未知だから警戒するに越したことはないと思う メッセージボックスはボタンかキーボードが押されるまで待つ。
ダイアログの一種。 ■ このスレッドは過去ログ倉庫に格納されています