ふらっと C#,C♯,C#(初心者用) Part149
レス数が1000を超えています。これ以上書き込みはできません。
!extend:checked:vvvvv:1000:512
次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為)
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください
>>980を踏んだ人は新スレを建てて下さい。>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。
■前スレ
ふらっと C#,C♯,C#(初心者用) Part148
https://mevius.5ch.net/test/read.cgi/tech/1590578921/
■関連スレ
C#, C♯, C#相談室 Part94
https://mevius.5ch.net/test/read.cgi/tech/1553075856/
■コードを貼る場合は↓を使いましょう。
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/
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 HttpClientって使いづらいんだけどなんでWebClientやWebRequestは非推奨でHttpClientが推奨なの? >>4
エンコード指定出来ない点とか
別にそれでも問題にはならないけどだったらWebClientで良くない?ってなる まず、エンコードってもっと具体的に何のエンコードがはっきりしてくれんと
gzipやdeflat圧縮するcontent-encodingなのか、
chunked転送するcontent-transfer-encodingなのか、
はたまた、文字列送信したくて、その文字列のエンコードなのか..
まぁ、どのみちどれもできそうな気がするが すみません 教えてください
CPUの使用率を知るために、
Windows.System.Diagnostics 空間の
SystemCpuUsage class が使えると思うのですが、
SyatemCpuUsage cpuUsage;
result = cpuUsage.GetReport();
とやると、 実行時に systemCpuUsage がnull でした
と怒られ、
SyatemCpuUsage cpuUsage = new SystemCpuUsage();
result = cpuUsage.GetReport();
とすると
SyatemCpuUsage cpuUsageには、引数0を指定するコンストラクターは含まれていません
と怒られます。
Cpuの使用時間を知りたいのですがどのようにすればよいのでしょうか? SystemDiagnosticInfo.GetForCurrentSystemから
CPUの使用時間なら他にはSystem.Diagnostics.PerformanceCounter使うとか CPU使用率取得 c#
でコードが出てきたがこれでは動かない? var x = SomeClass.Create();
if( x?.BooleanProperty ){...}
の上手な書き方ってありますか?
↑はbool?とboolの違いで怒られます
if( x?.BooleanProperty == true ){...}
とかってスマートじゃない気がするんですが nullとfalse=NGの値が同じだから辛うじて動いてるだけの処理なのか
よくあるOK=0でそれ以外がエラーの処理でやっちゃうとおかしくなるから
そういうの書くのやめたほうがいーんじゃない?的な bool?の時は素直にtrueやfalseって書いた方が個人的に安心できる
まぁそんなことしなくて済むような構造にするのが一番だけど >>12は条件が逆のとき
null==falseで入るときあんじゃん?
ウンコちっくじゃん? 初心者は正しく誘導してやらないとな
間違いなくしなくていい省略をして
言語の機能に飛びついてウンコードを作ろうとしていたのを未然に防いだ
初心者スレはこうでなければ 仕様も確認せずにバグ作り込むアンポンタンしかおらんのかw
まず>>13への回答次第だろ >>20
今はミスしてもちゃんと代入になっていると警告してるから気にしないね。 >>23
むしろ左辺に定数書いてる奴見ると殺しそうになる。 別にそいつに危害を加えたくはない、というか関わりたくない
単に老害って哀しいなって思うだけ 老害云々以前にC#ではほぼ何の意味もないけど、
CでもC#でも==とすべきところを=と書いちゃったことなんか一度もないな。
普通はそうだよね。 今までタイプミスしたことないからこれからもしないと言うのは単なるアホ
ただ昔のコンパイラでは警告でなかったから一定の意味は「あった」けど、未だに言ってるのは単なる老害 >>31
C言語を使う前の言語って何だろう?
アセンブラならわかるけど。
必ず引き合いに出ると思う。 タイプミスてw
普通の人は画面見ながらコーディングするんだけどw
ひょっとすると==と打つつもりで=と打ったことはあるかもしれないが
それを見逃したことなど一度もない。
そもそもタイプミスは-キーのみで発生するわけではないので
理由になるはずがない。
申し訳ないけどこれ、昔も今も「羹に懲りてなますを吹く」以外の何物でもないよ。
そもそも「==の左辺に変数を書かない」などというルールを条件づけしたところで
その条件反射は間違って=を打ったところで発動しないのでは?w
っていうか同じ努力で「等価検査をしたい時は==」を条件づけられるだろうw こういう糞作法に疑問を感じない人はあれかね
+と打つつもりで*って打っちゃうかもしれないから
-+*/使わずにマクロでadd とかsubtractとか定義して使えって言われたら
納得して従うんかねwwwwwww >それを見逃したことなど一度もない。
それは「あなたが」でしょ?あなた以外の普通の人が見逃すことがないと断言できるわけはない。 VCの頃他の奴がやったときに結構見つけるまで苦労した覚えがあるけど
まあ、そんな頻度のあるバグではないな 等価演算子が == 以外の言語を使った事ないなら間違えないのかも VBA触った後にC系のコード書くとつい....ないってw
くどいようだけど、どっちにしろ条件づけ(条件反射)なので、
同じ条件づけなら直接的な方がいいに決まってるでしょ その手のbugはgimpel の pc Lint で潰していたな
lattice 時代からだから歴史の長いsoftだ まあエディタ環境もLintも貧弱だった2000年位までならヨーダ記法の採用にも一理はあるかもしれないけど
現代的な環境でC#を書くなら論外だわな
>>38みたいなことを言い出す奴は間違いなく老害かただの難癖野郎なのでプロジェクトに迎え入れちゃいけないし
万一抱えなきゃいけなくなったとしても若手に影響を及ぼすような仕事を与えてはならない いや、勝手にヨーダ記法を推奨していることにせんでくれる? >>36
お前がタイプミスを見逃すかどうかなんてどうでもいい
一般的なプログラマーの話だから >>45
> >>38みたいなことを言い出す奴は間違いなく老害かただの難癖野郎なのでプロジェクトに迎え入れちゃいけないし
お前はもう少し文章をちゃんと読む癖をつけたほうがいい
仕様書を勝手な解釈でバグ作り込むタイプだと思うぞw 日本人は精神論根性論に走りやすいし、そうでなくても
ヒューマンエラーをシステマチックに回避しようという発想自体は悪くない。
ただ、その方法論が有効かどうか評価せずに飛びつくのは愚か。
日本は精神論者も多いけど、こういう教条主義者も負けないぐらい多い。
==の左辺に〜なんて全然有効じゃない。 それを言っちゃあおしまいよな話だけど、
真面目な話==と=を間違えるような人は本質的にプログラミング向いてないんだよw
間違うかそんなの。
ズブの素人でも1週間もコード書いてれば「等価検査は==」って条件づけされるってw
if(までタイプした時点で条件反射が発動するでしょ まあ、でも定数値を左辺に書くことはメリットしかないからな
やれと言われればやることではある
ただ、規約にしてしまって
ソース中のやってない箇所を1つ1つチェックまでして直す価値はないと思う
あくまでなるべくそう書いた方がいいかな?レベル いくらメリットしかないって言っても規約に昇華されて
チェックまでさせようとする奴がいるとそいつが邪魔
定数値を左辺に書くよりそいつを排除することに力を入れたほうがいい
他にもやることはたくさんある
グローバル変数なくしたり、無意味なメンバ変数削除して引数にしたりと
優先順位が遥かに高いものが他にたくさんあるという前提は忘れてはならない >>51
一時間おきにVBとC#のコーディングやってみなはれ
VBでIf文の条件式をカッコでくくってエラーに悩むとか絶対あるから >>54
一時間おきにそんなことするプロジェクト稀だからそういう無意味な反論するなよ
時間の無駄 >>55
一般的には稀なのかもしれんがそういうのもある
単純に == と = を間違える奴はプログラミング不向きとか言ってるバカに試してみて欲しい >>52
不自然で読みにくい、という十分大きなデメリットがあるよ 2000年代に入った頃から過剰コンプライアンスが問題視されるようになった
(でも改善はされないのが日本という国だけどw)が、あれとよく似てるね。
入院患者の取り違えが起こっては大変と、毎日何度も何度も氏名生年月日を確認する。
携帯キャリアのサポートに携帯で電話してるのに「お客様のお電話番号を〜」
本当に意味あるのかそれw
欧米人は絶対にこんなことしないだろう。
ルールを忘れるからとルールを忘れても問題を起こさないためのルールを覚える。
ここに矛盾を感じない人は論理的思考能力に欠陥がある。
プログラマに向いてないよw そんなルールにこだわりたいのならテンプレくらい見てくださいね >>54
> VBでIf文の条件式をカッコでくくってエラーに悩む
それエラーにならないよ
単に ( ) で囲った式になるだけだから
言うなら逆に「Cでif文の条件式をカッコでくくらずにエラーに悩む」だろうね
と言うように人は必ず間違いを犯すものだとと思ったほうがいい
あとタイプミスの多寡とプログラマーとしての能力はあまり関係ない
優れたキーパンチャーは必ずしも優れたプログラマーとは限らない 定数値を左に書くのは20〜30年前の流行りで古臭いスタイル ユニットテストを身につけたいのですが、公式ドキュメントにあるxUnit、NUnit、MSTestのどれが主流なのですか?
https://docs.microsoft.com/ja-jp/dotnet/core/testing/ >>66
どれもそれなりに使われているから何とも言えない
というかそもそもドットネットドカタはテスト書かないのが主流なので差が出ないと言うべきか
まあ仕事ならどうせ現場に合わせるんだし、大した違いはないからどれでも好きなの覚えたらいい
個人的にはxUnitが好き >>65
それってなんなんですかね
switch文みたいにしたかったとかなんですか
? Cにはboolがないから
CのifはただのJZ(jump if zero)、つまり()の中の式の値がゼロかどうか見てるだけ
条件演算子の値は条件不成立時に0になる。1 == 2という式の値は0
a = 1という式の値は1 >>69
コンピューターリソースが少なく、IDEが今ほど快適じゃなかった だから正しいとは言ってないからねw
正しくないからw糞作法だからそれw
==を=にしてしまうミスだけを特別扱いする理由はどこにもない>>37 messageboxみたいにダラダラ長い関数は左辺に結果書くほうが見やすいだろ ダラダラと何日も役立たずのくだらない議論ごっこいつまでやってんだ >>73
引数の多い関数呼び出しをif文に入れるなよ
戻り値をローカル変数に入れればすむ話だろう System.Text.Jsonって非パブリックフィールド含められないの?
公式にはJsonInclude属性付ければできるみたいな事書かれてるけどprivateフィールドに付けたらクラッシュする
publicフィールドならちゃんと動作するが > 公式にはJsonInclude属性付ければできるみたいな事書かれてるけど
ちなみにどこで?
docsのJsonIncludeAttributeには
> Non-public properties are not supported.
って書かれてるけど
というかフィールドの方は触れられてもないのな 非パブリックって書いてあるけどpublicじゃんな C#の実行ファイルはexeなの?
linuxで実行する場合もexeファイルを起動するの? .NET Coreの話なら
dotnet publishでプラットフォームごとの実行ファイル作るよ
dotnet runだと作られたdllを起動する形になる .Net 5 SDKのみしか入れていない環境では、ビルドターゲットが.Net core 3.1になっているソリューションをビルドできないんですか?
今までのバージョンもこうでしたっけ・・・・? 過去の全てのバージョンをビルドできるようにしてったら
どんだけSDKが肥大化していくことやら booleanを返す関数があったとします。
例外発生時はfalseを返すものとして、
try-catchでの戻り値の返し方って
■パターンA
try{
・・・
return true;
}catch{
return false;
}
■パターンB
try{
・・・
}catch{
return false;
}
return true;
パターンAorBのどちらが主流とういうか分かりやすいでしょうか >>87
どっちでも大差ない気が。
ただいつでもAで書けるというか書くべきかは微妙だよね。
(基本的にはtryブロックに入れるのは例外発生が想定される行だけにすべき) try抜けたあとにも処理を書く場合とかエラー発生時はアーリーリターンって考え方だとBのがいいと思う WPFでdatagridを使った帳票アプリを作っていますがとても困っています
助けてください
やりたいこと
タッチ操作によるピンチイン、ピンチアウトをcanvasに追加したい
現在の状態(scrollviewer→canvas→datagrid)
問題点
この状態で canvasを拡大縮小する場合、Onmanipulation系のイベントを発生させたいが、scrollviewerやdatagrid上では、pannmodeがONだとスクロール以外のタッチ操作が効かない
(よくわかりませんが、この2つには最初からOnmanipulation系のイベントが実装されていて、e.handled=trueしてしまっているかららしい)ため拡大縮小機能を実装できない
現在
Microsoftの標準ライブラリのコードが載っているページからscrollviewerとdatagridのソースコードを見つけたため、
それぞれカスタムコントロールを作っているが、エラーが出て実装できない
教えて欲しいこと
標準ライブラリのソースコード(とtemplate)を使ってイチからカスタムコントロールを作りたいためやり方を教えてください
というかサンプルを貰えると嬉しいです
拙い文章で申し訳ないですがお願いします 見せたくない英数字の情報を外部ファイルで使いたいです。
テキストで作った情報を加工して外部ファイルにし、アプリではそれを読み取って使います。
英数字だと、バイナリでファイルに書き出しても中身見えますよね?
どうすれば簡単にできますか? >>91
バイナリで書き出すってどういうことを想定してる?英数字の文字コードをバイナリで書き込んだらそれは単なるテキストファイルだよ。
文字コードを簡単な暗号化アルゴリズムで暗号化してから書き出して読み出すときに復号化すればいいのでは? WPFってなんでも好きに作れなかったっけ?
カスタムもクソもお前が並べてコントロールデスって主張すればそれがその時点からそんなような?
スクロールバーとパネルにグリッド表示されたもん表示できれば完成でええのんか?この場合 カスタム云々は手段であって目的ではないです
カスタム云々言ってるのは標準ライブラリのコントロールをちょっとだけ修正したものを使いたいため、1個の手段かなと思って書きました
最終的な目的は>>93のdatagridをタッチ操作手間ズームできる機能です
て言うか WPFスレもあったのでこっちクローズして向こうで聞いた方が良さげですかね ビルドして動かしてみたけど、もうできてるんじゃないの?
DataGridが拡大・縮小されたけど。 >>91
用途が不明だけどテキストを暗号化するようなライブラリでも使って保存しちゃえば?
多少隠そうとしてもアプリが復号化したタイミングのメモリ覗かれたらバレちゃうけどね >>91
内容が簡単にはわからなきゃいいというレベルなら>>92の言うように暗号化すればいい
ガチでやるなら単体では無理
サーバー立ててそこから取得するとかするしかない >>96
タッチ操作で拡大縮小やりたいです
マウスのホイールではなく >>99
ノートPCのタッチパッドで試したけどタブレットだと動作しないってこと?
それなら環境ないので確認出来ない。 >>100
ノートだとできます!?
それは知りませんでした…
サーフェスgoで使用予定です >>95
それだと主張がよくわからない
datagridを改造する方針は諦めた上で1から作る話じゃねっけ?
それともdatagridを改造する方針はまだ生きてるの? WPFでタッチパネルによるズームや回転、Windows8が出たばっかりのころに
MSのサンプルをベースにして実験したけど、なんか落とし穴はあった気がしたけど
そんな難しくなかったような気が。
で当時ブックマークしておいたサンプルを見ようと思ったらもう消されちゃって残ってないのな。
MSって昔からほんとこういういらんことするよね。 >>102
手段は問いません
どちらの手段でもいいので助けて欲しいです >>90
自分はWPFは書いてるけど、タッチパネルのコードなんて書いたことないんで分からない
でも、以下の回答をコピペしたら何かのヒントになるかな?
How to enable both scrolling and zooming using pinch in WPF?
(意訳)どうしたらタッチ操作のスクロールと縮小拡大がWPFで出来ますか?
https://stackoverflow.com/questions/57659485/how-to-enable-both-scrolling-and-zooming-using-pinch-in-wpf
質問者が自分で答えてる
XAMLとMainのコードビハインドがあるから、試せまるよね?
ちなみに、カスタムコントロールは不要だから消した、とのこと WPF:GridやCanvasなどでマウスやタッチのイベントを拾うには?[C#/VB]
https://www.atmarkit.co.jp/ait/spv/1601/06/news027.html
タッチパネルとかやったことないからググったのを貼ってみる
違う話題だったらすまん >>90です
>>105のページを実装してかなり理想に近い形になりました
ただ問題として
・datagridのscrollviewer.panningmodeがNoneじゃないと拡大ができない
・C#側で指が2本になったらNoneにするようにするとうまく動作しない(1本目or2本目の指の変化量が取得できない?
3本目の指を使ってピンチインアウトは可能)
というところが残ってしまいました
manipulationdeltaのイベントをtouchmoveにするか、ダブルタップでズームモードとスクロールモードを切り替えるという形で妥協しようかなと思います
ありがとうございました 親が同じMdiフォーム同士で値参照を行いたいのですがpublic変数やメソッドを設定しても参照することが出来ずに困っています。
初回呼び出し時は参照できるのでいいのですが、1度開いた後だと呼び出せない状況です。
なにか解決方法はないでしょうか。 教科書的には
共有したい値を持てるプロパティを持つクラスAを作る
親フォームはAのインスタンスを保持し、各Mdi子フォーム作成時にAのインスタンスを渡す
Mdi子フォームはAのインスタンス保持し、必要に応じて値を取得設定する 値が入っていないとかならありえるけど、
呼び出せなくなる状況がわからん。
初回と開いた後で呼び出すのに違うメソッド使ってて、キャスト間違ったりしてない? >>108
率直に言って何を言ってるのかさっぱり分からんよw
プログラミング初心者なのは誰も責めないけど
説明能力欠如はNG。
能力以前に他人に理解してもらおうという努力と推敲の跡が全く感じられない。
それじゃ誰にも助けてもらえないよ。 WPFでドラッグ&ドロップ終了時に鳴るイベントって無いの?
!AllowDropな領域やウインドウ外でドロップすると何も捕捉できなくて困ってる
MouseLeftUpも捕捉できないし ウィンドウ外ってことは自分がドラッグ開始した側の場合?
DoDragDropから返ってきたタイミングがD&D操作の最終結果 >>115
綺麗さっぱり解決した、マジでありがとう
DoDragDropはドラック開始時に即結果返してくるもんだと勘違いしてて戻り値なんて全く気に留めてなかった
ドラッグ操作中はずっとDoDragDrop関数の中だったのか どうでもいいけど、イベントが鳴るって表現は初めて見たな
メジャーな表現なのか? Microsoft的には型が自明な変数はstringとかじゃなくvarを使えと言ってるけど未だになんか抵抗あるんだよな >>119
申し訳ありません、それは加齢による思考の柔軟性の欠如ですので老害と言われる前にこの業界から立ち去ることをお勧めします >>119はC#9.0のnew()構文を使う箇所に限っては今後許されるようになるなあ
といいつつ自分もC#のキーワードになってる型はvarじゃなく書きたいなあとも思う。書かないけど varなんて10年以上前からあるものに未だに抵抗があるってことは長期間OSS等の他人のソースを読んでいないってこと ってか書いた奴は自明( ・ิω・ิ)とか思っててもそうじゃないことが結構あるし
他のツールで検索したときやコメントになってる箇所はそれじゃヒットしないじゃんってなって
やるんかやらないんかで言ったらvarではなくちゃんと書いたほうがいいコードだと思う >>124
> ってか書いた奴は自明( ・ิω・ิ)とか思っててもそうじゃないことが結構あるし
IDE使ってないの? >>125
ちなみにIDE使っててもパッと見わかんないときない? お前が困ってないなら問題ないじゃん
今時IDE使わない変人は勝手に苦労させときゃいい
上司が老害でと言うならご愁傷さまだけど >>128
パッと見わかんないじゃん
パッと見
動かして見ないとわかりにくい系のコード最近できるだけ排除してんだよね俺
インターフェースも使うのやめた
switch caseで分岐のが綺麗で仕様もハッキリする つうかIDEにvarと型を一括置換してくれる機能あるんだから自分が読むときゃ好きな方に変換すれば良い
個人的には型がわかんなきゃ処理の流れが追いづらいのはvar以外に理由があると思うけど(命名が糞とか)
型がわかんなきゃいけない場面がそもそもレアケース じゃあ全部
List<object>とか
Dictionary<string,object>でいいじゃん
実際全部これで作ったことあるけど
わかってる間はいいよ 「型が自明ならvar使え」が正しいことは自明なので、
論点は自明じゃなくて自明にすることが難しいケースがあるかどうかだね。
ないことはないね。
もちろんそういうケースだってインテリセンスで型は分かるけど
明示的に型を書いてくれた方がありがたいこともある。 プログラムに綺麗って単語を使う人が総じてNET2.0止まりなのはC++じゃないC上がりとかなのかね c#はとっととhindley milner導入しろ派なので当然全部var使う >>133
> 論点は自明じゃなくて自明にすることが難しいケースがあるかどうかだね。
そうじゃないでしょ
var a = f();
って書くだけでf()の型を知らない限り自明じゃないけど論点は>>130が言うように型を知る必要がどれだけあるかどうかだと思うよ
個人的にはレアケースとまでは言わないけどそんなに多くないし必要な時でもIDEですぐにわかるから問題ないレベルだと思ってる >>139
「型が自明」って言うのは右辺の式を見ただけでその型が分かるって意味だよね?
君は右辺がメソッドなら型は自明じゃないと言いたげに聞こえるけどそんなことはない。
むしろそんなケースは少ない。
では型が自明じゃないケースというのは、
(1) メソッドの命名が不適切
(2) 返り値の型が過度に抽象的だったりその問題領域でたまにしか使われない型だったりした場合
(1)は改名で改善できるけど(2)はどうやっても不可避な場合がある。 本当はchar*なのに手抜きでvoid*はよく使ったから、varの濫用もありなのかもね。 >>141
> 君は右辺がメソッドなら型は自明じゃないと言いたげに聞こえるけどそんなことはない。
なら>>139のaの方を書いてよ
> むしろそんなケースは少ない。
根拠があるならどうぞ、ないなら君個人の経験だよね
> (1) メソッドの命名が不適切
ヒント情報ではあるけど確実じゃないよね
> (2) 返り値の型が過度に抽象的だったりその問題領域でたまにしか使われない型だったりした場合
それはたまにしか使われないから読み手が型を覚えてないってこと?
論点がちょっと違うように思う >>144
例えば.NETのライブラリのクラスのメソッドを見てみ。
メソッド名から戻り値の型が推測できないミスリーディグなのももちろんあるが、それは少数派。
大半はメソッド名から戻り値の型は推測できる。
ユーザーコードのメソッドも基本的はそうであるべきだしまともな人が書いたコードはそうなってる。
君、本当にプログラマ? 全然意味が違う
コンパイラはvarだろうが型名だろうが完全に同じ動きをする
コンパイル時の挙動も生成結果も全く同じ
ただの文字の置き換えに過ぎない まあ、こんな話はどうでもいい。
「論点は自明じゃなくて自明にすることが難しいケースがあるかどうか」なのは間違ってないし、
自明にできないケースが存在することも明らかに自明だ 俺は積極的にvarを使うが、
周りの奴には明示的に型を書いてほしい
お〜れ〜はジャイア〜ン、ガ〜キ大将 ていうか、varで置いとくメリットないよね
varで書いて改行か保存をトリガに元の型に勝手に直して欲しいレベル イテレータとかはvarで書かないと冗長過ぎる
他は型名でもどっちでもいいな >>145
そうあるべきとか言われてもねぇw
意識高い人はSystem.Collection.Generic.ListのRemove()とRemoveAll()の戻り値の型をきちんと把握してるんだろうね、俺には無理だわ
>>147
> 「論点は自明じゃなくて自明にすることが難しいケースがあるかどうか」なのは間違ってないし、
それは君の論点ね
俺としてはどうでもいい 「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
これ無視してどうしても雑談やくだらない議論ここでしなきゃならんの?
普通の人は117からこの書き込みまで全部あぼーんした方がいい さすがにメソッドの戻り値の型が自明じゃないが普通とか思ってる人とは
議論にならないよね。
っていうかこういう話が通じない人、自分より下ならいいけど
上司にいるとほんとつらいw >>2のリンク先に興味深いことが書かれていた
議論スレで議論すると論破されちゃうから、
初心者スレでマウント取った気になるらしい
とても腑に落ちた スレのルールも守らず>>2での議論ができないような奴の言うことは役に立たないと言える訳だな
無能だからここから出られない、と >>158
これ前も書いたけど、君がやってるそれがまさに「マウントを取る」
行為なんだけど自覚があるかな?w
間違いなくないよね。
これも前に書いたが、1っか月で150しかレスが付かない過疎スレで
何を目くじら立ててるわけ?
誰が困るの?誰も困らないよね?
単に人にケチをつけてマウント取りたいという卑しい動機で言ってるだけだろアホかほんと >>160
君らがそういう事してると初心者が気兼ねするって想像力もないのな
無能は無能な理由があるってことか >>164
ネットで吠えてるって、いきなり老害で去ったほうがいいとか言って吠えだしたのおまえだろww
数時間前の自分の発言すら忘れる馬鹿なの? 老害という言葉に激しく反応する老害
っていうオチかな?
>>157みたいに話しそらして逃げはじめたから吠えてるだけって揶揄されてる事ぐらいは理解しようねw プリントアウトしたり、秀丸で見ることを考えると明示の方がいいかな。 プリントアウトしたり秀丸で見るときに変換しとけばいいだけ
なんで少ない方に合わせなきゃならんのだ Dictionary<string, int> myDictionary1 = new Dictionary<string, int>();
var myDictionary2 = new Dictionary<string, int>(); null許容型関連の質問ですが、nullを許容しない型のデフォルト値はどういうものが適切なのでしょうか?
例えば、あるデータオブジェクトを指すクラスフィールドにコンストラクタ以降で設定する場合など 動作の仕様から考えないとでなくね?
nullを許容しないって理由も仕様に関わって来んじゃね? >>174
null許容/非許容と関係なく設定したい値の定義域の中に
そのクラスを使う時のデフォルト値として採用できるものがあるかどうかを考えるしかない
例えば「色」を設定するとして、指定がなければ何色をデフォルトにするのがいいかはケースバイケース
当たり前のこと過ぎるから本当に聞きたいことは違ってそうだけど >>174
デフォルトのまま使われた場合にどうなってほしいのかを考えるしかない。
ふつうは一番無難な動作になる値を選ぶだろうけど。 >>174
nullを許容しない型だから、値型の話だよね。
例示されいているオブジェクトを格納する型は
参照型だから関係ないよね。
値型でクラスフィールドにするものだと、
インスタンス数を記録するフィールドとかだけど、
このときは明白に初期値は0になるよね。
初期値が思いつかないフィールドなんかは、
ロジックを見直して使わないようにするのがいいと思う。
クラスフィールドならクラス内グローバル変数みたいなものだから。 >>180
> nullを許容しない型だから、値型の話だよね。
よく知らないなら無駄に絡んでくるなよ… すいません、ロートルなのでどこが知識不足なのかわかりません。
教えていただけませんか? すいません、ググりもしないで回答した愚か者でした。
余計なことを書いたことをお詫びします。 初歩的なことですみません。
Win10で項目のサイズを100%⇒125%にするとフォームが崩れてしまうのですがどこの設定をしたらよいのでしょうか >>186
WinFormを捨ててWPFで作り直す >>186
フォームが崩れるって具体的にどういうこと? >>189
winformいじればどんなアホでもわかる現象なのでお前はおよびじゃないよ >>194
むしろアホにしか起こせない現象だから俺には理解できないんだろうねw
賭けてもいい。
この無礼な馬鹿が自動スケーリングの仕組みを
ろくに理解せつに作り込んだバグと質問者の問題は恐らく異なる。 コードは意図した通りではなく書かれた通りにしか動かない。
文章も自分が何を伝えたいと意図したかではなく
文面に書かれていることだけが他人に伝わる。
後者を軽視する奴は100%プログラマとしても無能だ。
ポエムじゃないんだから読み手に想像力で補完してもらうことを期待するのは間違ってる >>195
説明なんか不要だろ
フォームにテキストボックスとボタンでも貼って倍率変えて実行するだけで
もうリソースエディタ?で配置した画面とは似ても似つかない画面が見えるんだから
これがわからないヤツなんてそもそもwinform触ったことすらねーだろそいつ
間違いなく質問者が聞きたいのはお前にじゃねーよw
何で知らないのにクビ突っ込んでくるのか?w >>186
項目のサイズを125%⇒100%にする >>186
フォームのプロパティ AutoScaleMode を デフォルトの Font から None に変える wpfの唯一と言っていほどのメリットが画面scaleへの対応
winformが根強く残っていてもこの手の問題へのヘルプが今まで山のように発生している
そういった背景を知っていればあの文章だけで十分に何が問題かは予測できる上に珍しい事例でもなんでも無い
それなのに自身の無知をさらけ出し、挙げ句の果に質問者の文章が稚拙であるかのような言い訳をするのはプログラマとして無能と言えるのではないだろうか? >>201
本気でそう思うならくだらないこと書いてないで質問者に代わって問題の詳細を
きちんと書いてくれ。
しかし馬鹿な奴だ。
何で>>197が沈黙してるのか想像力が働かないのか。
自動スケーリングはちゃんと理解してないとトラブルの元なのは確か。
しかしちゃんと理解して使えばそんな難しい話ではないし、
「フォームが崩れる」などというあいまいな表現で問題を特定できるほど
単純な話でもない。 まあ、まともな解決方法持ってないからね俺らw
というわけでこの話題が出ると荒れるのです >>151
>>>145
>そうあるべきとか言われてもねぇw
>意識高い人はSystem.Collection.Generic.ListのRemove()とRemoveAll()の戻り値の型をきちんと把握してるんだろうね、俺には無理だわ
だからそれが少数派って言ってんじゃないの?
全部把握しなければいけないみたいに言ってないよね 初心者 分からないので>>1のテンプレ読んで質問する
中級者 答えられる範囲で回答
上級者様 気持ち良くなるのが目的なのでスレ違いも厭わない
答えられない事も知ったかぶりして馬鹿にしたりトートロジーで誤魔化す
上級者 テンプレ>>1を理解しているので無駄な議論はせず的確に回答 >>205
よく使うクラスのよく使うメソッドでもそういう例があるって話
例外的なメソッドを言い出したらキリないし WPF初心者にはきついわ
検索できないとか存在しないとかエラーが謎 WPFの和書が皆無に近いもんな。秀和の分厚い奴も2019になってもいまだにFormsだし。 ガチでやろうとするとunityのが楽なんだよなぁ
こいつバックミュージック流しながら音なんねーし wpf言ってる間にそのうちmaui(mvu)が来ますよ stackoverflowがなければ初日でWPF投げてたと思う >>213
サンクスコ
知らなかった
「やっと」そんなのが出るのか、待ってたぜ
XAMLじゃなくてもC#コードビハインドだけでもUI描けるようだな
(WPFでも出来るけどな)
WPF使ってるけど、バインディングが本当にクソだわ
今までいろんなプログラミングしてきたけど、
ここまで行き詰まったことはなかった
今回こそは俺が非力ってことは認めるわ
それにしても、UWPが完全にスルーされてるのが笑えるw どうせ流行らずに勉強しても無駄になるんだろ!騙されないぞ! >>216
理想を追い求めて
糞になったパターンだね。
wpfは普通にMVVMでなくても書けるよ。
大半のライブラリーはMVVM使ってないしね。
WPFのメリットはいろいろ間口が広いってことだよ。 WinUI 3 って、WinForms と WPF を過去のものにして主流になると思う? >>218
MVVMってあれだけいろいろゴタゴタやって、恩恵は少ないよな(と俺は感じる)。
周りの人には受けが良くて褒められるけど、俺本人はギリギリでやってる、実は。
一つのクラスの内容を表示する時には何の問題も無い。
だが、二つのクラスの内容を表示しようとした途端に
それらをまとめるクラス作ったりせんといかんだろ?
毎回クソ面倒臭い。
あと、PropertyChangedとかNotifyとか、面倒臭い。
一応できるが俺の性に合ってない。 >>220
今はデスクトップアプリもWebベースで作るのが主流
もはや奪うパイがないんだよ >>205
たぶん言っても無駄。
その人の目的は「他人に食って掛かる」ことなのは一目瞭然だから。
本人は自覚してないと思うけどね。
とにかく他人が言ってることを否定することだけを目的としているから
全体として何が言いたいのかさっぱり分からない。 >>218
> WPFのメリットはいろいろ間口が広いってことだよ。
俺はデメリットだと思ってる
同じ事をやるのに複数の方法があるために余計わかりにくくなってる気がする >>224
> その人の目的は「他人に食って掛かる」ことなのは一目瞭然だから。
お前が言うなよ ⇒ >>195,203
> 本人は自覚してないと思うけどね。
ブーメラン過ぎるw >>222
electronもまだまだデスクトップを置き換えられるところまでいってないと思うが
どういう環境のことを言っている?
それともOffice365のようにデスクトップアプリの代わりにWebベースで置き換えることを言っている? >>227
VSCode、Slack、Teams、Skype
もうとっくに置き換わってるよ 自分の製品置き換えないでユーザーにそれ使えは言えないだろ 今時完全にスタンドアロンなアプリなんて絶滅危惧種でしょ
そもそもそれ言い出したらWinRTから始まりWinUI含め近年迷走を続けているWindowsのモダンUIって、
どうせ今時のネイティブアプリなんてバックエンドのWebサービスに対する薄い皮にすぎないんだからシンプルな必要最低限の機能があればいいよね、
という思想が根底にあるのだし reactive extensionってまだ存命なの?
async awaitだけやっとけばいい感じ? >>228
じゃあやっぱりelectronのことを言っているのか。
デスクトップアプリをこれから開発しようという時にFormsやWPFと同列に
electronが選択肢に挙がる?
前にやったことがあるけど、クロスプラットフォームにしたいとかどうしても
使いたいjsフレームワークがあるとかの理由でもなけりゃ、面倒くさすぎて
今のままじゃわざわざ使いたいとは思わなかったが。 普通にレイアウト強化したwinform2でも出してくれたら良かったのにな
webは別でやればいいのになんでくっつけようとするんだろう >>226
ね、言った通りでしょ。
こういう人、本人はまったく自覚がない。
どちらの言い分に分があるかは>>189からのやり取りを見れば一目瞭然。 >>234
electron選択肢に上がるけどな。
C#アプリでも、もうすぐWebView2が出るから楽しみに待ってるぞ。
なんだかんだでだんだんリッチなUIが求められるようになってるし、ブラウザコンポーネントでやるのは合理的だと思ってる。
枯れてきて安定もしてるし充分速いしな。
最近UIをブラウザで作ること多いけどなかなか便利よ。
embedIOでサーバ起こして、Process.startで開くとかやったり。
Xamarinに持ってったときも一切変更せずにAndroid側でWebView貼り付けて終わりにできたし。 >>236
自覚がないやつの戯言乙w
具体的な反論できないから一目瞭然とかで誤魔化すしかないのが哀れ Electronって.NET Coreの自前完結みたいにちょっとしたGUIアプリでも100MBくらいになるのは避けられないの? Electron用にパッチをあてたchromiumを含んでるから仕方ないね
node.js系はflockすら標準機能に無いのがもにょる edgeがchromium採用しているからそれを流用することって出来ないのかね msの人がwebview2使ったelectronもどき作ってた記憶あるけど忘れた >100MB
○avaみたいにランタイム別インスコよりは1つのEXEになってた方がマシ >>225
そうそう、一つだけどんな場面でも使えるかっちりした方法を用意してくれればいいのに、
〇〇の場合は方法1、△△の場合は方法2、みたいに場合分けがあるから分かりにくい
>>235
大賛成
WinFormの弱点を多少改善した版が欲しい >>246
最近思うんだけどそういうのって恐らくわざとやってない?
いいライブラリを作りたいんじゃなくて新しい仕様を出さないと入門書も売れないよねっていう 周りの部署や付き合いのある外注はみんな「ふつーWPF」って感じなんだが、
2chでだけいまだにこんなにFormsにこだわってる人を見かけるのがすごく不思議な感覚。 >>247
わざとやってるのかもね
MS社員が今年の目標として「新規に○○の機能を実装する!」とか掲げて、
クソ機能を実装して今年のノルマ達成、とかね
俺らからしたら大きなお世話なんだけどな
XAMLが絡むGUIの部分はそんな気がする
C#の言語仕様自体は良い具合に他言語の良いとこ取りしてて結構好きなんだけどな MSも子供の遊びじゃないんだからそんな幼稚な動機があるはずがないw
Silverlightは別物としてもWPF, Metro UI, UWPがコケた理由は単純に人、時間、金の投入量をケチって
周到さが足りなかったからだと思うよ。
Win32を作った時ぐらい気合を入れてたらもう少しマシなものが出来てたはず。
.NETやC#にも多少そういうところがあったよね。
頑張ればC#3(VS2008)を最初のバージョンにすることも出来たんじゃないか
どうでもいいけど「スレの趣旨と違う話をするな!」って人が現れないのは
きっとその人も話題に参加してるからだろうねw
言っても無駄だと思うけどそういうご都合主義を反省して欲しいよね 思えば、Vistaの時にWinFSなるものがとん挫する事件があったけど
あのあたりからMSはちょっとおかしくなってる気がするね。 >>249
その「レガシー」ってどういう意味で言ってるんだろうか。
今デスクトップアプリ開発するのにWPFに替わるものが他にあるということかねぇ。
上で誰かが言っていたElectronもうちの周りじゃあ1プロジェクトくらいしか採用していないが。 >>246,250
> 〇〇の場合は方法1、△△の場合は方法2、みたいに場合分けがあるから分かりにくい
違う、〇〇は方法1でもできるし方法2でもできる、△△は方法3と方法4でできる
って言うのがまずいって思ってる
具体的には個人的にはWPFはデータ・バインディングとコマンドでやるべきだと思うけど、WinFormからの移行のためかボタンに名前付けてコードから参照するとかコードのイベントハンドラをxamlで指定するとかもできる
できるのはいいんだけどWeb上の解説も両方が説明されてたり下手すると混在して使用されてたりしてわかりにくくなってるような気がする >>254
その割には外部フレームワークを入れないといろいろ不便なのがね..。
例えばBindableBase程度のものはMSで準備して欲しかった。
ViewModelは通常このクラスをベースにして...という基本的なスタンスだったらもっと分かりやすかったと思う。 >>255
Microsoft.Toolkit.MvvmってのがWindowsCommunityToolkitの一部としてもう直ぐ出るらしい >>255
ああ、それは言えるな
ハードで言うリファレンス設計を示してほしいね >>255
だよな。
WPF当たりから雑に作って、使いにくいのが多すぎる。Delphiの方がましかも。 データバインディング使わないほうがうまくいくことが多いよな >>259
データバインディング使わない方が簡単なのは認めるけどうまく行かないのはお前さんの能力かと… >>254
いや、あるでしょ
例えば、CLRプロパティと依存関係プロパティはどう?
それと、
>〇〇は方法1でもできるし方法2でもできる、△△は方法3と方法4でできる
>って言うのがまずいって思ってる
それって、
△△は方法1と方法2じゃ出来ないんだよな?
〇〇は方法3と方法4じゃ出来ないんだよな?
俺はそれがまずいと思ってる
〇〇が方法1でも方法2でも最終的に可能になるなら別に構わないんじゃないか?何が問題?
逆に、〇〇を解決しようと思って方法3で始めたが、後々になって方法1か方法2でしか出来ないことが判明した方が痛い asp.netでデスクトップソフト開発ってどうなんだろうか >>260
開始日と終了日の最大期間が3ヶ月で
開始日のデフォルト値が2000年のときの2021年1月23日〜2月10日の設定方法に付いて悩みたいのか? WinUI3というかUWPではバインディングが改良されて
コンパイル時に厳密な方チェックやってくれてバグに悩まずに済む >>261
> 〇〇が方法1でも方法2でも最終的に可能になるなら別に構わないんじゃないか?何が問題?
うん、問題ないと思うならそれはそれでいいと思うよ
>>263
何を言いたいのかさっぱりわからんけど、個別の不具合の話じゃないなら説明してみて >>265
あったまわりぃなお前
データバインディングしてる変数に間違ったデータが入るようにしちゃって大丈夫か?
開始日と終了日に2000年1月1日が入ってるときに
開始日に2021年を入力したとき最大期間に反応してエラー出すだろ?
ここでエラーを出さなかったらバインドしてるGUIがおかしくなる
したらどうやって開始日と終了日に2021年を設定するんだよ >>267
InotifyDataErrorInfoなどを使う場合、実装方法にもよるけど、間違った値や無効な値を保持する設計もおかしくないと思う。保持はするがエラーが発生しているという状態で、そのエラー内容を素直にViewが表示する設計。
逆にViewModelには正しい値しか保持しないとした場合、一時的にViewとViewModelで不整合が生じている状態になりますが、皆さんどのようにされてますか? >>268
それはバインドやめるって言ってるよね
GUIはそんなもん表現できないし
エラー値が入ってくるならそもそもバインドって仕組み使わないほうが楽だよね >>268
自前でエラー内容を保持するしかないように思う
http://sourcechord.はてなブログ.com/entry/2014/06/08/123738
個人的にはViewModelに不正な値を入れるのは気持ち悪い
>>269,271
そろそろ黙った方がいいと思うよ
顔真っ赤すぎだろw わざと新しい難解な方法を作ってるって発想はすげえな。
新しい方法使ってみたらわかるけど、なるほど、一部の課題は解決したな、みたいな感じになるだろうに。 ViewModelはModelではないんだから、別にエラーが入ろうが何でも良いだろ。
ViewModelからModelにするときにまとめてValidationしてるけど。
そうじゃないとそれこそ依存項目のチェックが出来んじゃん。
ViewModelとしてModelを使おうとするから変な話になるんじゃないの? >>274
でもさ1つの値でうまくいってても他と絡みだすとそれじゃうまくいかんのよ
開始日と終了日は一例ね
ベース値と複数の差分値で表現してるものもうまく行かない
将来的になにかの値と関連する可能性があるならこの仕組みは入れないほうがいいかも?
データバインドっていう複数の値が連動するときにこそ役に立つ仕組みと思いきや実は鬼門とかいうおマヌケなお話(笑) >>276
終了日のMaximunとMinimumバインドすりゃいいだけじゃね
開始日設定したらそこで変更すりゃ良い >データバインディングしてる変数に間違ったデータが入るようにしちゃって大丈夫か?
大丈夫だろ
ビューモデルはあくまでビューの状態を表すんだから、ビュー(UI)の方で一時的に開始日と終了日が
ずれてもOKで別途最終確定ボタンみたいなUIを作るなら、
開始日と終了日の関係がずれた値(状態)になってもそれは
ビューモデル的には正しい値だぞ
モデル的には間違った値だけど
ちゃんと区別しよう >>251
>WPF, Metro UI, UWPがコケた理由は単純に人、時間、金の投入量をケチって周到さが足りなかったからだと思うよ
いや
センスが無いだけだよ
どれだけリソース有っても創れない
あいつらの限界 ビューモデルはあくまでビューの状態を表すように設計するんだぞ
最終的なモデルの状態に不整合があったらまずいが、
ビューモデルはあくまでもビューの状態を表すんだから、一時的に不整合を許すUIを
設計するなら、ビューモデルもそういう状態になるだけだし
ビューモデルからしたら別に間違った状態じゃない
だから、
>逆にViewModelには正しい値しか保持しないとした場合、一時的にViewとViewModelで不整合が生じている状態になりますが、皆さんどのようにされてますか?
とか、前提がおかしいやろ。ビューの状態を表すようにViewModelつくるのに不整合を生じるようにつくるとか意味がわからん >>278
それデータバインドいらないよねって言ってるよね? ビューモデルに他にもテストしやすいとか利点あるだろ?
つか、数学じゃないから誰がもが納得する100%の
答えなんてないから君がそう思うならそう思えばいいと思う MVVMがどうのって、今話題のMVUの話題絡みで出てきたのかと思いきや・・・・・なんも関係なかったぜ >>276
うまく行かないか?
全部の値でやればいいだろ。
終了日と開始日、どっちにエラーメッセージ出す気なんだ?
俺は両方だと思ってるが。
>>281
要るだろ。
試験するときにUI生成しなくてもモックModelとのUnitTest通せるし楽じゃん。 >>285
そうやってエアプでできるできる言いたいなら言ってろ >>286
エアプというか…普段使ってるから自信を持って出来ると言えるんだけど。
別にWPFだけではなくて、他のプラットフォームでもViewModel使ってるぞ。
自分に出来ないからといって、みんな出来ないのに出来るってフカしてると思い込むのは良くないんじゃないか?
複数の値が連動するときにこそ役立ってると思うんだが。違うのか?
鬼門だと一切思わん。
将来的に何か他の値と関連する可能性があるなら尚更じゃん。
なんでViewModelでエラーを表示してる状態が不整合なのか俺には全然わからん。 >>287
じゃあ、>>263と>>267をどうやって実装してんの?
開始日と終了日なんて普通にアプリ組んでて出てこないわけないよね?
やったことあるんでしょ? >>288
普通に入力可能にして、エラーメッセージの表示条件が、開始日>終了日であること。
保存チェックはエラーメッセージが一切表示されていない事。Modelには一切波及せずViewModelで完結する。
仮保存のみOK。仮保存はViewModelのうちシリアライズしてはいけない項目を殺して保存。
入力中に一時的に入れ替わるなんてよくある事なんだから、いちいち選択不可にしてたらユーザビリティ悪すぎでしょ。
開始日がデフォルトで今日〜空白の時に、一昨日から昨日までの値を入れるのに、いちいち開始日から入力させんの?アホらしいじゃん。
入れ替わった時点でエラーメッセージに「開始日と終了日が入れ替わっています」と出しておけば一発でしょ。ついでに保存ボタンのEnabledも変えとくと親切だな。
エラーメッセージも、保存ボタンのEnabledも、両方ともプロパティにバインドしとけば、値を変えるだけで制御も変わる。便利よね。 まさか今どきエラー項目をダイアログ表示するとかいう発想じゃ無いだろうな…。 >>289
それがVMの役割だよなぁ
VMはViewの値をバインドしてるんだから、どんな値だろうと関係ない。
VMにバインドされた値が範囲外なら赤枠などで注意を促し、保存ボタンを押せなくする。
モデルに渡すときに仕様の範囲内であればいい >>291
まさにそう。
ボタン一発でデフォルト日にしたい、なんて要件が生まれたら、Commandをバインド。
わかりやすいと思うよ、俺は。 >>295
保存ボタンがDisabledなので保存のしようがないだろ。 それでもできる仮保存は、ViewModelの保存であって実データではない。画面保存。 >>296
チェックしなくしたん?
開始日と終了日の個別のバリデーションはあったら動くん? >>297
え?それもうデータバインドいらねーじゃんw
まあ、でも俺はその結論で満足だぜw >>298
チェックしてるじゃん。
プロパティが変わるたびにチェックされるよ。
された結果エラーメッセージが確定して、エラーメッセージが確定したら保存ボタンのEnabledが確定するでしょ。
個別のバリデーションは好きにやれば良い。同様にエラーメッセージを吐いとけば、エラーが一つでもあれば保存ボタンがDisabledになるんだから問題無い。 >>299
要るじゃん。UIコード一切触らなくても、バリデーション増やせばエラーメッセージを増やせるんだぞ。
そしてテストはViewModelで完結する。 データバインドできるから、画面保存が、不要な項目を殺す程度の実質ただのシリアライズで実現できるんだけどな。 開始日、終了日ダイアログボックス表示してOKボタンで値を保存するんです? >>303
開始日の横、終了日の横に、エラーメッセージを表示するラベルを置いてバインディング、
必要ならエラー項目は赤地なんかにしてもいい。
HasErrorもあるし、IDataErrorInfoもあるだろ。
好きなクラス作っても構わん。 チェックは自動。PropertyChanged使ってもいいし、ReactivePropertyでも良い。
保存は保存ボタン。
Undo、RedoはViewModel保存してれば良いじゃん。 キャンセルボタンで開始日終了日ダイアログ表示前の値だろ当然 >>308
ダイアログなんか出さねえよ。
間違えたらCtrl+Zで良いじゃん。
入れてる途中の数字を無理矢理戻されて気持ちいいわけ無いじゃん。 何?202/01/02って打ったらダイアログ出てきて2020/12/31にゴリ押しで戻されるようなのが良いの?
明らかに1だけ入れたほうが楽じゃん。 ViewModel使ってないから、プロパティ変更時にチェックかけるって発想が無いんだろうか。
ボタンクリック時に、if(xxx.Value)...ってひたすら列挙してんのかな。 >>313
ViewModelが「エラーを表示している」ってのは正常系。
Modelの開始日終了日は一時的にも逆転することは無い。
なぜならViewModelが「エラーを表示している」状態からは、Modelは生成されない。
Modelにエラー出たままは許容しない。
ViewModelにエラーが出てるのは正常系。許容も何もない。 >>315
そのレンジのグラフを表示するなら「描画できません」一択だろ。
業務アプリなら、画面入力しようとしたら一旦グラフ消すだろうし。
そうしないと、入力中のスクショ送られてきて混乱することになるぞ。 入力がおちつくまでグラフを描画しない、をやりたければReactivePropertyの方が楽だな。 >>317
えー、死ぬ
たったこれだけのためにそれ用の処理用意すんの?w >>319
バインディングしてれば、グラフと「描画できません」って書いたラベルの2つのVisibleをひっくり返すだけで良かろう。
なんの処理も無い。むしろ楽になる。 一応言っとくが、びっくり返すのも直接Visibleを変えるんじゃなくて、Visibleにエラーが有るか無いかから算出されるプロパティをバインディングすれば良いからな。 データバインド使うためだけに余波が物凄くね?
開始日と終了日のエラーを許容してる間って他の値を変えたときはそっちは保存するの? ViewModel使う事によって余波が減ってると思うが。
他の値は他の値でバリデーションかけたら良いだろ。
保存されるも何も、Modelとしてされないよ。一部がおかしいデータは全体として必ずおかしいだろ。
ViewModelとしては一時保存したければするかもしれんが、Modelにはならん。
その別のデータとやらが開始日と終了日に挟まれているべき日付、なんかだったらそもそもの定義が揺らいでくるじゃん。
全部Leaveするときにチェックするの?コントロール順とか、入力バリデーションに引っかかる順番ごとにテストする?組み合わせ爆発するし、ダイアログが出るかどうかなんてテスト、自動化しづらくて仕方ないじゃん。
明らかに、ViewModelとして帳尻が合ってるかをチェックする方が確実だし効率的でしょ。
だから許容も何もない。 いや、UNDOどうなん?
本格的にエラー値を保存しちゃうの? エラー値をViewModelとして表示するし、一時保存もするだろう。
Modelは保存しない(できない)から問題無い。
エラーも含めてUndo、Redoできて何かおかしいか?
未入力 2020/12/31
2021/01/02 2020/12/31
2021/01/02 2021/02/21
全部Undoすれば良いじゃん。
俺がよく使うのは、Undoはコントロールレベルに留めて、「入力破棄」とか「再読込」ってボタンを用意する事だけど。
変更はViewModelに留まってるから、普通に破棄してModelから再読み込みしてViewModel再構成したら終わる。
開始日終了日は確定してないけど一部だけ変更されたデータなんかを保存するつもりなの? ViewModelにエラーを表示している状態を保存してなんの問題があるんだろう。
実データとは全く関係ないデータなんだが。
そのあと修正して確定させないとModelに落ちないなら問題なくね?
いっつもそうして「仮保存」やってるんだけど。
番号取っとかないとダメとかはまた別のやり方するけどさ。 この間別の正しい値はmodelまで保存できるの?
開始日と終了日に関わるすべての値が保存対象でなくなる? 何を争ってるのかいまいちよく分からないけどずいぶん盛り上がってるね。
さすがに誰かタオル投げた方がいいレベルのような気がするけど
こういう時はなぜかだんまりなのねw 続きはこっちでどうぞ
WPF(.NET4.x, .NET Core) GUIプログラミング Part24
https://mevius.5ch.net/test/read.cgi/tech/1575862574/ >>329
実はみんな開始日終了日のデータバインドの解決方法が知りたかったけど
エラー値許容でがっかり回答だったと思う
エラー値許容は他の箇所での対処に追われるからできればやりたくないだろ >>328
一つのModelに開始日終了日とその別の値が入ってるなら保存するべきじゃないし、保存しないと思うぞ。
開始日終了日に関わるんじゃなくて、その画面上に表示されてるデータが確定できるデータじゃないでしょ。
正しい値でもなんでもない。
あのさあ。結局データバインディング使ってどう解決したら良いか知らないから、データバインディング使わないほうがお前の場合良いって事にしかならんでしょ。
エアプそのものじゃん。 >>331
そのエラー値のデータは、確定されない、永続化されないから対応に追われることは無いよ。
だからViewModelに閉じ込めるんであって。
ViewModelとModelを区別できて無いじゃん。
何聞いてんの? がっかり回答どころかがっかり理解力だわ。
俺が間違ってるなら指摘してくれ。 いや、だったらデータバインドいらねーじゃん
だってそれ普通にダイアログ出してOKボタンでチェック&保存してんのと変わらんもん
なんかいい方法を知ってる神が舞い降りるのをみんな待っているのさ(笑)
俺はデータバインド使うのやめたけどw >>335
UI層変わったらどうすんの?
WPFからUWPやXamarinなんかに移植するとき、全部コントロール貼り直して、コントロールへの値のSet,Get全部やり変えて、全部テストすんの?
新しいUIフレームワーク出たら?
アホでしょ、常識的に考えて。 テストするときにモックのUI差し替えて自動テスト出来るんだけど。
最終的には結合試験するだろうけど、その前の段階でも画面ポチポチしながら決定表みてテストしてくの?
工数の無駄遣いでしょ。 元はデータバインディング使うと上手く行かないことがあるって話だったのにすり替わっているな 横からだけど
いままでMVVMの意義が理解できてなかったのがID:3jwmj/rb0の説明で開眼したかもしれない
WPFスレで聞くべきかもしれないけど、
View=ViewModelの保持値を表示する&入力値が変わったりボタンが押されたらViewModelの当該プロパティやメソッドを呼び出すだけの存在
(決してビジネスロジックやバリデーションをView自体に持たせてはいけない)
ViewModel=画面上のいろんなTextBoxやLabelのTextだったりButtonのEnabledだったりを一元的に保持することだけを担う存在
(エラー入力値なんかもあるがままに保持すべきであり、
ViewModelでバリデーションチェックを行ったうえでバリデーションNGとかの結果もエラー表示項目の値としてセットすべきである)
Model:極論してしまえばView/ViewModel以外のビジネスロジック的な処理すべて
(UIに依存しない処理は全部Modelで書く)
っていう理解でおおむねあってる?
なんとなくだけど、上記の考え方なのだとしたら
そもそも ID:H0Ke+o4H0 の人はMVVMでなかったとしてもMVVMでいうModelとそれ以外の処理もごちゃ混ぜで書いてそうな印象 >>341
開始日と終了日エラーでたままじゃグラフの表示範囲も決まらんかもしれんのによくやるわ
ビジネスロジック入れないでグラフの表示範囲計算できると思ってるのかよ
夢見んな
んでエラー値許容のまま放置できちゃったらエラー箇所ユーザにわかるのかよ的な
visualstudioだって一発ビルドしないとエラー箇所わからん
ボクはうまくいってないと思います やっぱり何の話をしてるのかよく分からんけど
UI上の値がモデルに今反映されているのかどうかはっきりしないUIはイラッとくるね。
UI上の値がモデルに反映されていない状態を許すなら>>335が言ってるように
ダイアログ出してくれる方がフレンドリーだと思う。
許さないならUI上の値も常に不整合を許すべきではないと思う。
数直線上の閉区間(a≦x≦b)を入力するUIがあったとして、
ユーザーによるaの入力が確定した時a>bになっちゃってたらb = aに変わるべき。 WinFormsのコントロールは内部状態を抱え込んでたんでテストが面倒くさかったのを
VMで外出しにした、というくらいに理解しておけばいいと思う。
バインデングいらないの人はFormsじゃあどうしてたんだろうか。 ??
グラフ表示に必要な項目が入力エラーなら「日付が間違ってるのでグラフが表示できません」ってテキストで表示するだけだと思うんだけど
ていうか>>342のいう「グラフ作成」がbmpみたいな画像生成を指すのであれば
その処理はたぶんModelで持つのが正しい気がするし、
View/Modelが密接不可分に結合するような処理であれば
わざわざViewとModelの分離を意図してる(で合ってるよね?)MVVMにしないほうがいいのは当たり前の話だと思う >>341
値にしなくてもプロパティとして表現すると読み書きの方向がはっきりするし良いよ。特にEnabledとかは。
>>342
表示範囲が決まってないのに、グラフが表示できるわけないんだから、「現在描画できません」って表示するのは正でしょ。
ビジネスロジックに通したとしても、それをModelとして保存するかどうかは別問題。
エラー値許容って考え方がおかしい。
エラー箇所がわかるようにバインドするのであって、
各変数がバインドできてるかはモックViewModelを使ったUIテスト、
各種バリデーションがきちんと発生するからモックUIを使ったViewModelテストで、疎に担保するべきもの。
コンパイルエラーとかそういう次元ではなくてUnitTestぐらい通すだろ、普通。
責任範囲がまぜこぜじゃん。
>>343
業務アプリで、画面表示中の項目と、入力項目が不一致になるのは禁忌に近いんじゃないかな。
スクリーンショットからトラブルシュートするのがほぼ不能になる。
>>345
そのグラフ作成、Modelではなくて、切り出しておくべきでは?
結局のところ、一定範囲のデータを与えられて、グラフを描画するって関数なりコントロールになって然るべきだと思うよ。
内部的にbmpを生成しようが、画面に描画する以上。
そうしといたら、グラフコントロールを差し替えたい時に気楽に差し替えられる。 >>338
だって出来ない理由がvalidateなんだもん
そりゃ本人の能力だよねってなるわw >>346にある「プロパティ」って他言語でいうComputed Property(ごめんC#で何て言うか分からない)のことでいいのかな
であれば(and>>344の理解で良いなら)MVVM完全に理解した
ただしく適用すればソースコードの見通しがめちゃくちゃよくなるだろうと思いました
といっても普段の開発がWinFormsかASPNETCoreばっかりなんで活かせる機会なんて来ないんだけどさ
グラフ作成はViewやViewModelに押し込むくらいならModelに置いてくれと思ったけど
別に切り出せるならそのほうがもっと良いのはごもっともです
層分けって大事だよねー・・・と普段メンテしてるようなソースを思い起こしながらため息をついてみたり >>348
C#でプロパティって言えば迷うはずないだろ プロパティと聞いて「自動プロパティ」のほうがまっさきに思い浮かんじゃって
「自動プロパティじゃないほうのプロパティ」の呼び方が分からなかったんだけど・・・
何て呼ぶのが一般的なのかな >>341
あってます。
ViewModelは具体的なUIを持たないViewだと思えば良いです。
なのでVisible等のViewに関するロジックはここが持ちます。
ViewはViewModelをそのまま具体的なUIで表現するだけです。 プロパティ、そりゃどれもプロパティだな、言葉足らず申し訳ない。
Computed Propertyググった。
そう、これの事。値を持たず他のプロパティの内容から算出されるプロパティ。 Enumerable.OrderBy メソッドを呼び出す際に、
引数に送るデリゲート(Func<TSource,TKey>)を動的に指定したい。
具体的には、
List<Person> people = new List<Person>(basePeople.orderby(person => person.名前))
といった並べ替え処理を、Personクラスの各プロパティについて行いたい。
(年齢、整理番号、生年月日など)
現在はそれぞれのプロパティ(20以上)について上記メソッドを作成して
やりたいことは実現していますが、全くスマートじゃないです。
propertyinfoクラスを使って何かできないかと思ったんですが、
デリゲートの中に組み込むような使い方が全く思いつきませんでした。
どなたか分かる方教えて下さい。 >>358
ひょっとして問題を誤解してるかもしれんけど、
OrderByのセレクターは使わずにIComparerで渡す
オブジェクトの方に実質的なセレクターの機能も兼任させれば
できるんじゃないの? 同一PC上でのアプリ同士の連動のさせかたを教えてください
フォームアプリケーションA.Bを作り、
Aが単独でも動くメインアプリ、Bは拡張機能付きリモコン、という風にしたいんですが、
Aのサブフォームではなく、別のexeファイルからBを起動したいです
そのうえで、同時起動中にBを操作することでAのtextboxを変更したり、Aを動かすためのメソッドをBのソースに書いてボタンイベントで呼び出し、等できると最高なんですが、
これはそもそも可能なことなのか、検索ワードすらわからず詰まってます
可能であればできるだけシンプルな方法を教えてください、
現在、C#、windowsformでAの途中まで制作中です >>363
IPCっていうやつ使えばいいよ
WCFという似たようなやつは有るけど、そっちはMSが見捨てた >>361
こんなのとか。
ただの思い付きなので動作するか確認してないし欲しいものと違ったらごめんね。
class DynamicComparer<T>:IComparer<T>
{
public string PropertyToCompare { get; set; }
public DynamicComparer(string propertyToCompare)
{
this.PropertyToCompare = propertyToCompare;
}
int IComparer<T>.Compare(T x, T y)
{
var t = typeof(T);
var p = t.GetProperty(PropertyToCompare, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
var xp = p.GetValue(x);
var yp = p.GetValue(y);
return System.Collections.Comparer.Default.Compare(xp, yp);
}
} 何回も上がっているけどSystem.Linq.Dynamicを使いなよ System.Linq.Dynamic使うとどんな風に書けるの var list = customers
.Where("Name.Contains(@0)","ZZZ Projects")
.ToList(); >>363
SendMessage PostMessageは 入門書には、クラスの設定系のメンバーは、公開する必要が無ければprivateにせよ、
みたいなことがよく書かれています。
ですが、例えば自作クラス ClassA, ClassBがあるとして、
ClassA
{
public int IntVal { get; private set; }
public ClassB BVal { get; private set; }
}
IntValはいいとして、BValに関しては、getプロパティでBValへの参照を取得できてしまいます。
その参照を通してBValにある設定メソッドを呼べば、BValの内容を外部から変更し放題です。
これを防ぐ方法として
1. ClassBを不変にする(ClassB内には、コンストラクタ以外に設定方法を用意しない)
2. ClassBのクローンを返す
3. ClassB内の取得系メソッドのみを集めたインターフェースを返す
4. ClassBを値型(構造体)にする
一応、以上のようなことを思いつくのですが、ここで質問です。
この問題(メンバがクラス型の場合に、セッターを単にprivateにしてもカプセル化できない)について、
皆さんはどう対処してますか?
単に「カプセル化したければこんなテクニックもあるよ」というのを紹介してほしいのではありません。
皆さんが(使い捨てでない)プログラムを書く際に、実際に、どういう考え方で、どう対処しているのか、
あるいは特に対処していないのか、を知りたいです。
よろしくお願いします。 ちなみに、お前自身はどう対処するんだ?と聞かれるかもしれませんが、
C#の経験が乏しいこともあって、どうすればいいのか正直よくわからないです。
(だからみんなのやり方を参考にしたい)
C++なら、公開したい相手だけをfriendにするとか、constなポインタを返すとかするのですが。 ClassBについても設定系のメンバがprivateになってれば何も問題ない
むしろprivateでないsetterがClassBにあるなら必要があって公開してるはず 例えばint型は自由に値を設定できます(その必要があります)が、
ClassAにとっては、int型の内部データであるIntValを、ClassAの外から
変更されたくない(値の参照はしたい)ため、setのみをprivateにしています。
同様のことをClassBでもやりたいと考えているのですが・・・。
そもそもそういう考え方自体がおかしいのかな? とりあえずイミュータブルにしとけばいいよ
どうしてもイミュータブルではいけない理由が出来たときにどうするか悩めばいい >>380
まず前提だけど
publicやprivateで改修時の設計を制限しようと思ってるの?
正直、こんなもんお飾りだし
いざ自分がやりたい機能の邪魔になったら問答無用でpublicにする
俺だったら
まあちょっとしたメモアピールぐらいに思っておけばいいんじゃない?
会社として公開するライブラリやdllのクラスだったらそもそもクラスを丸ごと渡すような仕組みにしちゃ駄目だろ
やるにしてもアクセス用のクラス挟んでって長ったらしい設計になることは致し方ない イミュータブルというのは、>>376の方法1のことですよね?
たしかに、.Netに標準で用意されているクラスの多くは、インスタンスを一度作成したら、
内容を変更できないようになっている気がします
内容の一部を変更したいとき(例えばFontのサイズだけを変更したいとか)は面倒ですが・・・ >>382
たしかに、あくまでメモ程度に考えて、気にしなければいいのかもしれません
以前、C++で、引数をポインタで渡す際、引数の中身を関数内で変更されたくないので
引数をconstポインタ型にしてたのに、関数の中でconstをキャストで外すように関数内を
書き換えられてしまっていたことがあります
気にしたらきりがないですね >>383
1のことでいいよ
イミュータブルの内容を少し変えたオブジェクトがほしいけどコード書くのめんどくさい問題は昔からあった
昔は言語サポートがなかったのでコード生成で対処していた
新しいC#ではwith構文が追加されたのでこの問題は解決済み ありがとうございます
With構文というのは知りませんでした with式の前にその前提となってるレコード型を調べるといい レコード型とwithについてざっとですがWebで調べてみました。
これらの機能を実際に使うかどうかはともかくとして、イミュータブルにすべきという
指針が得られたのはとても参考になりました。
ありがとうございました。 俺はコードの仕組みまでいじってやるほどの問題ではないと思う
ちょっとした仕様の変更でprivateをpublicにしなければならないときクソ邪魔過ぎて作ったやつ呪うレベル C#で作ったアプリケーションをVS2019でビルドしました。
実行ファイルが作成されたbin>releaseのフォルダに、実行ファイルがあると正常に実行できるのですが、
他のフォルダにコピーすると実行できない(ダブルクリックしても反応しない)
状態です。
なぜなんでしょう? releaseフォルダをまるっとコピーしたんか?
exeだけ移動させても、dllが不足してたら動かんぞ >>389
既存のコードを書き直すことは、実際にはたぶんやらないと思います(手間のわりに得られる効果は少なそうなので)。
ただ、自分がプログラミングしてると、>>376に書いたような状況にしばしば出くわすので、
他の人はどうしてるのかな?と思い、今後の参考に質問させてもらいました。
・そういう状況になるような設計がそもそも悪いのか?
・他の人はそういう状況にならないように設計してるのか?
・不便を感じているのか?いないのか?
・不便を感じているなら、どう対処してるのか?
等を知りたかったのです。 >>389
privateをpublicにするのは構わないがイミュータブルなクラスをミュタブルにするのは絶対に駄目 >>392
そういう状況になるような設計がそもそも悪い、に一票
他のクラスAの内臓を引き摺り出さないといけないような処理があるなら、それはA自身に持たせるべき
Tell, Don't Ask でググるといい >>391
ありがとうございます
以前にtobii社のアイトラッカーを使っていてこのSDKをインストールしていたので、
知らないdllがたくさん生成されていました・・・ ちょっとやっかいなことになったなぁ・・・
現在tobiiのアイトラッカーは使っていないので、
tobii抜きでビルドしたいのですが、どこで設定しているのかわからないので取り除けません
sdkのアンインストールツールなんてものもなさそうだし・・・ 開発したオブジェクトをtobiiを使っていない旧バージョンのプログラムにコピーしたらうまく行かないかと思ったんですが、
プロジェクト間でオブジェクトのコピーができない・・・ プロジェクトをまたいでフォームをコピーしようとすると
「この操作のソースファイルがこのソリューションに見つかりません。」
と表示されるのですが、何が悪いのでしょうか? >>392
根本的な設計は問題ないよ
例えば注文と注文明細のようにオブジェクトが別のオブジェクトを含むという構造はよくあることだ
それ自体にはなんの問題もない
では何が問題かというとそれは注文明細をミュータブルにしてしまったこと
注文明細をミュータブルにしてしまうと
注文と注文明細の間にあったはずの不変条件を簡単に壊すことができてしまう C#というかVSではソリューションをまたいでフォームをコピーするとかは不可能なんでしょうか?
またいでコピーすると
「この操作のソースファイルがこのソリューションに見つかりません。」
と表示されコピーできないのですが、これが出来ないとフォームを別アプリとかで再利用できないですよね
コピーできないはずがないだろうと思って調べているのですがやり方が分からい・・・ エクスプローラーでファイルをコピーするという発想は無いの? >>401
ありがとうございます
知りませんでした・・・
ファイルコピーしたらプロジェク内に表示されましたが、
SDK導入前のプロジェクトにSDK導入後開発したフォームを移植してもうまく動かないですね
SDKを一度導入すると取り除くのは不可能なのか・・・
全く使わないDLLファイルが大量にあるってなんか気持ち悪いですが、我慢するしかないのかな・・・ >>394
>>399
色々とアドバイスいただき、ありがとうございます。
Tell, Don't Askについても調べてみました。
より良いコーディングができるよう精進します! >>400
共通のソリューションにあり納めてからだと
プロジェクトエクスプローラで
コピー、移動出来ない? List<int>の中で最大の数値の個数をLINQで数えたいのですが
どう書いたらいいのでしょうか? >>405
var hoge = new List<int> { 1, 2, 3, 4, 5, 4, 5, 4, 5 };
var maxCount = hoge.Where( x => x == hoge.Max() ).Count(); Max()で最大値取った後Count(x => x == max)すればいいんじゃない普通に たしかに、Whereの中にhoge.Max()を書いちゃうと毎回評価されて効率わるいのかな。
すまん >>405
GroupByでキーを値、バリューを個数にしたグループを作ってキーで並び替えて最後の行を取得するってのが1回の実行で完結する時の一般的なやり方 計算量と可読性考えた素直に自分で書いた方がよい気がするよw みなさまありがとうございました
GroupBy調べてみます。 LINQというかその乱用者が嫌われる理由の一端を見た気がするw ループでMax出しながらカウントも行けると思うんやけど
速度的にもわかりやすさ的にも
絶対こっちのが上やんか?
それに対する反省はないん?
けったいな方法使って性能も悪いなんてなんや最高にダッサイなぁ? >>414
これ言ってる本人は語るに落ちてるって気付いてないんだろうねw
KISSの原則とか青臭いこと言いたくないけど、
ダメな人は自分が自己確証を目的にしてる自覚がないからダメなんだな
前にも書いたけどこの業界にはイキってる連中が群がってる技術は
絶対に衰退する法則があるけどそれも上記が理由の一つだねw >>405
dotnet add package System.Interactive
using System;
using System.Collections.Generic;
using System.Linq;
var q = new List<int>() { ... };
var ans = q.MaxBy(x => x).Count();
System.Console.WriteLine(ans); >>417
そっちは可読性は問題ないので
2回スキャンすることになる非効率が問題ないなら
普通にありだと思うよ。 >>419
これはSQLでも一般的じゃん。
一回とか概念的に無理じゃない? ループでMax出しながらカウントはListに限って言えばまあ許容範囲内だけど、
IEnumerableに対する処理としては微妙じゃない?
全件かならず読み込む必要があるのと、裏がDBならクエリになって集計だけ行われるのではパフォーマンス差出ると思うが。
そのへん、バックエンドがどう、だからコードはこう、って考えるよりも、Linqで処理して弾力をもたせるってのは有りだと思うけど。
けったいな方法だとは思わん linq使わなきゃワンループ余裕でしょ?
max値更新するときカウンタリセットして同値見つかったらインクリメントすればいいっしょ? >>422
DBうんぬんはIQueryableなので関係ない
IEnumerableになってる時点で最も効率がいいのは1回スキャン
ソースが小さいListなら効率は気にしなくていい
ファイル読み込みとかだと無視できないので汎用化したいなら1回スキャンで済むようにするのがLinqのマナー a.Aggregate((int.MinValue,0), (cur,next) => cur.Item1 < next ? (next, 1) : (cur.Item1 == next ? (next, cur.Item2 + 1) : cur));
これじゃダメなの? MoreLinqにもMaxBy()あるよ
>>418と一緒でループ1回ですむ
標準だけでやりたければ自分でExtension定義すればいい すみません 教えてください
using Windows.System.Diagnostics;
の
SystemCpuUsageReport.UserTime
SystemCpuUsageReport.KernelTime
SystemCpuUsageReport.IdleTime
は それぞれ
ユーザーがCPUを使用していた時間(The amount of CPU user time consumed by the system.)
カーネルがCPUを使用していた時間(The amount of CPU kernel time consumed by the system.)
CPUがアイドルであった時間(The amount of time the CPU was idle.)
となっているのですが、 それぞれ、なにを表しているのでしょうか?
タイマー関数で、1秒ごとに、idoletime+Kernaltime+Usertime の差分をを求めても、
14秒から15秒になってしまうので、単純にな数字ではないと思うのですが、どのような理論で
この数字が出ているのかが皆目わかりません
よろしくお願いいたします。 publicなプロパティにはxmlコメントを付けると思いますが、
バッキングフィールドってどこに記入してますか?
クラスの先頭付近に書いても、
自動実装プロパティはコード上ではバッキングフィールドは無いし、
納まりが悪いです。
private string _name; //←これどこに書きますか?
/// <summary>名前</summary>
public string Name {
get => _name;
set => _name = value.ToUpper();
}
/// <summary>年齢</summary>
public int Age { get; set; } >>433
質問の趣旨は要するにただ「バッキングフィールドをどこに書くべきか?」それだけ?
自分はスニペットのテンプレのままなのでプロパティー本体の直前に書くけど
そんなの別にどこでもお好みでいいと思うよ。
うるさいがこう書けと言うならおとなしくそれにしたがっておけばいいと思う。 https://qiita.com/toshi0607/items/801a0d37fb48313cbdbd
C#6.0
自動プロパティ初期化子を与えて、初期値指定ができるようになりました。
public string Name { get; set; } = "Nyanchu"
以下と同意です。
private string _name = "Nyanchu";
public string Name
{
get { return _name; }
set { _name = value; }
}
これでいいんじゃね? 久しぶりに触ってんだけど
vs2019でフォームにクラスファイルを追加するときは
右側のプロジェクトウィンドウみたいなところで右クリックして追加ないとダメなんだっけ?
メニューバーのだとただのクラスファイルを作るだけ? >>438
そんなこと言ってないよ
ちゃんと質問読もうね そもそも書かなくて良くなるじゃん
set{value=略;}にすれば
なるっけ? 書きたくないんじゃなくて書く必要がある場合にどこに書くのか?だろ
勝手に質問変えないで
自動実装プロパティでは不都合があるため自前でバッキングフィールドを用意する、は大前提 >>437
「フォームにクラスファイルを追加する」が意味わからん プロジェクトにファイルを追加する?
「メニューバーの」が具体的にどれを指してるのか分からん
「ただのクラスファイルを作るだけ」がやりたいこととどう異なっているのか分からん >>440
自己レス
ホントだ
違う話なんだな
変数なしで初期化ができるのって
自動プロパティって処理の中身がないやつだけ?なのか >>359
調べてみましたが、サンプルコードを見ても良く分かりませんでした。
あとで勉強してみます。
>>367
これでも出来そうでした。アドバイスありがとう。
結果報告ですが、ExpressionTreeを使って動的にラムダ式を生成することで解決しました。
完成したコードは以下の通り。
void DynamicOrderBy(string propName){
//引数の文字列に対応するプロパティを返すラムダ式の生成
Func<Person, string> keyFunc = GetDynamicPropertyExpression(propName).Compile();
//動的に生成したラムダ式を使ってOrderBy
var sortedPeople = people.OrderBy(keyFunc)
}
static Expression<Func<KoyouPerson, string>> GetDynamicPropertyExpression(string columnName){
var type = typeof(KoyouPerson);
var property = type.GetProperty(columnName);
var parameter = Expression.Parameter(type, "p");
//p.{columnName}
var propertyAccess = Expression.MakeMemberAccess(parameter, property);
//p => p.{columnName} というラムダ式を格納した式ツリーを返す
return Expression.Lambda<Func<KoyouPerson, string>>(propertyAccess, parameter);
} >>441
code maid使うと、プライベートフィールドは纏められるからそのまま放置するな
大体メンテすることもないから特に困ることもない >>445
OrderByのサンプル見れば分かるやろ
https://dotnetfiddle.net/GdxsMG
Customers.OrderBy(c => c.City)を
Customers.OrderBy("City”)にできる >>432
ありがとうございます
4こあ8スレッドなのでその2倍いっているのが
やや気になります
今度 同時に計って見て検証してみます Form上のテキストボックスにファイルのパスを記入してもらって、
このパスにあるファイルをpythonで起動したいのですが
var pass = this.passSetting.Text;
System.Diagnostics.Process.Start("python.exe", @pass);
では何も起動しません。
多分
@pass
ではパスを示せてないんだと思うんですが、どうすればテキストボックスから取得したパスをProcess,Startの引数にできるんでしょう? System.Diagnostics.Process.Start("python.exe", @"""L:\AAAAAA\USN_analyzer\time_series_analysis26.py""");
だとpythonのファイルを実行できるんですが、
var pass = "L:\AAAAAA\USN_analyzer\time_series_analysis26.py"
System.Diagnostics.Process.Start("python.exe", @pass);
みたいに変数で実行ファイルのパスを渡すことってできないのでしょうか? >>450
その2つだとpython.exeに渡す引数がquoteされてるかどうかの違い出るからうまく行くほうに合わせたら?
var pass = @"""L:¥AAAAAA¥USN_analyzer¥time_series_analysis26.py""";
System.Diagnostics.Process.Start("python.exe", pass);
ちなみにpassじゃなくてpath >>451
ありがとうございます。
解決しました!
これでようやっとC#とPythonのアプリケーションを統合することができました。 エクセルの表みたいな
一行に複数の列(項目が並んでる 二次元の配列って
ArrayListじゃだめなんだっけ?
独自のプロプロパティをもったクラスつくってそれを列に放り込むんだったっけ? フィールドがプロパティで
レコードが件数になりまつ
って言うと通じるの?
List<myclass> dtcls = new List<myclass>();
的な
myclassのメンバがプロパティで 通じない
フィールド、プロパティ、メンバ
それぞれに言語上の意味がある WebRequestでウェブページを取得しているのですが、POSTに必要なFormDataがうまく取得できません
普通なら対象ページのHTMLを見れば取得できるのですが、対象ページの”実行”ボタンを押した時にjavascriptでPOSTに必要な情報を
生成しているようで、この値を取得できないのです。
何か方法がありましたら教えてください HTMLはこんな感じです
<input type="submit" value="実行" onclick="sid()"> 自分でJavaScript解析できないならSeleniumで ブラウザでF12押してネットワークになに流れてるかを見てみたら? >>461
seleniumってwebBrowserと同じようなものですか?
webBrowserなら操作できるのですが、画面遷移が鬱陶しいので、できればwebRequestで済ませようと思ったのです。
>>462
他でよく見るようなPOST情報しか流れていませんです。
ただhtmlではブランクになっているFormDataがjavascriptによってブランクではない値に修正されています。
javascriptの中身はこんな感じで、クリックと同時にsidの値を書き換えてそれをPOSTしています。
document.forms["form1"].sid.value = xxxxxxx >>463
C#でそのJavaScriptと同じことをやって値を計算するか、C#からJavaScriptを実行して結果を取得するか public class Test
{
public int data { get; set; }
}
Test b = new Test()
bをウオッチすると、dataが、「@data」となるのですが、なぜですかね? Ruby on Rails ではシステムテストで、Selenium Webdriver を使う
Capybara で、Headless Chrome とか C#でヤフーのメールサーバーからメールを送信できなくなってしまいました。
これまでのやり方はdobon.netにあるようなごくごく単純な方法です。
おそらく↓のせいだと思うのですが、ポート番号と通信方法を変更しても、固まってしまい送信ができません。
どなたか送信ができている方がいたらやり方を教えてください。
【2021年1月19日より】メールソフトで「Yahooメール」の送受信が出来ない!?Outlook・Windows Liveメール設定変更方法 | 大阪狭山びこ
https://osayama.com/security/36346
書き直したプログラムは次のとおりです。
//SmtpClientオブジェクトを作成する
System.Net.Mail.SmtpClient sc = new System.Net.Mail.SmtpClient();
//SMTPサーバーを指定する
sc.Host = "smtp.mail.yahoo.co.jp";
//ポート番号を指定する(既定値は25) SSL使用時は587→465
sc.Port = 465;
sc.Credentials = new NetworkCredential("hoge", "fuga");
//SSLを使用する
sc.EnableSsl = true;
//SMTPサーバーに送信する設定にする(既定はNetwork)
sc.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
//メールを送信する
sc.Send(senderMail, recipientMail, subject, body); >>470
ありがとうございます。
単純にポート番号と通信方法変えるだけじゃダメだったんですね。
SMTPSで検索してみたらMailKit使えと出てきたのでやってみたらできました。
ありがとうございました。 質問させてください。
c#でgoogle drive api を使ったWindowsアプリケーションを作ろうと思っているのですが、
ビルド後に出来た配布ファイルは実行ファイルはもちろんの事、NuGetで追加したDLL群や、
取得したJSONファイルも含めて配布すればいいのでしょうか? そのインストーラーを作るのにも必要なファイル群がわからないとダメだと思うけど >>473
必要なファイル郡は何らかの形で入手できるようにしなければいけないので、
最低限の情報としてこのDLLとかこのJSON使ってますって情報をユーザに
与えてあげないと動かしようがないけど、配布ファイルに含めるか各自で
ダウンロードさせるかはアプリの作成者が決めること
ただし、アプリに含めて配布する場合には、自分の作ったもの以外は
再配布可能なものなのか、各々のDllとかのライセンスを確認しないとダメだよ
ものによって勝手に配布しちゃダメとか、配布にはこれを使えとか、コンパイル
済みのものは配布不可とか色々あるので >>473
そうだけど、GoogleTokenフォルダ下のものはそれぞれのアカウントのを利用させないと不正アクセス起こっちゃわないか Unityでゲーム作りに挑戦しているのですが、自作クラスItemをリストにした
List<Item> itemList = new List<Item>();
があって、
クラスItemはint itemIDを持っています。
itemListをitemID順にソートするにはどうしたら良いのでしょうか?
itemList.Sort();
で出来ると思っていたのですが、よく考えたら出来る訳ありませんでした・・・。
Sort()のカッコ内にitemIDを指定したり出来るのでしょうか?
取り敢えず並び替え出来れば良いので一番かんたんな方法をどなたか教えて下さい。
よろしくお願いします。。 >>478
ItemにIComparable<Item>を実装するか、
SortのオーバーロードのうちComparison<T>かIComparer<T>を引数にとるバージョンを使う。
あるいは>>358
ちょっとぐらいドキュメントを読んだ方がよいと思うよ。
コミュニティーに質問を投げるのはその上で疑問が解消しなかった後で遅くないでしょ >>480
一応自分で調べてはいるのでドキュメントも見るのですが、大体意味がわかりません。。
なぜ意味がわからないかというと例に
<T>などと書いてありますが、Tって何?<>の意味は?という所がわからない為です。
一度自分に近い実用例を見ないとメソッドの存在を知っても書き方がわからないのです。
>>479さんもありがとうございます。
もう少し頑張ってみます。 Tってなに?とか言ってるのに
List<Item>使ってるやん(笑) >>482
サンプルなどで使って覚えたので。。
意味を理解しているというよりも、リストの書き方はこうって覚えています。
しかも私が言ってるのは<T>だけに限ったじゃありません。(わからないくせに偉そうですみません)
<T>に限って言えばClass名を入れるって事ですか? >>483
そのレベルでは自分のやりたいことのサンプルだけ真似しようとしても分からないことだらけで前に進まないと思うぞ
面倒がらずにC#の入門書とかで体系的に最低限の基礎は固めなよ >>483
>>485さんが言っている通りで基礎から勉強した方がいいとは思うけど
Tは別にクラスじゃなくても、stringやらC#の基本型も指定出来ます
つまり、Listが扱う型を指定するという事です List<Item>だとListにItemしか格納できなくて後々不便になるので、
普通はList<object>にするのが一般的だよ。 >>481
いや、とりあえず真似ればいいやん
people.Sort((a, b) => a.Age - b.Age);
↓
itemList.Sort((a, b) => a.itemID - b.itemID);
※ a, b は単なる引数だから (x, y) => x.itemID - y.itemID とかでもいい
>>487
氏ね、ボケ 最低限の基礎知識の勉強は必要だよね
そうしないと検索してもここで聞いても理解できない
「やりたいこと優先」という気持ちは分かるけど
>>487みたいに変なこと教える人もいるから… >>489
何を書いてるのかまったくわからないのでちょうどラムダ式についての解説を読んでいました。
そのa,bはNameとは関係ない感じですか?
ラムダ式でしか指定できないのでしょうか? >>490
今作ってるものが完成したら皆さんが言うとおり基礎の勉強したいと思います。
new Person(){Name = "a"}のaは普通の解説ならTaroとか書くはずで、のちのa,bとは関係ないって事ですね? >>492
ああ、確かにPersonでName="a"は手を抜きすぎだな、"Taro"とか"田中"とかの方がいいね
その"a"とラムダ式のaは関係ない
それを示すために
> ※ a, b は単なる引数だから (x, y) => x.itemID - y.itemID とかでもいい
って書いたんだけどね >>492
以下のメソッドの同じ意味
一々メソッドを定義するの面倒だし、型とか一々書くのが面倒で省略しまくったのがラムダ式と思うとイメージしやすい
int Hoge(Item a, Item b)
{
return a.itemID - b.itemID;
} >>493
出来ました!ソートされました!
本当にありがとうございます! ラムダ式はちゃんと練習したいな、なんか練習問題集みたいなのないのかな?
特にキャプチャーの概念が自分の感覚と狂う狂う 意味不明
それでしか書けないものがあるならまだしも
結局モノが作りたいんじゃないなら
この職には近づかないほうがいいぞ
不幸になる 真面目な話、ラムダ式はそこまで奥は深くない気がする。
決していきがって言ってないつもり。
キャプチャーに関してはC#5.0での破壊的変更が逆に落とし穴になってるような
気がしないでもないけど、他に直感を裏切るような落とし穴があるわけでもないし
https://ufcpp.net/study/csharp/ap_ver5.html#foreach
川俣さんの記事が割とよく書けてると思うしあれ読めば十分じゃないのかな >>500
あの人、川俣さんって言うんだ?
知らなんだ 俺もラムダ式は最初意味不明すぎて苦労した
何で躓いたかって言うと一番は用途が不明な点
デリゲートとか覚えたらそこから理解できた ラムダ式のメリットってなによ
わざと難解に書いてるだけにしか見えん >>504
絶対に一度しか使わないような処理を引数として渡したい時に
わざわざメソッドとして書かなくて済む c#でUSBカメラから録画・録音処理をするライブラリでいいのないですかね?
Accordを使ってみたところ、録画は上手くいったけど録音が上手く動かないしもうリポジトリもアーカイブされてるので乗り換え先を探しています。 デリゲートを理解してればラムダ式自体を覚えるのは何の苦もないと思うけど
確かにデリゲート的な概念って、プログラミング自体初心者だったりお上品な言語しか
やったことない人だと理解しづらいよねたぶん。
それはそうだと思うわ。 ラムダ式がメリットというより
引数として無名関数を指定出来るのがメリットという点を理解すれば良いだけかと
例えばよくあるソートだけど、大抵は2つの比較対象のオブジェクトがラムダ式の引数になるけど、ソート側からしたらそれをどう評価したらいいか分からないから、ラムダ式で評価する関数を戻り値として指定して、ソート側でそれを実行している訳で
この辺の説明でピンとこない人は中々理解できないかも知れない >>504
名前をいちいち考えなくていい
引数に変数しか指定できなくて毎回
var I1 = I + 1;
foo(I1);
って書くより
foo(I + 1);
って書く方が楽でしょ
それと同じ 無名関数は優れた概念だと思う。
問題はコピペが簡単にできる現代であれほど省略する必要があったのかってこと メソッドを記述するのが面倒なだけってのはお前の都合じゃん
あの処理だけどさって同じ開発者同士で話すときに
名前がないのが超超超超超超超超強烈なデメリットしかない ラムダはその場かぎりのちっこい処理にだけ使うものだぞ
命名しておくべきような内容・ボリュームの処理をわざわざ無名のラムダにしておきながらなに言ってんだか
不便にしてるのはお前自身だろ 僕たまに一行だけのメソッドも作るんでその感覚よくわかりません
あと他でも同じ処理が必要になったときにラムダで書いたから5箇所同じことやってますとか言ったやつは死刑でつ >>512
いちいちコードの全処理に名前付けるのかって話よ >>512
高階関数に渡す処理なので
「ここのWhereの指定だけどさ…」とか
「ここのGroupByに渡してるラムダの書き方だけどさ…」で問題なく話が通じる
話が通じないようなところにラムダを書いてるなら使い方のほうが間違ってるかも 513はわからないんじゃなくて分かろうとするつもりが全く無いだけでしょ
その場限りじゃないことが明白なら1行の処理でも
メソッドにするのは当たり前
というか513はメソッドのラムダ表記すら難癖つけて全面禁止しそうだな >>516
じゃあ、メソッド名もそうしたほうがいいのかな? Linqを使いやすくするためには高階関数を楽に使えるする必要があって
そのために導入されたのが無名関数とその表現形式であるラムダ式
Whereに渡す処理を必ず別の箇所で名前を付けて定義しなきゃいけないようだと面倒だし命名負荷が高い こういう話は抽象論より具体例挙げた方が早いね
例えば>>358に出てくるOrderByが引数に取るセレクターを
実際に自分でラムダ式とメソッドの両方で書いてみれば
ラムダ式の意義なんて自ずから分かるよね
理論的根拠はその後で考えればいい
端的に言えば、アホのな初心者がやる「なんでもグローバル変数(フィールド)」がダメなのと同じ理由よ >>522
というより、ローカル変数を禁止してすべてフィールドで書こうとしたらどうなるか、と言った方がたぶん通じると思う。 ここでどんなにラムダ式を否定しようと
大多数の業界人はそうは思わないからわざわざ作られたし普通に使われてるんだよ
マイノリティなの自覚したほうが良い ラムダ式なんて書こうとした瞬間に明らかに特殊なことしようとしてんだからメソッドにしろよw
すくなくとももう一回その処理必要になった時点でメソッドにしたほうがいいだろ?
違うか?
検索一つとってもお前と別のやつは異なるラムダ式で同じことをやるかもしれなくて
そしてそれを見つけるのは異常に困難であると予想できる >>526
違うよ。
メソッドというのは「意味のあるある程度まとまった処理にその処理を表す名前をつけたもの」だ。
あまりに単純でアドホックな処理を無理にメソッドにしようとすると、
(1) 命名に困る(処理が単純すぎて他と区別できるような適切な名前がつけられない)
(2) メソッドの数が無意味に増えることで見通しが悪くなる
という問題が起こる。
だから、>>524をやったら起こるのと同じ問題を回避するためだよ >>528
え?じゃあ、同じことやってるのにラムダ式1、ラムダ式2、ラムダ式じゃない方法1、ラムダ式じゃない方法2みたいなコードがソース中に散布されちゃうけど
何か防止する方法あるの?
検索一つとっても起きちゃうよね? >>529
馬鹿の一つ覚えはよくない。
もちろんケースバイケースで再利用を意識してメソッドにした方がよいケースもある。
今の論点は「ラムダ式に存在意義はあるのか?」ではないの?
誰も「デリゲート引数には必ずラムダ式を渡すべき」などとは言ってないでしょ >>530
質問にこたえてよ
はぐらかさないでさ
一件でもあるなら最早使うべきではないでしょ? 何を指してはぐらかしてると言ってるのか意味がわからないけどw
この人は暇つぶしがしたいだけなのかな?
まあ俺もそうだから文句はないけどねw LINQは難しくてよくわからないから使用禁止っていう会社本当に有るらしいよ 同じようなものをコピペするのが嫌だったら
普通にメソッド定義して、それをthis.methodみたいに指定も出来る
var q = new List<int>();
q.Add(10);
q.Add(2);
q.Add(5);
q.Sort(this.method);
foreach(var r in q){Console.WriteLine(r.ToString());}
このthis.methodが
private int method(int x,int y)
{
return x - y;
}
にしても動く
C#ならこれらの条件式を別のクラスでstaticでおいていても、別のクラス.methodみたいな指定で動く
まぁ、何度も同じような式を使うなら別のクラスに集めておくというのも無くは無いけどね >>536
opencvの画像処理とNAudioの音声処理って同期できるんでしょうか?
画像フレームイベントと音声フレームイベントでそれぞれ同じファイルに対して書き込んでいくイメージが浮かびましたが USBカメラでトラブルなくなんとかなりそうなのはUWPじゃね? ラムダ式使うなの人はvar使うなと同じ匂いがするな λ式つかうとき、なんとなく不安なので()で囲みたくなる
()で囲むなら{return }ぐらい書いても対して変わらないような気がしてくる 一番優先すべきは自分が(グループが)理解しやすいかどうかだからいいんじゃない?
三項演算式も単純な物以外は使わない方がいいと思うし
()で囲むなら囲むで全部囲むと統一すべきとは思うけど >>539
まあ身の回りにいないならどうでもいいや >>507
MediaFoundationでいいじゃん。 c#はコードの記述量を減らす仕様の追加は多いよね
書き方も奇妙でなく今までの記述と整合性はあるし悪くない
でも増えた仕様を知らないとソースは読めないし覚える事が多くなって初心者が戸惑う事はないのかな varを使っていて読みにくいコードはvarを使ってなくても読みにくいって
ufcppの人が言ってた >>544
知らない記述が出てきた時点で調べれば事足りるだろ >>544
いつまでたってもマクロを実装しない時点でコード量を減らしたいという意図があるとはとても思えない
ソースジェネレーターも全然違うしあくまで安全性第一な言語 それはそうだけど??とか.?とかは調べても分からんよねっていう(検索しても引っかからないので) C# "??演算子"
とかで検索すればヒットしたよ >>546
>>548が言うように調べにくいっていうのはあるわな
ラムダ式って呼び方知らなきゃググるだけでも大変だし >>549
それ、"演算子" っていう知識があるから
まあ最近は C# ?? で 演算子 をサジェストされたりするけど >>550,551
確かに初心者はラムダ式や演算子なんて用語は最初は知らないだろうけど、学習の過程で当然学ぶべき事柄でもあると思うよ。
だから、やりたいことだけググって断片的な知識を積み重ねるだけでは不十分で、最低一冊は入門書とかで基本的な用語や概念について一通りは理解できないまでも聞いたことはあるというくらいにはなっていくべきだと思う。 他言語経験者が入門書をバーっと一通り見るなんて1日ありゃできるんだし、それすらやらずに演算子という単語も知らないんだから調べようがない!とかどんだけ甘えたいのとしか思えない
はじめてのプログラミングでC#やってますってのならなおさら入門書ちゃんと見ようねってだけでは ところで質問なんだけど、Jpegバイナリのポインタ、もしくはSpan<T>からBitmap作る事って標準ライブラリで可能?
byte[]にせずStreamでラップもせずに出来る方法があれば教えてもらいたい > Streamでラップもせず
の理由は?
これさえなければUnmanagedMemoryStreamで簡単だと思うけど >>556
別に大した理由じゃないから実際現状はImage.FromStreamにUnmanagedMemoryStream渡してやってるけど
瞬間的に大量のjpegを変換するから標準でSpan<byte>かbyte*で渡せる関数があるならそれに越したことはないなと .NET5って.NET Frameworkと.NET Coreを統合した奴になるんですか?
Windows10のデスクトップ用に書いたコードが自分のiPhoneでも走るようになるんですか? 夢のある勘違いだな
俺もできるならそうあってほしい frameworkはwin10を続ける限りサポートしなくちゃいけないけど
coreは3年間だけで済む
まったくかんたんだ .NETなんて辞めればいいのにと思うけどねぇ
.NET Coreの事は全然詳しく無いけどGUIアプリ作るなら結局はWPFと殆ど同じぽいし
こんなの流行る訳無いよなぁ
WinFormsぐらいの気軽さが無いとちょっとしたアプリを作る気にもなれないw
もうそういうのも何でも感でもwebみたいな事になりつつあるけど >>560
別ける必要がなくなったから統合するだけ >>562
で、.NET5ではどんだけサポートしなきゃならないの? >>563
んだんだ
WPFは近所のコンビニに行くのにジェット機使うぐらい面倒臭い 意識高い系が作ったから
XMLで画面デザイン、俺かっこいい >>568
ちょっとなに言ってんのかよくわかんないな by 富澤
しかもXMLじゃなくてXAMLじゃないの? XAMLがXMLでないならそうだろうな。
以下世に出たときの売り文句や
EXtensible Application Markup Language (XAML) is a XML based markup language developed by Microsoft. It is used in several Microsoft technologies like Windows Presentation Foundation (WPF), Silverlight, WinRT, Universal Windows Platform, etc. to define the User Interface for applications. それでも「XAML=XML」じゃないだろ
じゃ、なにか?XMLで書けばデザインできるのか?
<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet type="text/xsl" href="testxsl.xsl"?>
<おこづかい帳>
<支出>
<内容>
<日付>1月20日</日付>
<交通費>780</交通費>
<食費>980</食費>
<嗜好品>250</嗜好品>
</内容>
<内容>
<日付>1月21日</日付>
<交通費>950</交通費>
<食費>1200</食費>
<嗜好品>300</嗜好品>
</内容>
<内容>
<日付>1月22日</日付>
<交通費>500</交通費>
<食費>1500</食費>
<嗜好品>250</嗜好品>
</内容>
</支出>
</おこづかい帳>
・・・一体、どんなデザインになるんだろな、これ? >>567
出自が違うからだろ
合併した会社になんで今まで別だったの?
って聞くようなもんだ >>568
まあある意味意識高い系が作ったから自動テストが楽でCI/CDバッチリってところだよな。 デメリットもあるけど、メリットもあるね。
ザマリンは取り巻きがユーザーを馬鹿にして炎上したけど htmlを触れる程度の知識があればxamlでアニメーションをやらないレベルまでなら簡単に扱えるはずなのにな
webアプリを使える設定の人が何故そこまでxamlを拒否するのか理解に苦しむ このまえ興味本位で「WinFormsぐらいの気軽」なソフトを WPF で作ってみたけど、別にタイヘンってことはなかったような。
まあ環境が違うから覚えることはあったけど。・・・もう忘れたけど。w 一応Forms爺とWeb派は別勢力だと思いたいところだけど、たしかに
Forms爺がWPFをdisるためだけにwebを持ち出している感も否めない。 >>577
簡単だけど記述量が多くて結構面倒って感じ
css程度の記述量で済むようにして欲しいわ
あとstaticresourceやdynamicresourceとか使おうとすると結構ムズい >>566
winFormsと同じように書けますよ。
イベントハンドラーで。
ただ、みんな苦行プレイ(mvvm)が好きなだけ。 >>566
WPFの実装みるとまず
コードベースの実装があってそれに対応する
XAMLベースの表現(記法)がありますね。
なのでその逆で考えれば良いです。 Formsもそのまま使えば楽ちんだけど、ちょっと凝ったことやってオーナードローに手を出すと途端に面倒になる
>>584
WinUIになるとvmにイベントハンドラを書けるから、そこらへんは解消されるんだけどね >>586
単にwinFormsの改良版としてWPFつかえますよ。
(テンプレートをXAMLで実装してるので
幸福になれます。)
その基礎の上にMVVMを追加してるだけです。
早く気づきましょう! WPF(XAML)固有の問題なのか宣言型に一般的な問題なのか判断するだけの
経験がないのでアレだけど、WPFの一番嫌なとことは
自分が書いたコードでも後から見たとき何をどうやって実現してるか、
理解するのに時間が掛かり過ぎること。これが他人の書いたコードならなおさら。
なんちゃらフレームワークでMVVMなんてやってるとこの傾向にさらに拍車がかかる。
こんなもの推進してる奴はメンテを考慮する必要性がなく他人のコードを読むことも
やらない人種なんじゃないか?というのが偽らざる感想。
ちょっと上のラムダ式批判とかはスタティックおじさん級の無理解か勘違いだろうけど、
誕生から15年とか経過してここまで普及しないXAML系はやっぱり根本的にどこか問題があるとは思うね。 >ここまで普及しない
そもそもこれ事実かねぇ?単に5chでアンチWPFの声が大きいだけにも思うが。 初心者スレでイキってないでそろそろこっちへ行け
WPF(.NET4.x, .NET Core) GUIプログラミング Part25
https://mevius.5ch.net/test/read.cgi/tech/1612522463/ だって専門スレだと笑い者にされる馬鹿にされるんだもの >>588
これは同意
QtのQMLとかと比べると
XAMLが不必要に冗長でノイズが多いのがよく分かる
https://doc.qt.io/qt-5/qmlfirststeps.html その辺の印象はやっぱりxml自体に馴染みがあるかどうかで違うんだろうな。
自分は独自文法よりxmlの方がよっぽどありがたいが。
あと現実問題として、サードパーティのコンポーネントを追加するなら名前の
衝突をを考慮しないとならないが、xmlなら名前空間が規格に含まれているので
こういった用途に適している。 >>592
Blendを作る為に必要だった機能だからね。
使わなきゃ意味...
>>593
XAMLとその上に構築された
MVVMライブライリがゴッチャになってるね。
XAMLのタグはC#で簡単に作れる事に
気づけてない人の割合は99%ぐらいなのかな? リソースに対する優位性は?
ロード時間を犠牲にするだけのメリットが
無いと選択されないな winformと同じくらいのコード量で作れるようにしてくれないと困るわ >>596
老害はそのままWinForms使ってなよ pinta も paint.NET もWPFを採用していない
事が全て(=向き不向きがある)
だと思うのだけどね。
信者はそれを受け入れられないw WinFormsに回帰せよ
見た目は最新のモダンなGUI部品、
中身はWinFormsってのも不可能じゃないでしよ、頑張れよMS QImageかQPixmapがMatサポートしたら
考える >>599
よりによってWPFリリースより前に開発されたソフトを持ち出す頭の悪さ >>603
WPFは2006年。pintaは2010年。
4桁の比較も出来ない馬鹿は死ね pintaはPaint.NETを参考にクロスプラットフォーム対応でGTKで開発したもの
元のPaint.NETの開発は2004年 ちょっと戻って整理してくれ。
WPFは従来型(コードビハインド)での実装も
根本レベルでサポートしてるのに、
なんでwinFormsに回帰したいん? >>596
自分で書かなきゃならないコード量ってそんなに違ったっけ?
このまえ「WinFormsぐらいの気軽」なソフトを WPF で作った時は自分で書いた量はそんなに違わなかったような。 Wpfは、Prism.Unity等のDIコンテナ使う前提で設計すると、コード量は却って少なくなるんじゃね?
DIそのものじゃないが、Event Aggregatorなんか凄く便利だ 非同期の勉強してるんですが、
1つの処理を非同期にしたら、それを呼び出すメソッドも、更にそのメソッドを呼び出すメソッドも非同期に・・・・
って感じになってしまうんですが、ピンポイントで非同期にして上手い設計にするコツを教えてください。 >>610
煽る意図は全然ないつもりだけど、
そもそも非同期が何を意味してるのか理解しているように聞えないので
まずそれを理解するのが先だと思うよ。
設計とかその後の話でしょ。 >>610
非同期の勉強を始めると一度はぶつかるよね
同期メソッドから非同期メソッドを呼び出せばいいだけでググれはすぐでてくると思う >>610
補足だけど設計という話になると、非同期メソッドを呼び出しているメソッドが非同期メソッドじゃない様な設計をいいとは思わない でもこう間違ったのはよく理解できる
結構な数の入門書やブログに、こういった間違った記述があるんだよな ありがとうございます。ググってみました。
非同期処理の結果を受け取るために、Result ばっかり使用していたのですが、デッドロックするという情報を見て脳死してました。
・戻り値が欲しい場合は呼び出し元の同期メソッドで、GetAwaiter(false).GetResult();
・非同期メソッド内で処理完結させたい場合は、GetAwaiter(false).OnCompleted();
・同期メソッド内で非同期処理を完結させたい場合は、Task.Run();
をすればとりあえず大丈夫そう?という感じみたいなので、これをベースに考えてみます。
今勉強で作ってるのが WinForms アプリですが、多くの処理の起点が戻り値 void のイベントハンドラで、
GetAwaiter(false) にすれば、空いてるスレッド使うことでデッドロックのリスクも下がる(なくなる?)みたいなので、試行錯誤してみます。 >>615
それはResult云々というより変な場所でawaitしてるとじゃないの?
Awaiterは直接扱う物じゃないしConfigureAwaitの間違いだと思うけど
基本的にはUIスレッドで待つ・結果を得るならTaskをawaitするだけ
ライブラリ作るとか、妙な組み方しなければ意識する必要はないはず
元スレッドを解放したい場所(多くの場合UIスレッド)でawaitを使う
非同期処理ならば結果を取り出して返すのではなくTaskを丸ごと返す
勿論それが絶対ではないが、大抵の場合はそれで済むんじゃないかな
あとはProgress<T>とかContinueWithとかTaskExtensions.Unwrapとか >>600
WinFormsは要素を大量生成するとバカ重くなるという現代GUIには向かない根本的欠陥がある
WinFormsもといWin32はコントロール一つ一つがCreateWindowで生成されるウインドウだからな
その点WPFはWindowクラス以外は基本「ただの絵」であるため大量生成してもそこまで重くならない
が、WPFは抽象化に抽象化を重ねまくったせいで初期の時点でかなり重いという元も子もない産物だが WPFは無かった扱いにしてパフォーマンスも記述も洗練された奴を作り直してくんねえかな
悪くなかったとしても15年前のアーキテクチャだ
バージョン2が出てもいいだろう WPFはもうサポート終了にして終わりでいいのではw
XAMLがクソ過ぎるw
もっとマシなものを作ってほしいわ 新しいものが出たってどうせついてこれないんだからそのままForms使ってればいいんでない? >>623
XAMLじゃなくてMVVMじゃねえの?
WPFはwinFormsの上位互換だが。 あからさまにメリットなかったやん
書籍も全くない有様 メリットがないは言い過ぎで、レイアウトやデザイン性の自由度は明らかにFormより圧倒的に高い。
反面GDI+の機能を完全に包含してない、みたいな問題点もあった。 こんど WPF + VMU で
少し状況かわるんじゃねーーの。 >>624
ホントそう思うしMSも下手にWinFormsと同じようにイベントハンドラー書けるようにするもんだから>>625みたいに上位互換とか勘違いする奴が出てくる
別物としてMVVM守んねーと書けないからちゃんと勉強しろ、できねー奴は切り捨てる!
ぐらいすればいいのに で、MSが開発者から切り捨てられるわけですね
笛吹いても誰も踊らない じゃあ、それができてるサンプルないの?ってゆーたら1個も出てこなかったじゃない? 基本線で上位互換です。
@ WPF + イベントハンドラー
A WPF + MVVM
B WPF + MVU
メジャーなもんでもこんなに... この世のどこにもないものを何故か偉そうに語ってたってのが真相 WinFormsと同じコントロールを用意しているなら上位互換だけど
WPFはコントロールの数は減っているし、同じ名前ですらないし
ちょっとしたツール作るだけならWPFで作る理由が全然無いな
世に売るようなものでデザインとかスケーリングとか考慮するなら
WPFでもアリだろうけど、今はelectronとかで作ったほうがmacにも対応出来るし
WPFはもう過去のものという感じがするわ 業務アプリだけど、WPF出始めから採用して、全然問題なくみんな移行できたよ。 前も書いたかもしれんけどデータ数が多い折れ線グラフなんか実装しようとすると
行き詰るんだよねWPFは。これでWPFが嫌いになった。
あと、これは勉強不足で勘違いしてるかもしれないけどGDI+みたいに印刷と画面を
透過的に扱えない。 MVVMで使ってるコントロールも
内部実装はMVVMしてませんしねwww >>641
無いです。
外向きにMVVM対応させて内部実装は普通の実装です。
まあ最短高速な実装です。
昔クラスが1000以上あるでかいグラフコントロールを改修したときも、
内部はMVVMじゃなく普通の実装でしたし、
それ以外の関連コントール(とある会社のWFPコントールスイート製品)
もそんな感じでした。 chartコントロールが標準で用意されてないのが気に入らん
上位互換ならコントロールもwinform以上用意しとけよ そもそも上位互換って言ってるのはMSじゃなくて>>625だし >>627
そのGDI+ももう明確にレガシーとされたしね。Forms使ってる人もDirectXにしろってことなんだろう。 >>643
作ろうと思えば作れるだけマシ
WPFはちょっと頑張れば最新ゲームのUIかのようなトリッキーなものも普通に作れるからな
WinFormsで同様の事をしようとするとOnPaintオーバーライドするなりしてGDIやDirect2Dで自力描画しないといけない(描画のみならずマウスの感知動作なども自力計算)
実際俺は自力描画でWinForms版マテリアルデザインとか昔作ってたけど >>649
俺もWPFでそれなりのことをやってるが、
そもそも業務アプリにはそんな「トリッキー」な機能は要らん
他の人も言ってるが、WinFormsで充分
…という話がまだ理解できないのか? 作ろうと思えば作れるって話なのに、そんなもの要らん→だからFormsで充分、と
飛躍するところがいかにも頭が悪い。 >>651
別に俺はWinForms要らないとも言ってないしWPFマンセーする気はない
小規模アプリであれば「WinFormsで十分」は同意だけど、中規模以上だと何だかんだでMVVMのが生産性高いしカスタム要素が必要になる率も高いから「WPFで十分」も同様に言えるんだけどな
まぁ俺はそもそもqt派だからもう全然まともにデスクトップ開発でC#使ってないが トリッキーな機能は要らないからプレゼンテーションはフレームワークにおまかせして
人間はモデルの実装に集中しようぜ
それができるのがMVVM、MVUだよって話だろ
WinFormsだと一番省力したいプレゼンテーションで疲弊するじゃん MVVMなんかいらないよ
いらないから誰も使ってないんじゃん MVVMは単なるXamlの付属品じゃなくて、Prism.Unityを中心としたページ遷移型のアプリケーション構築
EventAggregatorによる疎結合のイベント通知、DIコンテナによるモジュールの管理なども有る
勿論web系でも使われている技術だけど、Formsではあまり使わない技術だね
ここらへんを一度使っちまうとFormsには戻りたくなくなる >>659
嘘じゃん
画面直したら処理も書き換えだよ
そんな嘘ばっかり言ってるから誰も相手にしなくなった 冗談のつもりだったのにホントに日本語理解できてないのか?
ふらっと C#,C♯,C#(議論用) [無断転載禁止]©2ch.net
https://mevius.5ch.net/test/read.cgi/tech/1469538912/
WPF(.NET4.x, .NET Core) GUIプログラミング Part25
https://mevius.5ch.net/test/read.cgi/tech/1612522463
移動できない奴は、バカなのでぼくの主張は間違ってますって言ってるのと一緒だと気付けよ 何度も言うけどこんな過疎スレでなんで一生懸命「交通整理」してるのか、
その自分の動機の卑しさを自覚できない奴が一番バカっぽいと思うよw
誰かのため?みんなのため?
絶対違うよねそれ。
いやこれマジで大丈夫か。 >>616
615じゃないけど質問です
>基本的にはUIスレッドで待つ・結果を得るならTaskをawaitするだけ
wpfで結果を得てプロパティを変更しイベントが発生する場合
Dispatcher.BeginInvokeは必要ですか ? >>663
移動しない理由は何?
頭のいい回答を期待してる。 Ruby on Rails で、控えめなJS フレームワークの、Stimulu を使えば良い
規約で、HTML のdata-controller 属性で、JSファイル名・コントローラーが決まるので、
そこにイベント処理を書くだけ
DOM・コントローラーは、多対多
1つのDOMは、複数のコントローラーで処理できる。
HTML内で、同じコントローラーを複数定義できる >>664
引用してる文と質問内容が全然別物に見えるので回答できん
とりあえずINotifyPropertyChangedでのBindingならPropertyChangedは別スレッドで発生させても問題ない >>664
そのレスはTask使ってるのに一々同期的に取り出してそうに見えて
固まらせたくない箇所を非同期にすれば良い的な意味合いで質問と噛み合うかどうか
そのプロパティを変更するのがUIコントロールでスレッドが異なれば必要…なんだけど
TaskをConfigureAwait(false)してなければawaitは待機元スレッドに帰ってくるよ
BeginInvokeはTaskベースで使うかな?別スレッドから実行させるならProgress<T>とか
4.5未満としてもSynchronizationContext.PostやTaskSchedulerを指定してContinueWithかな surfaceやipadなどで使えるクロスプラットフォームの、ペイントアプリを作ってみたいのですが、
C#が採用されているペイントソフトや3DCGソフトで有名なのってありますか? >>670
https://www.pinta-project.com/
なお paint.netのソースはwin32Api 知ってないと
キツいぞ。
projectはformだがwindow周りの実装は
ほぼwin32apiだ int port;
に対して
if( port < 1 && 65535 < port )
みたいなtrueになりえない条件文ってコンパイル時の警告出せないんでしたっけ? >>668,669
質問が下手ですみません。質問を変えます
private async void Button_Click(object sender, RoutedEventArgs e)
{
Button.IsEnabled = false;
await Task.Delay(2000);
Button.IsEnabled = true; // *1
}
タスクが完了したときにUIスレッドが作業中だったとします。
そうすると、UIスレッドは作業を中断して *1を呼びますよね。
この解釈で正しいですか ?
だとすると、Buttonに対して
Button.IsEnabled += Button_IsEnabled がある場合、
UIスレッドが作業中だとUIスレッドは混乱するのではないかと思っています。
混乱を解消するには、awaitの後処理にはUIスレッドが暇になるのを待つ必要があるのではと考え、Dispatchr.BeginInvokeを思いつきました。
ただし、BeginInvokeを追加した例が見当たらないので、もっとうまい手があるのかもしれないと思い、質問しました。
長文失礼 実際の実装は知らんがWindowsのメッセージループを処理するスレッドがUIスレッド(メインスレッド)だろうから、その手のスレッドプールで処理されるものは処理が終わった時点でメインスレッドにメッセージをポストしてメインスレッドがメッセージを受信したときに終了後の処理がされると言う流れかと >>675
TaskとThreadを混同してるってオチ?
君が懸念してることは別Threadを利用したときに起こる事であって、DispatcherInvoke類も"別Thread"からUI操作を行うときに使う機能 >>675
作業を中断して*1を呼ぶというのは不適切に感じます。中断というならButton_Clickがawaitで後続処理が保留になる所でしょうか
そうなると*1が再開される手順ですが、UI処理はメッセージ単位なので>>676が仰る様なその合間に完了を感知してになると思います
このメッセージキューがパフォーマンスや互換性問題から専用スレッドによる処理が前提なのでBeginInvokeなどが必要になる訳です
翻ってawaitを使うとその辺りをやってくれます。FormsやWPFで異なる手順を抽象化したものがSynchronizationContextやTaskSchedulerですが
それらを推し進めて簡便に扱えるようにしたのがasync/awaitです。※同期的待機内で非同期待機とかしなければそんなに留意する必要はありません
技術的な解説については↓等が参考になると思いますが、直下のコードについてはTaskベース世代のものではないですね
https://docs.microsoft.com/ja-jp/dotnet/desktop/wpf/advanced/threading-model?view=netframeworkdesktop-4.8 >>677,678
私の例で *1のプロパティ変更と通知ではメッセージループを使っているのかもしれませんが、*1の呼び出しは awaitの後続処理ではないでしょうか
次の例はまずいのではないでしょうか。
private async void Button_Click(object sender, RoutedEventArgs e)
{
await Task.Delay(2000);
MyCLREvent(this, EventArgs.Empty);
} なにをしてまずいというのかはわからんが
各所でThread.CurrentThread.ManagedThreadId表示させて
どこでどのスレッドになってるか確認してみれば? >>679
*1はawaitの後続処理だけど、UIスレッドが空くまで実行されない ボタン2つ用意してこういうので確認してみては
async void btn1_Click(object sender, RoutedEventArgs e) {
await Task.Delay(2000);
Trace.WriteLine("btn1");
}
void btn2_Click(object sender, RoutedEventArgs e) {
for (int i = 0; i < 10; i++) {
Thread.Sleep(300);
Trace.WriteLine("btn2");
}
} csvで数字を読み込んで、それをグラフ化して表示して、GUIの画面ごとスクリーンショットして保存するWPFプログラムを作ってます。
グラフはwindowsformhostを使ってchartコントロールで表示させています。
VisualTreeHelperでGUIの縦横サイズを取得して、RenderTargetBitmapにDrawingVisualを渡してスクリーンショットしているのですが、chart部分が保存されません
Graphics.CopyFromScreenというのも試してみましたがこちらではchartも表示されるものの、ウィンドウのドロップシャドウみたいなものが一緒に保存されてその分縦横がズレてGUIの右下が見切れます。
解決策を教えてください allowtransparencyがtrueになってるとか? ディスプレイ上の座標を指定して、
画面の指定部分をそのままフォームに表示させたいと思っています
まずこれが可能なのかが資料見つかりませんでした
可能なら、毎回スクショ切り取って保存して表示、とかせずに、リアルタイムで反映させたいです
また、そのようにして表示した画面に、拡大や色反転などの加工を行うことは可能でしょうか? 可能かどうかで言えばWindows標準の拡大鏡ツールで実現できてるから可能といえる
C#で実現するのにはまあまず687を試してみればいいんじゃないかな
あと著作権保護されてるコンテンツを表示してる部分は多分無理 リアルアイムでやるならWindows.Graphics.CaptureやDesktop Duplication APIだな VSのProjectの構成って何仕様書で定義するものでしょうか?
外部仕様では見たこと無いのですが世間様はどうしてるんだろうと 世間様じゃ詳細設計で決めてるのですね
参考になります
外仕作成でプロジェクトの構造考えずプロトタイプもりもり作っていたので気になってました Swiftスレにも似たようなこと書いてる奴がいるから、きっとこのことをまとめてアフィブログにでもするんだろう Debug.Printの引数はリリース版でも評価されますか? プロジェクトの構成なのか構造なのか
そもそも構成とか構造って具体的に何? Ruby on Rails は、設定よりも規約
プロジェクト構成・名前付けルールなど、すべて決まっているから、
誰でも、同じ構成で作る
これが「レールに乗る」と言う事。
Rails のルールから外れて、独自なものを作ってはならない
オレオレ構成みたいなものを認めていない 定期的に沸くたびに丁寧に相手するから居着いたパターン こいつわざわざpythonスレにやってきて時代遅れの遺物を押し付けに来る荒らしだろ ム板全域にいるよねこのガイジ
bashスレにもいた時は頭が痛くなったな
ふれあい作業所とかで遊んでればいいのにね ルビキチが珍しく質問に合ったレスを返してるのにお前らヒドイなw プロジェクトのディレクトリ構成はアーキテクチャ設計を反映したもの
アーキテクチャ設計が詳細設計に含まれてるならで詳細設計段階で決める
Railsのようにアプリの機能構成に関係なく一律同じディレクトリ構成にするのもそれなりのメリットがある >>707
日頃の行いが相応に報われてるだけ
フェミフェミ噛みついて本気でフェミに迷惑掛けてるのがフェミ 初心者です。画像の一部をクリックすると画面遷移を行うようなプログラムを
作りたいと考え、自分なりに作ってみたのですが
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class NG2to3 : MonoBehaviour
{
Vector2 Pos;
void Start()
{}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
Pos = Input.mousePosition;
if (-15 <= this.Pos.x && this.Pos.x <= 15 &&
-35 <= this.Pos.y && this.Pos.y <= -15 )
{
SceneManager.LoadScene("scene3");
}
}
}
}
このプログラムで指定したPosの範囲の場合画面遷移を行いたいのですが、
画面の至るところをタッチすれど遷移してくれません。
どこが間違っているのか教えていただきたいです。 ドキュメント読むのもそうだけど実際 にmousePositionの値を見たら良いと思うよ >>713
まったく用途が違うから、普通はその二つでどちらにするかを迷うことはない structとclassの使い分けだったら質問の意図も分かるけど スクリプトから条件で画像を表示させたいんですが、張り替えは出来ても新しく出現させることってできない? I want to display an image conditionally from a script,
but can I make it appear new even if I can replace it? C#でWin32のHeapAlloc(GetProcessHeap(), 0, 0x1000);みたいなことするとGCと競合してバグるったりするの? すいませんw
2Dunityでボタンを押したら画像を表示できるようなプログラムを作りたいのですが、
調べてみても元々ある画像をスクリプトによって別の物に変更するものはあれど
ボタンを押して0から画像を表示させることができるようなものを
見つけられなかったので、できないのかなと。。。どうなんでしょう? >>728
詳細を教えていただきたいですw(__) >>726
アンマネージドだろうから特に影響なさそうだけどね Windows下におけるmalloc = HeapAllocだけど
どこかしらでロードせざるを得ないネイティブdll内で当然の如くmallocは行われまくってる訳だからその程度でバグったら言語として成り立たない バグったらHeapDestroyすれば良いじゃない。by マリー >>727
'c# image 生成' で調べれば? >>735
こちらを参考にSetaActiveを使えばできました!
ありがとうございます。 質問よろしくお願いします。
uint 型の二つの値 x, y について、
x = 0b_0101, y = 0b_0110
のように最上位の 1 のビットの位置が同じなら true を返し、
x = 0b_0101, y = 0b_0011
のように最上位の 1 のビットの位置が違うなら false を返す関数を
作るというクイズをやっていて、
static bool BitsEquals(uint x, uint y) => (x ^ y) < (x & y);
という答えを考えました。
しかし、どうやらもっと演算の回数が少なくてすむ方法があるらしく、
それがどうしても分かりません。
どなたか良いアイディアをお持ちの方がいらっしゃれば教えていただけないでしょうか。
どうぞよろしくお願いいたします。 >>737
あるらしいって、誰かが言ってたならその人に聞けばすむ話でないの?
クイズでも出されたの? クイズって書いてあるな・・
>>737
2つ目の例でも最上位ビットはどちらも0で同じように見えるが?
比較する2つの数値はビット長が一緒なのかとか、もうちょい仕様を詳しく >>739
最上位ビットではなくて1になってるビットの最上位だぞ >>727
ツー・デュニティって何のことかと思った レスありがとうございます!
>>738
> クイズでも出されたの?
おっしゃるとおりです。ネットで調べるのは OK なのですが、
外国語も含めて検索してみても私の力では解決できそうになかったので
こちらで質問させていただきました。
>>739
説明がうまくできなくて申し訳ありません。
x = 0b_0101, y = 0b_0110
の例だと、1 になっているビットで最上位のものが
両方とも下から数えて 3 番目なので true なのですが、
x = 0b_0101, y = 0b_0011
の例だと、x は先ほどと同じですが y のほうは 1 になっているビットで
最上位のものが下から数えて 2 番目なので、false になります。
>>740
補足どうもありがとうございます。
最上位ビット(MSB)というと普通は >>739 さんのおっしゃっているような
意味で捉えられそうなものなので、最初からもう少し丁寧に説明すべきでした。
どうぞよろしくお願いいたします。 >>739
> 比較する2つの数値はビット長が一緒なのか
さすがにそれは仮定してもいいんじゃね? それなら
2*x<y
でいいんじゃないの?
trueなら一番左の1の位置は同じ >>744
x = 1, y = 1 がfalseになるんですけど… それは失礼w
難しいね
y:123456789abcdef
x:12 4 8 演算の回数っていうのがよくわからないが、
BitOperations.LeadingZeroCount(val)
の比較じゃダメなの? >>747
普通に考えたら命令ステップ数のことだろうな
今の時点でビット演算2つと比較が1つなので、boolを返す以上は比較は外せないから、これより少ない(軽い)となると、なかなか難しいね >>737みたいに4bit同士程度ならテーブル引くとかでもいいかも >>749
uint でって指定されてるわけだから、4ビットで書かれてるのはあくまで例でわかりやすくしてくれてるだけでしょ >>746
return x==y || (2x<y && y<=x);
って感じか?わかりづれぇw なんか違うな。
要は>>746に書いてある通り、xとyが1,2,4,8,16,32・・・みたいに
一番左の1が立ってる同じグループにいるかでしょ?
酔っぱらってて頭まわらんw (x^y)<(x<y?x:y)
こんなのはいいのかな?
細かくテストしてないからバグってたらごめん
演算1回比較2回だから演算回数は減ったとも言える
どっちが早いかは最適化とかCPUとか次第な気もするけど 皆様レスどうもありがとうございます。
>>743
> > 比較する2つの数値はビット長が一緒なのか
> さすがにそれは仮定してもいいんじゃね?
補足ありがとうございます。
ひとまず、符号なし32ビット長整数ということにさせてください。
>>744
> 2*x<y
> でいいんじゃないの?
実際、(x ^ y) < (x & y) より簡単なものを探そうとすると
もうそのくらい簡単なものくらいしか候補に残らないですよね。
もしくは、何か発想の転換が必要なんでしょうか。。。
>>745
> x = 1, y = 1 がfalseになるんですけど…
このレスを読んで思ったのですが、
(x ^ y) < (x & y) という計算も x = 0, y = 0 のときは
false になるんですよね。
最上位の 1 の位置を比較するのが目的なので
x や y が 0 のときは気にしなくてもいいのかもしれませんが、
やはりちょっと不自然なので (x ^ y) <= (x & y) のように
等号付き不等号にしたほうがベターでしょうか。
(ただ、
Math.Floor(Math.Log(2, x)) == Math.Floor(Math.Log(2, y))
という式は x = 0, y = 0 のとき false になるようです) >>747
> BitOperations.LeadingZeroCount(val)
> の比較じゃダメなの?
なるほど!こんな関数があるんですね。
BitOperations クラスのドキュメントを読んでみると
「これらのメソッドでは、基になるプラットフォームで使用可能な場合、
ハードウェアの組み込みを使用します。」
と書いてあるので、良い答えになりそうです。
アドバイスどうもありがとうございます。
>>748
> 今の時点でビット演算2つと比較が1つなので、boolを返す以上は比較は外せないから、
> これより少ない(軽い)となると、なかなか難しいね
難しいですよね?!
普通の演算子だけを使うなら考えられるパターンは限られているので、
やはり拡張命令を使うとかテーブルを用意するとか、
なにか根本的な発想の転換が必要なのかもしれません。
>>749
> 4bit同士程度ならテーブル引くとかでもいいかも
>>750
> uint でって指定されてるわけだから、4ビットで書かれてるのはあくまで例でわかりやすくしてくれてるだけでしょ
>>750 さんが言ってくださっているとおりなのですが、
逆にわかりにくくなってしまったかもしれません。失礼しました。
ただ、普通の演算子を組み合わせるだけの方法ではどうにも手詰まりな気がしてきたので、
テーブルというアイディア自体は検討する価値がありそうです。どうもありがとうございます。 boolのために比較が必要という前提なら比較は6種
== != < <= > >=
2項演算子は加減乗除商、シフト、and or xorくらい?
演算→比較の順に評価することになるので1比較1演算のパターンはそんなに多くない
全部試したわけじゃないけど無理じゃない? >>751
> return x==y || (2x<y && y<=x);
>>753
> (x^y)<(x<y?x:y)
色々と考えてくださってどうもありがとうございます。
>>745 さんの猿まねですが、
>>751 さんが書いてくださった式は x = 2, y = 3 のときに false となり、
>>753 さんが書いてくださった式は x = 1, y = 3 のときに true になってしまいますねw
ただ、こうやって苦労を分かち合ってくださるのはとても心が救われます。
本当にどうもありがとうございます。 >>756
> boolのために比較が必要という前提なら比較は6種
> == != < <= > >=
> 2項演算子は加減乗除商、シフト、and or xorくらい?
> 演算→比較の順に評価することになるので1比較1演算のパターンはそんなに多くない
> 全部試したわけじゃないけど無理じゃない?
レスどうもありがとうございます。確かにおっしゃるとおりのような気がしてきているところです。
とりあえずこの前提の場合だけでも (x ^ y) < (x & y) が最善なのかどうか結論を出したいので、
全パターンを網羅して確認するプログラムの作成に挑戦してみたいと思います。(できるかな…(汗) >>737
0を排除できるなら、たぶん
x/y + y/x == 1
になるような気がする。
全然演算の量が減ってる気はしないけどw >>756
全部網羅と簡単に書きましたが、
例えば仮に (20210224 * x ^ y) < 12345 が正解だとして、
しらみつぶしに探してこれを見つけるのは至難のワザですよね。
う〜ん、難しい。。。。 >>759
> 0を排除できるなら、たぶん
> x/y + y/x == 1
> になるような気がする。
!!!
確かにこれ自体は違うかもしれませんし、計算量も減っているとは思いませんが、
発想の新鮮さは私にとって正直感動を覚えるほどでした。
私は問題文にビットという言葉が出ている時点で数値をビットの並びとしか捉えていなくて、
このレスを読むまで数値を数値として扱うという発想がまったくもって出てきていませんでした。
貴重なアイディアどうもありがとうございます。 >>761
演算子のコストは概ね下記のようになってるので、今のところ 737 の式が一番高速だな
代入、加算、減産、ビット演算 < 乗算 < 分岐 < 除算 >>764
代入とかってアセンブラ上はmov1命令だけど実際内部ではxorクリアしてから|=してるだろうからビット演算と同列で並べちゃダメだろ 仕事でJavaをやるとC#って快適だったんだなと実感する
Javaは開発環境の準備からなにから全てが辛い というかjavaはプロジェクト自体が辛いことが多い
客先しかり他のエンジニアしかり この流れに乗って質問するが、
おまいらはこれからC#とどう付き合っていくつもり?
C#をとことん極めて、新しいバージョンが出れば追い、このまま一生C#と骨をうずめるつもり?
それとも、C#は腰かけ程度と考えて適当に付き合い、もっと良い言語が出たら乗り換えるつもり?
質問を言い換えると、C#ってあと何年ぐらい人気言語の一つとして君臨していられると思う?
Javaがオラ狂うによってほぼほぼ有償化された今、
Javaが失速するのは間違いない
あのJavaが、だ
C#だってそんな日が来るんじゃないの?
来るとしたらどんなオチ?
それとも、親方マイクロソフトだから大丈夫? テキストエディタとWindowsにデフォで入ってるcsc.exeでできる範囲で付き合っていくわ
GUIもWinFormsで十分 15年前にいつかは消えると思ってたjsが気づけば最前線にいるんだ
先のことなんてわからんからその時の仕事に合わせて適当に付き合ってくだけよ >>771
プロダクトに最適な言語を使うだけよ
どんな業界でも、年々道具は新しくなるだろ?
プログラミング言語もそれと同じ
中には代々受け継がれた道具しか使わないような職もあるが、それは一般的じゃない 文字数計算のためのCalcDだと思うけど正常に計算できてなさそう
何日後も引数にして、2日後とか3日後で想定した戻り値になってることをテストしてみた方がいいよ
メソッドを分離することとメソッド毎にテストすることの大切さがわかる典型例だな >>781
pow(2, 5000兆)の時点で制約のK番目のKはpow(10, 18)以下を楽々超えるな
要するに最初のシード値を律儀に全部計算するまでもない >>781
https://ideone.com/mLheCz
書きなぐりで何の検証もしてないから違うかも
問題を間違って理解してなければ全然難しいと思わなかったよ ソースコード見えないけど5000兆なんて時間計算量も空間計算量も現実的な値にならんから愚直に文字列計算する方法じゃ無理
最初が1以外なら答えは常に最初の桁の数字になって、そうじゃないときは1じゃなくなるまでの桁数よりKが小さいか同じなら1でKがそれより大きいなら1以外で最初に現れた数字が答え パラメータの与え方が間違ってるなw
Console.WriteLine(mi.GetDigit((long)5e15, 9460730472580800)); >>785
競技プログラミングでそんなひねくれた回答に何の意味があるの?
知らんけどとんち問題じゃないんだから実行時間2sメモリ976MBという制限で作れてるのか、出来てなかったら減点とかそういう感じでしょ 解法を自然言語で書き下しただけなのに対してひねくれた回答ってどういうことだ 処理時間短縮のために工夫したアルゴリズムを文章で書いただけじゃん
捻くれたと捉える方がどうかしてる >>787
競技プログラミングってある種のとんち問題だぞ 競技プログラミングって問題文を読み解きいかに計算量を少なくする解法を見つけるかに特化した問題が多い
プログラミング知識より数学的知識やひらめきのほうが重要なこと多い
大抵の問題はメモリも処理速度も大して必要とせずに数秒以内で解けるような解法が存在してる プログラミング技術を競うものかと思ってたけど関係ないのも多いんだな
まあ今回の問題がそうだったって感じなのかもしれないけど数値設定がやってくれと言わんばかりにおかしいもんな ちゃんとインプットのチェックロジックを作れば初っ端に気付ける事なんだよ
pow(10, 18)はqword範囲内なのに対して1以外の文字長は最小の2だとしても余裕で範囲外だからな >>784
ありがとうございます、参考になります
でもこのコードだと入力が
1
1
や
1121
2
の時2を出力してしまうので不正解になります、正解は両方とも1です。
>>785
たぶん785さんが正解だと思います。私は問題文を愚直にシミュレートしたコードを
書いてしまいがちなせいでよく制限時間をオーバーします
>>794
プログラミングの技術力向上のためと思い、やり始めたのですが
これはむしろ算数、数学力の競い合いだなと感じています >>795
一応数学的な話で 2^5000兆>10^18 の比較になる
こんなんチェックしなくても一目で問題ないことがわかる >>797
だからこそ標準入力から渡された桁数指定であるKが10^18以下であるかのチェック構文をちゃんと書けばその時点で気付けるって話
781のコードはそれが書かれてないから「Kは10^18以下」っていう制約自体を見逃してるんだろうな >>789
競プロっていわゆる普通のプログラミングとか数学とかとは別の世界だと思う >>796
どっちもケースもちゃんと1を出力するよ
可読性重視で冗長に書いたけど合ってるんじゃないかな?
知らんけど。
非OOPで短く書き直すとこう
https://ideone.com/f58hKP 新聞紙を100回折りたたむと厚みが宇宙と同じぐらいになるって奴ね >>785
おまえアタマいいな。
自分は3分考えて分からなかった。
792 の言うようにひらめきの世界だわ。
3分の間にアタマに引っかかっていたところに手が届いてれば正解に行き着いてたかも、とか 785 を読んで思いましたまる Math.Pow(2, 5e15)はInfinityになって計算できてないの気持ち悪いな
Kが10 ^ 19まで広がると日付次第ではバグる あーなるほどそういう問題なのね
まったく気づかなかったw
冷静に数字見りゃそりゃそうだよね
こんなスレでそんなひねくれた問題が出てくると夢にも思ってないし Benchmark.netにてAllocatedのサイズは見れるんですが、何のオブジェクトかの内訳詳細は見れないんでしょうか? closedxml初めて触ったけどすごいね
エクセル操作プログラミングで毎回うんざりしてたのがウソみたいに快適
gasのスプレッドシート制御と同じような感覚で書けるしusingも使える 以下のような2つの構造体リストを重複除外して結合したいのですがどうすれば良いでしょうか。
Unionをすると重複したまま結合されてしまうので困っています。
public struct Menber
{
/// <summary>
/// 部署
/// </summary>
public int Id;
/// <summary>
/// 名前
/// </summary>
public string Name;
}
List<Menber> list1
list[0].id = 1
list[0].Name = 田中
List<Menber> list2
list[0].id = 1
list[0].Name = 鈴木
list[1].id = 1
list[1].Name = 田中
list[2].id = 2
list[2].Name = 吉田 >>807
Unionのドキュメントぐらい読もうよ。
IEquatable<T>を実装しろって書いてあるでしょ
構造体の場合はEqualsは全フィールドとプロパティが等価なら
trueを返すように自動実装されるはずだと思ったけど、UnionはEqualsの方は
使ってくれないんでしょうたぶん。
知らんけど。 >>809
だよな。騙されてるんだよ、相手するだけ無駄。 なんか久しぶりにc#に戻ってきたら
public int GetIntVal
{
get => _intVal;
}
とかプロパティの取得に=>とか使ってて意味がわからなかった
この手の構文って今から憶えるとしたらどこのサイトを見たらいいでしょう public int IntVal => _intVal; の形式はよく使うけど、>>811の形式は個人的には嫌いだな
811の形式はgetだけなら冗長なだけなのでsetアクセサを書く必要のある場合のみ意味があるわけだが、
setは副作用そのものなのでexpression bodied syntaxで書くのはあまり良くないと思う 構文調べんじゃなくてまずバージョンアップの変更点一通り見てきなよ
まずはそこからだろ https://ufcpp.net/study/csharp/
バージョンごとの新機能はここに纏めてあるから、ダラダラ見てみるといいよ Class class = new();
が地味に便利。 ラムダ式は初見で何じゃコリャって思ったけど、今じゃガンガン使ってる。
あっさりコーディングできていいね。 var hoge = new();
で、俺様が何をインスタンス化したいか的確に判断してコンパイルしてくれるAIできないかな >>820
それ出来たとしてもお前がインスタンス化しようと思ったものが正しいとは限らんから結局バグるだけやぞw 思考をホットリロードするの?
また新しいUSBガジェット買わないとならないじゃん そんなとこまで読み取ってくれるならもうコードすら書かなくて良いようにして欲しい ObservableCollection<LongLongClassName>
とか
ConcurrentDictionary<Guid, ConcurrentDictionary<Guid, DeviceInfo>>
とか
見ただけで吐き気してくる宣言。
なげぇんだよ ReadOnlyReactivePropertySlim<List<string>> INotifyCollectionChangedとか
BuildinglistCollectionViewとか
FrameworkContentElementとか
PolyQuadraticBezierSegmentとかな ←最長ぢゃねーか?
ObservableCollectionはクソいっぱい使ってるんでなんとかしてほしいわ >>812
MSのリファレンスほど無味乾燥な読み物は無いわ
図も表もスクリーンショットも無く、
ただただダラダラと書き連ねててまったく読む気せんわ BindingOperations.EnableCollectionSynchronization >>830
箇条書きとか図を付けろっつってんだよ、ヴォケ
一般のブログが方がよほどうまく説明できてるわ 別にリファレンス読めって人もMSのリファレンスが読みやすいとは言ってないぞ 空白やアンダーバーで区切らないPascal形式だから余計に見づらいよね。 >>834
好みの問題と言えばそれまでだけど個人的には
Pascal形式が一番相対的にマシだと思うし、だから
比較的若い言語であるC#の文化では標準になってるんだと思う。
しかし、いつもの交通整理の人仕事しろよ。
いつまでこの状態を放っておくの?
やっぱり自分で自分に文句は言えないってご都合主義な事情かねw 高い知識を持っている技術者や学者さんが
人に文章として伝える(分からない人に分かるように伝える)技術が高いとは限らない
むしろそれが下手な人が多いので、情報系の大学の講義はほにょつまらんしわかりづらい
別の仕事につきながら片手間に独学で勉強したあとに
学生時代のテキストや講義資料みると
いまじゃ簡単なことが、どんだけわかりづらい教え方してるんだろうと思った
いい先生がいればその頃からプログラムが楽しくて好きになってたんだろうなと 製造の人員に限ってみれば、分かりやすい(日本語の)文章を書けない人が、キレイなコードを書けるとも思えないんだけどね。
コードは機械に対する指示書だから、そう見ると「(人に対する)分かりやすい文章」との共通点は多い。
あと、教師の教え方についても、特定の人に分かりやすい教え方が万人に対してそうとも限らない。
自分の場合は振り返ってみれば開発環境が違うけど C のポインタはテキストを読んでもさっぱり分からなかった。
けどいつの間にか分かるようになってた。
分かるようになった後は「いまじゃ簡単なことが」なんで分からなかったのか分からない状態で、今も分からない。
ある意味での概念的な関門があるんだろうな、とか思う。「自転車に乗る」ってのとどこか似てるような気もしなくもない。 それを突き詰めると日本語って欠陥言語じゃね?という結論に行き着くんだけどな
ポインタが難しいってのもカタカナ英語だからってだけの理由だから コードと自然言語は別物だよ
自然言語には関数がない >>838
その難しい理由ってお前さんがそう感じただけで別の人にとっては別の理由があるだろう ポエムのスレになってきてるなw
>>839
その通りだけど、人の能力という論点で言えば
「可読性を意識して書く能力」は恐らく作文とコーディングで共通部分が大きいと思う。 >>841
自然言語が達者な(しかし数理に弱い)人って、手続き型プログラミングの方向に進んじゃうんだよ
しかもどういうわけかみんな1つのルーチンを長く書きたがる
冗長な長文に慣れてる&関数を使わないで生きてきたから癖になってるんだと思う
意味があるなら1行でも関数にするなんてタイプはめったに居ない 関係ないけど実装工程を製造って呼ぶ文化、アタシ嫌い >>844
いちいち企業の方言に好き嫌い感想言うな
そこはそう表現する以上の意味ないだろ 大した理由もなく企業文化に文句付けるやつ客先で滅茶苦茶印象悪いから発言に気をつけろよ >>837
コードは機械に対する指示を機械が理解可能な範囲内で
人間とってできるだけ分かりやすいように書くもの
読み手として意識するのは機械じゃなく人間
だから自然言語で論理的な文章を書く力とかなり部分が共通なのは当然 >>844
実装工程の定義がわからんけどコーティングなら製造でいいんじゃないかと思う
やってる事は組立工員とあまり違わないし >>848
毎度お世話になっております
本件、拝承
御社のレベルに合わせて客先で「アタシ嫌い」とか言う奴を連れてきてしまい申し訳ないッスw >>844
現実を見ろよ。実装なんざ仕様書をプログラミング言語に置換しているだけだろ。製造って銘打ってもらえるだけありがたい。 建設仮勘定たてるために原価計算ちゃんとしようとしたら、製造以外に入れようがないんじゃないの? >>845みたいに発狂する奴って日本人ちゃうやろ
そもそも製造なんて言葉はおかしいのは事実やろ
流れ作業で作れるなら誰でもええやん 何でスレ違いなのにこのスレに書き込まなきゃならないんだろう
義務感でもあるの? >>854
製造はラインのイメージが強いけど、流れ作業でしないものも立派な製造だよ。
一般的な商品開発に疎い人ばっかなのかな。 C#.NETの質問ですが
System.Web.Helpers
を参照しないといけないという情報までは辿り付きましたが
参照しようと検索しても出てきません(一覧にない)。どうすればいいんでしょうか? >>859
NuGetから、Microsoft.AspNet.WebPagesをインストールすることでいけました!
ありがとうございました。 C# というか ASP の質問かもしれないのですが、
public class HiddenFieldEx : System.Web.UI.WebControls.HiddenField
{
public string TextEx { get => (string)this.ViewState["TextEx"]; set => this.ViewState["TextEx"] = value; }
}
こういうの作りました。
普通にフォームに貼る分にはいいのですが、GridView の ItemTemplate のところに配置し
GridView.RowCreated あたりで TextEx を設定したとき
PostBack すると TextEx が消えてしまいます。
ViewState に保存してるつもりなのですが、
GridView の ItemTemplate でも大丈夫にするには特殊なことが必要なのでしょうか。 これを実行してボタンクリックすると処理が返って来ず固まります。
ちゃんと動かすにはどうしたらいいでしょう?
async System.Threading.Tasks.Task<string> Get(){
return await webView2.CoreWebView2.ExecuteScriptAsync("test");
}
private void Button_Click(object sender,EventArgs e) {
var task = this.Get();
System.Diagnostics.Debug.WriteLine(task.Result);
} var result = await this.Get();
System.Diagnostics.Debug.WriteLine(result); >>863
Get()からのstringの戻り値を受け取るにはどうすればいいんでしょうか? >>847
可読性が良くなるように論理的に文章が書ける力と、
読み手が理解しやすくするように、伝え方を工夫する力とは全然違う
MSリファレンスは後者がさっぱりだから
図やイラストがない無味乾燥だと上の人が言ってるんじゃないの?
>>837
> 教師の教え方についても、特定の人に分かりやすい教え方が万人に対してそうとも限らない。
教師はそうならないように万人にわかりやすくなるよう教え方を工夫するのが仕事(俗に言う教材研究)
まぁ大学の役割がそうじゃないだろと言われてしまえばそれまでだし
誰にでも簡単だったら技術者や専門職として飯食いにくくなるから
世の中の仕組みとしてはそれでいいんだろうけど >>864
>>863の1行目
resultにはstring型の戻り値が格納されてる >>864
Get()でasync, await 使ってExecuteScriptAsync()の戻り値を取得してるじゃないか。
それと同じ。 >>865
良いか悪いかは別として
それは可読性をどういう範囲で捉えるかの違いだな
読み手が理解しやすくするように伝え方を工夫することが
可読性を良くしようとすることに含まれないと考えたことはなかったわ >>866-867
Debug.WriteLine()で表示しても以下のようになるんですが…
System.Threading.Tasks.Task`1[System.String]
取得した中身を表示できないんでしょうか? private async void Button_Click(object sender,EventArgs e) {
var result = await webView2.CoreWebView2.ExecuteScriptAsync("test");
System.Diagnostics.Debug.WriteLine(result);
}
ポイントは1行目にasync >>870-871
そこに書けば表示できるんですね。
出来れば分けて書きたかったのですがこれでいきます。
async、await、の使い方がよくわかってないので
ちゃんと勉強します。ありがとうございました。 >>871
これ戻り値決まってるメソッドの場合、どうすればいいでしょうかね。 戻り値が決まっているメソッドとは?
具体的なコードを出してくれないと分からん こんなカンジかな?
public string SayYes(string question){
return "Yes";
} >>874
戻り値が決まってるメッソドを渡す必要がある場合に
async、awaitを使いたい時です。普通にスレッド使った方がいいでしょうか。 >>876
・戻り値が決まってるメッソド
・渡す必要がある場合
・普通にスレッドを使う
どの意味もおぢさんさっぱり分からん 意味わからんがとりあえずasync await を使わないコードを書いてくれ
まずはそこから >>876
やりたいことが良く分からないけれど
Task.Run()を使えば良いんじゃないかな。
var result = await Task.Run( () => SayYes( "hoge" ) ); >>878
上手く言えてなくてすみません。
既に定義された形のメソッドを渡す必要があって
戻り値の型を変えられないんです。変えられるかもしれないけど他人が書いた部分なので弄りたくない感じです。
その場合は無理でしょうか? >>875
こういう形のメソッドの中で使いたいとしても
asyncをつけると戻り値がvoidやtask等しか使えなくなるので
無理なんでしょうかという質問です。 >>882
>>610 と同じ内容かな
ここら辺見返せばいいと思うよ asyncawait が前準備無しにドキュメントも無しに実装されているときは無意味な上に99.89%バグっているので安心してほしい >>881
定義済みメソッドを非同期実行するなら>>880の方法でいいかと
此方もそんな感じでやってる >>883
これの一番最初にあるサンプルコードをコピペして
Form1_Load()から呼び出すと止まるのですが
これは当然の結果なのでしょうか?
void Form1_Load(object sender, EventArgs e)
{
var radius = 1.0;
var area = CalculateCircleAreaAsync(radius).Result;
}
static async Task<double> CalculateCircleAreaAsync(double radius)
{
var π = await Task.Run(() =>
{
Thread.Sleep(3000);
return Math.PI; // 級数展開などで円周率を計算したとする
});
return π * Math.Pow(radius, 2); // 円の面積
} >>887
はい、当然の結果です。
メインスレッドがデッドロックします。 >>891
前のと同じ問題
Form1_Load()をasyncに変更してCalculateCircleAreaAsync()をawaitで待つ
Task.Resultは直接触ったら駄目 まずは落ち着いて自分に宛てられたレスをきちんと理解するところから始めたら?
いくつかの質問にはすでに答えが付いてるよ。 >>892
たしかにForm_Load()にasync付けたらいけました。ありがとうございます。
>>893
申し訳ない。ちゃんと読み取れてなかったようでした。 これってメソッドの戻り値の型を自分で指定したい場合は
Task<T>でラップしないといけないって解釈でいいですかね? webView2.CoreWebView2.ExecuteScriptAsync()
がTask<T>を受け取らないといけないせいで
既に戻り値を定義された色々なメソッドにも影響が出てしまって
どうにかそれらを全て書き換えるかしないといけないのが困ってる点ですね。
これどうにかならないんですかね? しかもこれ自作クラスを戻り値にしてるメソッドだと
GetAwaiter()がないとかって怒られてそれも実装しないといけないみたいで凄い面倒で困る… もう非同期とかいいので普通にこれでデータ取得できないもんなんですかね。
webView2.CoreWebView2.ExecuteScriptAsync()
非同期とかしなくていいんですよ。必要なら1分くらい待ってもいいので。
たったこれだけのことなのに凄い面倒だ。 まず落ち着いて自分に宛てられたレスを最初から読み直してみるといいんじゃないかな。 task.ConfigureAwait(false).GetAwaiter().GetResult() 素直にasync/await対応したほうが建設的
悩んでいる時間で修正終わるわ このレベルだとこんな所で教えてもどうせ理解出来ない 今時めずらしいタイプだ
こういうのから金を巻き上げてその辺に棄てるのがスクールの役目のはず >>901
面倒だけどそうすることにしました。
ひとつずつ地道に置き換えていきます。 使用者に非同期処理が必要ないのに非同期処理しか実装されてないクソライブラリはクソだからないのでクソとしか表現のしようがないんだぜ
そこはおk?
ああ、クソじゃん・・・
って話よ? 散々罵った挙げ句に同期処理が用意されてることがわかったときは死にたくなるぐらい恥ずかしいので気をつけるんだぜ >>908
理解せず簡単に済ますなら900の方法か、
UIスレッドから新しいTaskを作って、そのタスク内で非同期メソッドの結果をawaitして、UIスレッドは作ったTaskのResultを取得すれば良い。 >>909
900さんの方法でもイケるんですね。ありがとうございます。
あとこんな風にやったら一応自分が求めてる感じにもなりました。
Invoke((MethodInvoker)(async () => {
var task = await func();
})); >>887
これ、今更だけど
var radius = 1.0;
Task<double> task = null;
Task.Run(() => task = CalculateCircleAreaAsync(radius)).Wait();
var area = task.Result;
じゃいかんのかな知らんけど。
しかし、非同期メソッドの結果をawaitせずに求めるなんて考えたこともなかったし、
一瞬そんなの簡単だろと思ったけど意外と面倒なのね。
というか非同期メソッドの戻り値は呼び出し元のスレッドで実行される自分自身になるのな。
っていうか、>>891の引用元のコードはバグ?
何年も前の記事なのに誰も突っ込んでないのかな 独習C#でもコンソールアプリ以外だとデッドロックするコードが書いてあるからな。 コンソールかどうか関係ある?
コンソールだろうが何だろうが、「自分が宿題をやり終わるのを寝ながら待つ」子は
死ぬまで宿題完成しないでしょ。 >>914
あるよ
SynchronizationContext.Currentが設定されていないから挙動が変わる なんでタスクで実行すればデッドロックが発生しないか理解してなさそう
こことか分かりやすく書いてくれてるから見てくるといい
ttps://chronoir.net/cs-async-await-taskrun/ >>915
へーなるほどそうなのか。
非同期メソッドをawaitせずに呼び出した時の挙動なんて
よく考えたことがなかったし知らんかったよ。 そもそもTask型が帰ってくるのだから非同期前提だしなぁ
言わばスレッドで実行出来る形にしましたよという事なんだし
非同期だとスレッドセーフかどうかも本来なら問題になる事ではあるけど stackallocが使われてる関数ってAggressiveInlining属性付けてもインライン展開されないの? System.Web.Helpers.Json.Decode()これと同じ機能を持つのって他にないでしょうか?
使ってるとMaxJsonLength の値を超えています。とエラーがでる時があって。 >>920
MaxJsonLengthは設定で拡張可能 C#でSocketIOサーバーを作りたいと思ったのですが、SocketIOのライブラリに思いっきりclientと書いてあるのでサーバーにはなれないんですかね? 表形式を扱うデータ構造といえばList<T>の入れ子、構造体、DataTableクラスとありますが
速度的に一番有利なのはどれでしょうか? 2つのテーブルから共通のコード番号を手掛かりに新しいテーブルを作る処理です
2次元配列が一番速いのですか
最初に件数をカウントしておく必要がありますね >>929
それって2つのテーブルをAとBとしたときBのテーブルはAの1レコードに対して全レコードアクセスは回避できないよね?
どう持っても早くはならないでFAじゃね? >>929
SQLのJoinアルゴリズムと考え方は同じなのでそういうの解説してるサイトをググればいいんじゃない
基本はSort Merge Join, Nested Loop Join, Hash Joinの3種類 >>925
使ってないからリポジトリ眺めただけだけど、Socket.IOのサーバと接続するのに
手順を簡略化できるだけで、サーバは普通にWebサーバにjavascriptとかで
作れみたいだよ
https://github.com/doghappy/socket.io-client-csharp float[] array_A = new float[] { 0.2, 0.4, 0.6 };
float[] array_B = new float[] { 0.4, 0.6, 0.8 };
List<float[]> hoge = new List<float[]> { array_A, array_B };
floatの配列を要素に持つリストhogeがあったとして、配列の対応する要素の平均を算出してリストを返すスマートな方法ってありますか?
LINQでうまいことやれそうな気がしたものの、やり方が分からず今はfor文でゴリ押してしまっています
最終的にこういうリストが返ってきて欲しいです
{ 0.3, 0.5, 0.7 }; >>933
普通にforでやりゃいいじゃん
それ以上は初心者じゃねぇだろ
相談室でも行け 最近C#の勉強を始めて、オブジェクト指向に関して何となく分かったけどプログラムに落とし込むまでは理解出来ていません
手を動かさなきゃ身につかないと思うのですが練習になる例題などあったら教えて頂きたいです 作りたいものがないのにプログラミング言語の学習を始めるってつらくない?
あと大きく分けてコンソールアプリ、Windowsとかのアプリ、Webアプリ(サイト)とかあるけど、
(多分コンソールが一番勉強するには素直に始められそうだけど)
どれがやりたいとかないの?
VS使えるならそれぞれプロジェクト作れば大体helloworldくらいまでは勝手に作ってくれるよ >>937
Unityとかだとオブジェクト指向を楽しく学べそう。 >>937
Microsoft VOTT を超えるアノテーションツール
を作ってみては?
マジレスするとpinta辺りのソースを読んで見たまえ >>937
ライブラリのクラスで比較的単純そうなのを
あえて車輪の再発明してみるとか。
例えばList<T>の簡易版を自分で作ってみる。
ただ、オブジェクト指向を習得したいという目標設定自体が
本当に意味があるかどうかは疑った方がいいかもしれないね。
以下個人の見解ですだけど、オブジェクト指向なんて別に
そんな難しい話じゃない。
机上で本読んでる時にはもやもやしてても
コード書いてる間に自然に府に落ちてくる類のものかもしれないよ。
少なくとも俺はそうだった。 ソースファイル数十くらいの規模からじゃないとオブジェクト指向は必要にならないから
初心者は暫くstaticマンとして修業するしかない えっ
メインだけならいらんけど
そうじゃないならオブジェクト指向したほうがいい オブジェクト指向もカプセル化の恩恵は結構簡単に実感できるが
多態性のほうは有効な場面が可也少ない オブジェクト指向の恩恵のほとんどはinterfaceだからなぁ。
自分で作ったのを他の人が使うようになって始めて、迂闊にクラスを参照させてはならない、
カプセル化していたとしても実装変えにくくなって詰みやすいと気づくわけで。
自分で作って自分だけで使ってる分には気づきにくい。 何がオブジェクト指向の本質かについてはいろんな人がいろんなこと言ってる
(要するに定説がない)けど、個人的には多態はあくまで付随的な物であって本質じゃないと思う。
オブジェクト指向というかOOPの本質は文字通りオブジェクトという仮想機械をクラスという形で
ストレートにコードに表現できることだと思う。
それが正しいかどうかはともかく、初心者が最初に理解すべき考え方はこれ、
つまりクラスとは仮想機械を記述するものだということだと思う。 本来そんな小難しい話じゃなくて、プログラムを人間のメンタルモデルに合わせようというのがオブジェクト指向だよ
人間の感覚に合った設計は破綻しにくいという経験則というか仮説に基づいている 人間のメンタルモデルってか進化論モデルだよ
経験則どころか30億年以上の運用実績があるから信頼性が高い 進化の過程においてミッシングリンクというものが存在しててな。
30億年かどうかは怪しい オブジェクト指向とか正直よくわからんが
クラスは、ラムダの変数キャプチャを冗長化、明示化、理解容易化したもの、として考えるようになってから、すべてがうまく噛み合うようになった メンタルモデル(笑)とか進化論モデル(笑)とか言い出すと
昔のJava界隈みたいな胡散臭さが出てくるなw まあ特定の機能を担う仮想的な装置(オブジェクト)に分割統治するのは
人間の脳というか認知能力の都合だというのはその通りだけどね。
繰り返しになるけど、重要なのはその「特定の機能を担う仮想的な装置」を
クラスで表現できることになったことなんだよね。
アルゴルズムの教科書に出てくるようなデータ構造はオブジェクト指向が提唱される前からあった。
画期的だったのは、それらをQueueとかDictionaryとか言ったまんまの名前を付けたクラスで書けるようになったこと。 昔あったJavaの月刊誌はやたら哲学用語を多用する記事とかあったな 世の中では「部品化」と言う、もう少し判りやすい言い方を使っているんじゃないかな double[] real; double[] imag;でもってる値をComplex[] compへの変換を1行できれいに書けないでしょうか?
comp[0] = new Complex(real[0], imag[0])を配列に対して操作できればかけそうな気がするのですが、LINQとかで表現できますか? >>957
var comp = real.Zip( imag, ( r, i ) => new Complex( r, i ) ).ToArray(); >>958
ありがとうございます。
Linqにzipなんてものがあったんですね。 ひょっとしなくても>>933のも
var hoge = array_A.Zip(array_B, (a, b) => new float[]{ a, b }).ToList()
でいけたのか
でもこれだったらちょっと冗長でも
var hoge = Enumerable.Zip(array_A, array_B, (a, b) => new float[]{ a, b }).ToList()
って書きたいなあ あ間違えた
var hoge = Enumerable.Zip(array_A, array_B, (a, b) => (a + b) / 2).ToList()
か class OrderにはItemCodeとQuantityがあり、
List<Order> order1とorder2をまとめたいです
具体的にはItemCodeが同じならばQuantityを合計し、なければ新たに追加する、といった具合です
foreachを使えばできますが、Linqを使用して簡潔に書ける方法があれば教えてください ConcatしてitemCodeでGroupByしてSum >>965
ありがとうございます
今出先なのでまた帰ったら試してみます >>965
order1.Concat(order2).GroupBy(o => o.ItemCode).Select(x => new Order() {ItemCode = x.Key, Quantity = x.Sum(y => y.Quantity) });
こんな感じですか? >>967
こういうの現場でたまに見かけるけど、とても完結だとは思えない。
加算メソッドをOrderクラスに実装するべきだと思う。 え、簡潔と完結を書き間違えたんでしょ?
違うのかな… >>967
こんなの書いてはいけませんっていういい見本 >>967
こんなの現場で書くとどう扱われるか教えてやろうか?
○○さんの書くプログラムはわかりやすいけど
君のはわかりにくいね
読みにくいっていうか
これはどういう処理をしてるの?
仕様を書いてほしいんだけど
文章で書けなかったら
普通の.net2.0ぐらいの機能で書いてくれないかな?
それと○○さんと比べて進捗も遅いよね?
こんな書き方してるからじゃない?
あと処理経過がわかるログも出してほしいんだけど
この書き方のままじゃ出せないでしょ?
とかね
目立つことしないほうがいいよ 長いメソッドの途中でいきなりこれが出てきたら気持ち悪いけど
OrganizeOrdersとか名前つけてメソッドに切り出すなら許せるかな
正しいメソッド名は英語ネイティブに聞いて >あと処理経過がわかるログも出してほしいんだけど
これは流石に設計書いた奴が無能すぎるわ >>972
それほぼ全部カウンター食らうから気をつけたほうがいい
わかりにくい→感覚でしゃべるな、コードメトリクス測定したらLinqのほうが成績良い
どういう処理をしてるの→見たまんまorder1とorder2を繋いでItemCodeでグループ化してQuantityの合計を計算しtwる
使用を書いてほしい→↑が仕様
普通の.net2.0で書く→古い言語仕様に合わせる理由がない
進捗→状況次第 ログ出して→この程度の処理でいちいちログ出したらログが汚れるしパフォーマンスも悪化する >>967
これってそんなに読みにくい?
自分も他の人もこのくらいなら普通に書くけど。
どうしてもなら、各メソッドの間に改行入れて各行ごとに処理内容のコメントを書いてもいいし。
こう言うのでログを出して欲しいって要望を受けたことはないけど自分でそれ用の拡張メソッドを書けば出せないこともないし。とか言ってみる。 >>975
いいよ別に
後はリアルで味わったらいいよ
みんな暖かく接してくれるよ >>967です
たくさんのレスがついていてビックリしています
書いていて思ったのは>>977さんがいうように各メソッドの間に改行を入れればまだ読みやすいと思ったのと、
Orderのプロパティが多いようだとどんどん読みづらくなっていくな、と思いました
foreachで書いたのはこんな感じですが、よりいい方法があれば知りたいです
var allItem = new List<Order>(order1);
foreach (var o in order2)
{
var duplicate = allItem.FirstOrDefault(x => x.ItemCode == o.ItemCode);
if (duplicate is null)
allItem.Add(o);
else
duplicate.Quantity += o.Quantity;
} >>979
最初にvar allItem = new List<Order>(order1);をしていますが、
duplicate.Quantity += o.Quantity;をするとorder1の内容も更新されてしまいますね
DeepCopyなどで複製するべきでした >>971
質問者も簡潔と完結を間違えてるんじゃね?ってダブルの冗談さ C# Seleniumでブラウザを閉じるときに
Quit();
Close();
の動作が最近のChromeのアップデートでかなり遅くなっています。
私だけでしょうか? >>967のコードは、ドットで改行したらいいぐらいでなんも悪くないだろう ちゃんとしたテストコード書いてあるなら967のでかまわん ログもちゃんと出力してね
指摘する人間に粒度が依存するけど
少なくとも俺はこんな一括でやられたらどこがバグってるのかわからない まあ、もっとも指摘する人間の粒度に依存する部分に対応できない処理を書いちゃうあたり優秀とは程遠いというのが俺の感想だがね この程度のコードが理解出来ないで文句垂れてるとか恥ずかしくないのかな
足を引っ張りあって低い方に合わせて仲良くってのが日本のITで
生産性の低さに表れてるのだろうな これが読みにくかったら、簡単なSQL文すら書けない&読めない現場
20年前の現場ではSQLでとってきたレコードをループしながら集計しているコードがゴロゴロあった C#3.0リリース直後でLINQがまだ物珍しかった頃なら>>972の指摘もまあ分かるけど
C#の最新バージョンなんてもう9.0だぜ?
LINQだって10年くらい前の時点で十分スタンダードになってた技術なのに
いまだに真顔で>>972みたいな指摘する人がいるのか・・・・
>>985
>少なくとも俺はこんな一括でやられたらどこがバグってるのかわからない
え、この程度で分からないの?
「優秀とは程遠い」理解力しか持ち合わせてないのはあなたのほうじゃ
あなたの口ぶりベテランの人なのかと思ってたんだけどただの能力低いロートルだったりする? うちにもLINQ読めないからやめろ!って言うおっさんがいたな
最初年長者の言うことだからと素直に聞いていたけど
だんだん腹立ってきてボロカスに言ったら何も言わなくなった 君のプログラムは
たったこれだけ、
ホントこれっぽちの、
普通のプログラマなら本当に誰でも可能な、
ことすらできないゴミカスなので
対応できませーん!(笑)(´∀`*)ウフフ >>989
>>972の指摘は技術的な無知から真顔でやってるんじゃないよ。
和を乱すなら撤退しろ、ってメッセージなんだから、技術論で正しいって言っても無駄なんよ。
これが正しいってコンセンサスを先に取れば誰も何も言わない。
実際に工数が下がることを証明して、パフォーマンスが落ちていないことを証明して、コーディングルールにLinqの使い方を明示して、やってはいけない使い方なんかも書いて、それで通すもの。
俺は使いたかったからそうして通したから間違いない。
引っ張り合いではなくて、皆のレベルを上げる必要があるの。
一人が踊り狂っても、そいつが辞めたときに誰も面倒が見れない物が残るだけ。
おっさんになってからつくづく思うけど、お前らほんと自己中だな。 >>993
え?なんか長いけど延々と誰でもできることを自分ができない正当性を長文使って説明してるの?( ´,_ゝ`)プッ
控えめに言って
クソダッセw と思ったら内容違うじゃん
はじめの一文で立場を明確にしろよ >>991
途中経過をログ出力したければ普通にできるけど・・・ >>994
ちゃんと読まないとかそういうところもだぞ。 このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 95日 23時間 25分 5秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。