ふらっと 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 配列はちゃんと理解してないと境界値チェックが入って意外に遅くなることがあるよ
だいたい気にならんレベルだけど競技プロとかやるようなら結構影響してくる >>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は声明で過剰反応するなと言ってる。
多くの伝染疾患の専門家の意見も同じ
各国政府の対応はよく言えば安全牌、悪く言えば役人や政治家の保身だね
テールリスクとしてはヤバいことになる可能性は確かにゼロではない。
その場合に誰も批判されたくないしね。
費用負担するのは納税者であって役人でも政治家でもないし でも新型ウイルスで色々と未知だから警戒するに越したことはないと思う メッセージボックスはボタンかキーボードが押されるまで待つ。
ダイアログの一種。 >>670
1. Application.DoEvents()
2. PeekMessage()
3. await Task.Delay()
Task.Delay()使ってthrottle/debounceする高階関数を作っておくと毎回書かずにすむ 引数でリスト渡すけど要素を変更して欲しくない時って結局どうすりゃいいの?
Immutableは使えない環境の場合
ReadOnlyCollectionは引数の型としては想定してないみたいだけど、キャスト防ごうと思ったらこれしかないよね? >>682
今時Application.DoEvents()を手動で呼ぶとか…
それはともかく、Application.DoEvents()を呼ぶタイミング遅くない? 拡張メソッドにしろクラスをシリアライズするの面倒じゃん 質問お願いいたします。
カスタム日時書式指定文字列を使って、
例えば DateTime.Now.ToString("M月") と書けば、
今なら "2月" という文字列が受け取れます。
しかし、DateTime.Now.ToString("M") と書いても
"2" という文字列ではなく "2月1日" という文字列が返ってきてしまいます。
これは "M" という文字列が(カスタムでなく)標準の日時書式指定文字列と
解釈されてしまっているからのようなのですが、
DateTime.Now.ToString(...) のような書き方で
"2" という文字列を受け取ることは可能でしょうか。
もちろん DateTime.Now.Month.ToString() と書けば
"2" を得ることはできますが、IFormattable インターフェース経由で
文字列を取得したいという事情があり、
Month プロパティを使う方法は避けたいと考えております。
もし何かおわかりのことがあればご教授いただけると幸いです。
どうぞよろしくお願いいたします。 control.Enabled=true/falseって即時処理されるのか?
WM_ENABLEメッセージをキューにPostするだけなのでは。 >>695
おお!まさに探していたものです。
'escape' 等をキーワードにして検索を試していたのですが
少し的が外れていたようです。
本当に感謝です。どうもありがとうございます。
>>694
ご提案どうもありがとうございます。
ただ今回は IFormattable.ToString の引数だけを使って
文字列を取得したかったので、
% を使う方法を使わせていただこうと思います。 >>696
否定はできんけど、そんなことになってたらおそロシア しょーもない質問なんですが
起動時、必要なファイル(iniとか)を探して、無ければ起動しないというプロセスは
Form1_Load()にifでApplication.Exit()書いて強制終了にしてしまえば良いのでしょうか?
Form1_Load()の途中で強制終了はwindows的に無問題でしょうか? ■ このスレッドは過去ログ倉庫に格納されています