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

■ このスレッドは過去ログ倉庫に格納されています
2021/05/16(日) 10:45:59.00ID:8qTwOc620
!extend:checked:vvvvv:1000:512
次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為)

「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください
>>980を踏んだ人は新スレを建てて下さい。>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

■前スレ
ふらっと C#,C♯,C#(初心者用) Part150
https://mevius.5ch.net/test/read.cgi/tech/1616471904/
■関連スレ
C#, C♯, C#相談室 Part94
https://mevius.5ch.net/test/read.cgi/tech/1553075856/
■コードを貼る場合は↓を使いましょう。
https://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
https://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
2021/07/14(水) 02:33:39.69ID:cEzLlJ010
>>604
そうそれ。c++選択肢多いから、俺みたいに細かい人が最初やるには向いてない
文字列の話だって.netならutf -16の標準stringを取りあえず使っておけばいいけど
c++だとどのエンコード使おっかなとか下らない事で悩んで先に進まなくなる
2021/07/14(水) 02:41:48.38ID:veS53koK0
自分の場合、Windows の GUI アプリ作りたくて C++ 始めたけど、プログラム知識ほぼ 0 の時に、C + API と、C++ + MFC のGUI アプリのサンプルソース読んで一回諦めた。
C# 始めてから C++ 始めたことで救われた。

細かい所を確認しながら進めないと気が済まない + 目標までのハードルがめっちゃ高いと感じると心が折れる。
こんな人は、C++ の前に C# やるべき。
2021/07/14(水) 07:06:12.20ID:QQQ6x1zU0
C++にあっさり挫折した過去があるワイでも、C#だとそこそこに使えて助かってるわ
2021/07/14(水) 07:56:34.76ID:yzrBZN8qD
そりゃレイヤーが全然違うしね
2021/07/14(水) 09:48:23.28ID:gix7WKJqM
>>606
俺もそうだわ
C++はWINAPIだの仮想デストラクタだのと意味不明なお約束があまりにも多すぎて習得できる気がしなかった
C#の後だと重要なところと後回しでいいところの区別がついてすんなり入れたな
2021/07/14(水) 12:52:36.76ID:89AG2aEZ0
Formにポトペタで作れるしね。
2021/07/14(水) 14:05:49.07ID:XRr9+sqQ0
自分はWTLでGUIアプリ組んでたな
C#は食わず嫌いだったけど今はC#だけだな
2021/07/14(水) 17:04:04.00ID:gWKZTcc80
BorlandのC++builderでは作れたけどMFCアプリは作れなかったな
C++じゃなくMFCに問題があるんじゃなかろうか?
2021/07/14(水) 17:09:46.93ID:9x2VN1AY0
var test1 = メソッド1();
var test2 = メソッド2(test1)
var test3 = メソッド3(test2)

こんなふうに数珠繋ぎみたいに結果を渡していくやり方は作り方を見直したほうが良い?
メソッドの引数は値のコピーを渡してるから呼び出し元には影響ないのは分かるけど、どこでどの値を変えてるか分かりにくくなってバグを生み出しやすい作りな気もしてる
初歩的な質問で申し訳ないけどアドバイスいただきたい
2021/07/14(水) 17:28:30.06ID:+eseIR4Q0
test1とかtest2に使い道がないならば

var test3=method3(method2(method1()))

でもええって話ではあるけど
要は間の処理がどうなっているかによりけりだと思う
2021/07/14(水) 17:34:07.92ID:gix7WKJqM
>>613
うん、良くないね
君も気付いてる通り、引数のコンテキストがどんどん肥大化してどこで何やってんのか分からなくなる典型的なアンチパターンだ
ほんとにそのテスト2〜3は引数に渡されたオブジェクト全体を使ってるの?
やりたいことは、
var c = new C { A = test2(test1.X), B = test3(test1.Y) };
だったりしない?
2021/07/14(水) 17:50:29.76ID:QC3eIOjva
>>613
いいと思うよ
例えばだけどこういうことだろ?

基本価格 = 基本価格取得();
割引価格 = サマーキャンペーン割引(基本価格);
税込価格 = 消費税加算(割引価格);

とてもクリーンで見やすいコードじゃないか

ただタイピングが楽になるからメソッドチェーンにしたい欲求はある

基本価格取得()
 .サマーキャンペーン割引()
 .消費税加算();
2021/07/14(水) 18:16:23.00ID:gix7WKJqM
>>616
どこでどの値を変えてるか分かりにくくなりそうって言ってるから、単純なスカラー値ではないんじゃないの
var 注文 = 注文を取得();
var キャンペーン適用済み注文 = キャンペーン適用(注文);
var 送料計算済み注文 = 送料計算(キャンペーン適用済み注文);
みたいな感じと想像した
2021/07/14(水) 18:19:46.23ID:9x2VN1AY0
>>614 >>615
やっぱり良くないか…
引数に渡してるものは部分的にしか使ってない
例えば100個くらいの配列を渡してこの中の10個くらいしか使ってない

>>616
これはこの内容で良さそう
やる事が一貫してるというか意味が通じてるというか

最初に挙げた例と違って申し訳ないんだけど、実際にやりたいのはこんな感じ
数珠繋ぎとは少し違う、ごめん

@全装置データ = 装置A〜Zデータ取得()
A正常or異常 = 装置AデータDB書き込み(全装置データ)
B正常or異常 = 装置BデータDB書き込み(全装置データ)
.
.
.
C正常or異常 = 装置ZデータDB書き込み(全装置データ)
D正常or異常 = 装置へデータ書き込み(全装置データ)

メソッドに渡すのはコピーとはいえ、@で取得したデータを色んな所へ渡して使い回してて、どこかで値が変わってしまう可能性も含んでる作り方なのかなと思って>>613の質問に至ったの
2021/07/14(水) 18:32:18.26ID:aEJsAOR7a
>>618
結局何が聞きたいのかどうもよく分からないな。

>>613みたいに一時的な説明変数に戻り値を入れるのは
一般論としては何も悪くない。

引数で渡した参照型の値が破壊されるのを心配するなら(そんなのほとんどの場合杞憂だと思うけど)
適当なインターフェイスをかぶせてそのインターフェイスとして渡すか、
イミュータブルにするだけじゃないの?
2021/07/14(水) 18:50:03.34ID:gix7WKJqM
>>618
装置AデータDB書き込みは全装置データのうち装置Aのデータしか見ないってことか?
だったらそりゃ装置Aのデータだけを引数に渡したほうがいいわな
2021/07/14(水) 19:02:26.74ID:QC3eIOjva
>>617
その場合はその業務は誰の知識なのか?に注目する

メソッドの引数と返り値をスカラーにした場合、そのメソッドの「呼び出し側」が
1 引数のエンティティから適切な属性を取得し、2 メソッドを呼び出し、
3 引数そのものあるいはクローンに対して適切な属性を更新する
方法を「知らなければならない」

例えばサマーキャンペーン割引のロジックが「注文の合計基本価格が10000円以上、注文明細のどれか1つでもキャンペーン対象商品フラグが立っていること」だったらどうだろうか?

メソッドの呼び出し側はきっとこう思う筈だ
俺は注文をサマーキャンペーン割引して欲しいだけなのに、
なぜかサマーキャンペーン割引に合計基本価格と注文明細のキャンペーン対象商品フラグが必要だという業務知識を知らなければならない
ただ黙って割引してほしいだけなのに、なんで俺が適切な情報をいちいち与えてやらなければならんのだ
そんなのはサマーキャンペーン割引の責務を担うメソッドが知っているべきだろう
2021/07/14(水) 19:11:44.77ID:QC3eIOjva
>>618
この場合もまずは責務を明確にしてメソッドを分けるといいよ

1. オンメモリのデータセットから特定のデータを正確に抽出する責務を担ったメソッド
2. 単にデータをDBに書き込む責務を担ったメソッド

つまりこういうこと↓

a = Aデータ抽出(全データ)
b = Bデータ抽出(全データ)

z = Zデータ抽出(全データ)

結果A = リポジトリA.save(a)
結果B = リポジトリB.save(b)

結果Z = リポジトリZ.save(z)
結果All = リポジトリAll.save(全データ)
2021/07/14(水) 23:06:55.57ID:idSc395A0
>>618
>A正常or異常 = 装置AデータDB書き込み(全装置データ)

これって異常ならどうするの?
2021/07/14(水) 23:09:43.35ID:ikn1S79j0
>>618
メソッドの引数として渡したパラメータを書き換えないというのが基本
コピーして渡さないといけないメソッドとして作られてしまってるのが問題で、更新日時とか何かしらの書き換えがあるならその結果を別途返すべき

メソッドのパラメータとして全データを渡すよりそのメソッドが使う必要最低限のものにしといた方がわかりやすい
まあ、条件にマッチしないデータは無視するという動作でも不自然じゃないからそんなに重要なことじゃないかな
2021/07/15(木) 18:33:23.51ID:YvGaZ0G0M
レスくれた人ありがとう
貰ったアドバイスを自分なりにもうちょい整理してみる

>>622
細かくなるけど必要なもの毎に処理を分けるってことだよね
自分みたいな素人目線だとこういうのは小さい処理が増えるのが煩雑に感じてやるのは躊躇するけど一個一個が独立してるしこの方が結果的に良さそう
2021/07/15(木) 18:53:56.43ID:p7EIkR62a
1つのメソッド(動作)に複数の動作をやらせない
2021/07/16(金) 05:44:43.56ID:kw030b9nd
>>626
そういうの好きだな。だから、結果的に>>613になっても俺的にはおk。
メソッド名を見れば判るようになるし。
628デフォルトの名無しさん (ブーイモ MMde-uKKI)
垢版 |
2021/07/16(金) 10:50:53.05ID:5OijHeJ1M
AWS LambdaをC#で使ってる人おる?
DIの正しいやり方がわからん
ググると
FunctionクラスのデフォルトコンストラクタでServiceCollectionをインスタンス化して
Serviceを追加して解決してprivateフィールドに代入
的なコードは出てくるんだけど
なんか無理矢理感があってすごく気持ち悪い
ASP.NET CoreのControllerみたいにコンストラクタインジェクションしてくれればいいんだけどAWS LambdaのFunctionはそういうのないのかな
2021/07/16(金) 12:25:27.67ID:Oq98um8EM
謎のランタイムが勝手にどっかで注入してくる方が気持ち悪いわ
Azure FunctionsなんかだとAzure側のランタイムがASP.NETと統合されてて注入できたりするけど、依存関係地獄になりがちでぶっちゃけ糞
Lambdaはその点余計なこと一切しないから単純明快で楽だ
そもそもLambdaごときにいちいちDIなんか要らんわ
FaaS使うんだったら差し替えはFunctionレベルでやるのが基本だよ
2021/07/16(金) 12:44:52.48ID:Oq98um8EM
WindowsってPowerShell以前はコマンドラインシェルが貧弱だったから、開発者は伝統的に何でもかんでもアプリケーションコードの箱庭内でやってしまう傾向があって、
Azure Functionsの設計思想なんかもそういう箱庭コーディングの文化を引き継いでいるところがある
対してAWSは小物をシェルで組み合わせて使うUNIX的な文化の色が強くて、Lambda関数もコーディング環境というよりはあくまで「ちゃんと単独で機能する小さなコマンド」なの
その中でさらにドメイン切って差し替えられるようにして、みたいな発想はしないんだよ
631628 (ブーイモ MMde-uKKI)
垢版 |
2021/07/16(金) 13:41:32.46ID:YjA+/kj2M
すまん自己解決したわ
AWSオフィシャルのLambda/ASP.NET Coreアダプタがあるらしい
まあそらそうだよなDIもまともに出来ないとかゴミサービスでしか使えんし
2021/07/17(土) 01:55:18.52ID:YUa2zwOi0
最終的に保守のしやすいコードが一番ってことになりそうだ
2021/07/17(土) 04:37:12.67ID:SWDN49PP0
どうでもいいけど、状況判定に
if(HogeButton.Text == "あ" && !int.TryParse(HageButton.Text,out _))
みたいにコントロールのテキスト使いまくってるクラス見つけてしまった。

明日から犯人探しかな・・・
634デフォルトの名無しさん (ブーイモ MMde-nkhS)
垢版 |
2021/07/17(土) 05:05:25.92ID:rQBsLn9RM
どうでもいいけど、状況判定に
if(HogeButton.Text == "ほ" && !int.TryParse(HageButton.Text,out _))
みたいにコントロールのテキスト使いまくってるクラス見つけてしまった。

明日から犯人探しかな・・・
2021/07/17(土) 09:29:37.87ID:hzHLbOfFa
数学の積分で使うSの大きなやつって
for文なの?
2021/07/17(土) 09:47:49.19ID:FY+xgTJtM
そう妄想するのは自由
2021/07/17(土) 10:05:47.56ID:wcPyadci0
数値積分でググるといいんでないかな
2021/07/17(土) 12:05:36.74ID:ED/D6NvId
時間の流れが乱れている…
639デフォルトの名無しさん (エムゾネ FFfa-E0YB)
垢版 |
2021/07/17(土) 15:01:08.33ID:eTC1af8gF
Σはforだが(といってもΣの方が遥かに高速な訳だが)
∫はforではない
2021/07/17(土) 15:50:53.78ID:IsTBXftL0
Πは?
2021/07/17(土) 15:59:07.68ID:oVxa7DA2a
>>639
Σも普通は解析的に答えを出すので、数値演算(ループ)を連想するのはかなり違うと思う
642デフォルトの名無しさん (エムゾネ FFfa-E0YB)
垢版 |
2021/07/17(土) 16:04:35.47ID:eTC1af8gF
forの解釈として毎回実行時計算する言語ならそうだが
forでもコンパイル時にΣやΠが解析的に完了してる言語があっても良いだろう
C#スレだからどうでも良いけど
2021/07/17(土) 17:20:34.66ID:6qmea//qa
解析的に求めるっていうのは例えば等差数列の式から
その和の公式を導出するようなことを言うんですよ。
2021/07/17(土) 18:21:36.91ID:tq+22Yf30
プログラマと数学屋で
用語の齟齬が起きているな
2021/07/17(土) 18:51:59.16ID:6qmea//qa
いやいや、解析的っていうのは数値計算の対義語みたいなもので「数学的に解く」
みたいなニュアンスだと思うから数学屋さんはあまり使わないと思うよ知らんけど。

情報屋の言い回しだと思うよ。
俺は大学のアルゴリズムの講義でニュートン法とかやった時に聞いたのが最初の気がする
先生はもちろん情報工学の先生だ
2021/07/17(土) 18:59:49.36ID:RupVd7jf0
>>639
高速って何よ
数学記号のΣとプログラムの制御構文のforで、概念が違うものをどう比較したのさ
2021/07/17(土) 19:16:24.85ID:NOfppBHx0
ロックマンで見た
2021/07/17(土) 19:24:46.25ID:iVAlWQfZM
https://ja.wikipedia.org/wiki/%E8%A7%A3%E6%9E%90%E5%AD%A6
2021/07/17(土) 19:29:45.80ID:ALTiYW8P0
シグマゼロビーム
650デフォルトの名無しさん (ワッチョイ b101-E0YB)
垢版 |
2021/07/18(日) 13:09:02.92ID:RVrShVdw0
ビジネスが破綻する大半の原因は、 ”ビジネスを始める人の大半が、真の意味での
「起業家」ではなく、 起業したい、という熱に浮かれた「職人」として働いているに過ぎない。”
という事実にあります。
「職人」によって運営されているビジネスは、ビジネスが働くのではなく、彼ら自身が毎日働くこと
によって、成り立っています。
彼らは毎日、自分がやり方を知っている仕事を一生懸命にこなしていますが、「起業家」としての
視点が無いために、成長に限界が生まれます。
そして、生計を立てるために、彼ら自身がずっと働き続けないとならないのです。

誰もが必ず陥る罠
私が見ている限り、起業熱にうなされる人たちは、必ずと言ってもよいほど誤った
「仮定」を置いてしまうようだ。実は、のちに彼らが苦難の道を歩むことになるのは、
この、「仮定」が致命的に間違っているからなのである
致命的な仮定とは・・・「事業の中心となる専門的な能力があれば、事業を経営する能力は
十分に備わっている」ということである
私がこの仮定を致命的だと書いたのは、この仮定が間違っているからにほかならない
事業の中で専門的な仕事をこなすことと、その能力を生かして事業を経営することは
全く別の問題である。高い専門能力を持つ人にとって、独立は他人の為に働くという苦痛から
解放されるということを意味していた。それにもかかわらず、前提となる「仮定」が致命的とも
いえるほど間違えているために、彼らは自由になるどころか、自分が始めた事業に苦しめ
られるようになってしまうのである
マイケルEガーバー「はじめの一歩を踏み出そう」P28~29
2021/07/18(日) 19:33:43.97ID:j2ludHuAd
>>452
>>453
ありがとうございます
亀でスミマセン…
2021/07/18(日) 19:34:39.70ID:j2ludHuAd
>>454
ありがとうございます
2021/07/18(日) 19:35:09.34ID:G9pOURuid
>>455
ありがとうございます
654デフォルトの名無しさん (ワッチョイ 0154-x4cL)
垢版 |
2021/07/20(火) 06:41:50.36ID:oT6fq8l/0
SqlServerへの非同期クエリを、ORマッパー使わずにSqlConnectionとSqlCommandで送信したい場合、
Task.Run(() => sqlCommand.ExecuteReader())
と、
sqlCommand.ExecuteReaderAsync()
のどっちを使うのが理想ですか?
655デフォルトの名無しさん (ワッチョイ 0d01-R8z5)
垢版 |
2021/07/20(火) 08:27:13.73ID:6lATwKKz0
Asyncついたメソッドをawaitしたまへ
2021/07/20(火) 13:10:25.48ID:mJ2OrUml0
>>654
後者じゃね
2021/07/20(火) 13:19:06.99ID:luEetGrO0
後者があるのに前者を使うメリットが分からない
658デフォルトの名無しさん (ワッチョイ 9d5f-E0YB)
垢版 |
2021/07/20(火) 13:58:57.54ID:DgdZFi450
>>654
その選択肢で悩んじゃう君にぴったりの記事があるぞ
https://www.kekyo.net/2021/02/24/7268
https://www.kekyo.net/2016/12/06/6186
2021/07/20(火) 14:12:48.00ID:oT6fq8l/0
ありがとうございます。
普通に考えたら後者なのですが、フォームのLoadイベント時に上記処理を実行するようになっており、フォームLoad時にサーバーとの通信異常が発生していた場合、
前者の場合はフォームが応答する状態のまま、1〜2秒して例外をキャッチ出来ます。
後者の場合はフォームが応答しなくなり、1〜2秒して例外をキャッチ出来ます。
それでちょっと悩んでましたが、後者にします。
2021/07/20(火) 14:31:57.96ID:r+hLGJrq0
動作が固まるのはお前さんの使い方がおかしい。
2021/07/20(火) 15:01:47.73ID:BcEcK3qF0
僕も固まりそうです
2021/07/20(火) 18:15:30.23ID:ddjaqKuMa
ボクのお尻も固まりそうです
2021/07/20(火) 18:32:55.57ID:P25MFMIuM
async汚染が怖いので使わない方向で
2021/07/20(火) 19:34:56.43ID:SMoWJv7O0
WPFのバインディングについて質問です。
テキストボックスに読み取り専用プロパティをバインディングしたいのですが、
プロパティの値を変更してもテキストボックスに反映されません。
調べたら、プロパティの変更を通知するイベントが無いとだめとのことだったのですが、
setterなしでに通知イベントを実装する方法は無いでしょうか。

例:
public class ViewModel
{
public int ID { get; set; }
public string Name { get; set; }
public string NameSan { get => Name + "-san"; }
}

<TextBox Text="{Binding NameSan}" />
2021/07/20(火) 19:59:24.26ID:K5CNGksB0
誰にとっての読み取り専用なん?
2021/07/20(火) 20:08:36.24ID:K5CNGksB0
wpfでバインドできないプロパティは
DependencyPropertyでないから
DependencyObjectを派生させる必要がある
→UserControlを作ってそこにDependencyPropertyを作成する

ってググったら出てきた
667デフォルトの名無しさん (ワッチョイ 9d5f-Rh1M)
垢版 |
2021/07/20(火) 20:21:36.49ID:GzauUP740
XAML側でNameをバインディングしてコンバーターで-san付けるかなあ
2021/07/20(火) 20:27:17.58ID:luEetGrO0
>>664
NameプロパティのSetterでまとめて通知すれば良い

private string _name;
public string Name
{
get => _name;
set
{
_name = value;
PropertyChanged?.Invoke( nameof( Name ) );
PropertyChanged?.Invoke( nameof( NameSan ) );
}
}
669デフォルトの名無しさん (ワッチョイ 0d01-E0YB)
垢版 |
2021/07/20(火) 20:35:19.09ID:SMoWJv7O0
>>664です。
沢山の回答レスありがとうございます。
例として記入したものが不適切でしたので、訂正させてください。
実際はNamesanのgetterには別クラスから値を取得するメソッドが実装されており、
NameやIDはNamesanでは使用しないものになります。

public class ViewModel
{
 public string NameSan
 {
 get
 { //別クラスから値を取得するメソッド}

なので、>>668様にご教示頂いた方法は使用できない形になります。
2021/07/20(火) 21:00:19.75ID:luEetGrO0
>>669
外のクラスだろうがやることは変わらない
外のクラスからNameSanプロパティの内容が変わるタイミングで同じように通知する
外のクラスを変更するのが出来なければタイマーで通知を出すなんて荒業も思い付いたけどいまいち
2021/07/20(火) 21:07:59.62ID:SMoWJv7O0
>>670
>外のクラスからNameSanプロパティの内容が変わるタイミングで同じように通知する
ありがとうございます。外のクラスから通知させることができるのですね。
早速試してみたいと思います。

教えてくれた皆様、ありがとうございました。
672デフォルトの名無しさん (ワッチョイ 9d5f-Rh1M)
垢版 |
2021/07/20(火) 21:11:28.67ID:GzauUP740
なんでパターン崩してイレギュラーなことしようとするんだろ
2021/07/20(火) 21:45:11.17ID:luEetGrO0
>>670
ちょっと訂正。忘れてた。
クラスの外からイベントを直接発生させられないから、ViewModelクラスに変更通知イベントを
発生させるメソッドを実装して、外のクラスからはそのメソッドを呼び出す必要がある。

public Class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void FirePropetyChangedEvent()
{
PropertyChanged?.Invoke( nameof( NamaSan ) );
}
}
2021/07/20(火) 22:00:21.86ID:K5CNGksB0
>>672
その時点でこのスレには相応しくないよね
2021/07/21(水) 21:46:25.70ID:Ra0jV4kr0
その外のクラスの変更通知を受け取って、自身の変更通知をだせばいいんじゃないのか
なぜわざわざ外のクラスが別クラスのメソッド呼ぶんだ?依存関係がおかしいだろ
2021/07/22(木) 09:48:14.07ID:H+nzk7c30
>>673
イベントで実装する必要性がよく分からないんだよな
FuncやActionでよくねって思っちゃう
2021/07/22(木) 11:03:00.91ID:cBUwSw0B0
>>675
だね

Modelの値が変更されたらViewModelの値も変更してUIも更新したいってことだから
ViewModelでModelの変更通知をsubscribeしてsetter経由でPropertyChangedイベントを発生させてUIを更新すればいい
値の更新が必要にもかかわらず読み取り専用プロパティにする意味がよくわからない
2021/07/22(木) 15:01:08.94ID:2BJFjQfb0
PropertyChangedイベントを発生させれば事足りるのだが
setter経由させる意味がわからん
そのために読み取り専用を読み書きに変えるのか?
2021/07/22(木) 15:10:14.18ID:04ABr3MxM
WPFなら仕方ない
嫌ならオワコンWPFなんか捨ててWebで仮想DOM系のフレームワーク使えば何もしなくても自動的に差分取ってくれるよ
2021/07/22(木) 15:34:51.65ID:cBUwSw0B0
>>678
>PropertyChangedイベントを発生させれば事足りるのだが

どこで発生させるの?
2021/07/22(木) 17:41:00.24ID:ViOG2+oF0
適当にはこんな感じでしょ
model.PropertyChanged += (sender, e) => {
if (e.PropertyName == nameof(model.Hoge)) {
this.OnPropertyChanged(nameof(this.Piyo));
}
};

public string Piyo => $"OK {this.model.Hoge}";
2021/07/22(木) 19:46:33.52ID:UxCXOW0H0
イベントを発生させてないじゃん
2021/07/22(木) 19:51:13.33ID:vwDpdZeFM
基本をまず理解してないなあw
684デフォルトの名無しさん (ワッチョイ 695f-uCgs)
垢版 |
2021/07/23(金) 21:15:00.87ID:ETT9THzl0
PropertyChangedという言葉の意味を考えてみろ
setterにあるのが自然だろ
おまじないだよ考えなくていい
2021/07/23(金) 23:01:35.61ID:xliiSqIt0
そのためにわざわざ読み取り専用でいいプロパティにsetter作れってか
2021/07/23(金) 23:08:52.13ID:c4wX/KeRM
>>684
よく勘違いしてる人いるけど、イベントの-edは過去分詞じゃなくて動詞の過去形
つまりプロパティが他者によって変更されたのではなくプロパティが主体なので、
setterによらず自発的に変更イベントを発生させたとしてもなんら不自然ではない
2021/07/24(土) 00:23:31.06ID:h1SwVBD3a
イベントが過去形か受動態かについては議論があるよ
全部過去形だというのは明らかに無理があるw
どっちの場合もあると思うしそれでいいでしょ。

受動態>過去形>完了形

一般的な使用頻度はこうじゃないかな。
しばらく前からイベントに普通の名詞形を使う命名の仕方もあるよね
2021/07/24(土) 00:26:07.51ID:xo8cuQ5sM
>>687
https://docs.microsoft.com/ja-jp/dotnet/standard/design-guidelines/names-of-type-members#names-of-events
2021/07/24(土) 00:33:52.24ID:h1SwVBD3a
>>688
それはあくまでガイドライン。
実態の話をしてるんでしょ。

例えばそこのページに出ているDroppedDown、
dropは自動詞だと思うので過去形だという主張はちょと無理がある
2021/07/24(土) 00:36:42.84ID:LBBZ+Kmj0
長々と何やってんだこいつらは
2021/07/24(土) 00:55:30.71ID:5I2AJlas0
>>689
droppedは過去形でよく使わんか?
an apple dropped down.とか
stock price dropped.とか。
2021/07/24(土) 01:44:28.78ID:fvYf7+8hM
よく勘違いしてる人いるけどwww
2021/07/24(土) 01:47:50.50ID:1HbXMJpe0
その労力でドキュメント書けよと
694デフォルトの名無しさん (ワッチョイ 695f-qCnf)
垢版 |
2021/07/24(土) 02:04:43.55ID:hjQXc5u90
何したいのかよくわからんけど
getterしか必要ないってことはそもそも画面に表示する必要ないプロパティじゃないの
2021/07/24(土) 02:16:18.66ID:1HbXMJpe0
イミフ
値に単位でも付いてんじゃん?
2021/07/24(土) 02:31:41.54ID:h1SwVBD3a
>>691
何を言っているのか意味がわかんないけど、自動詞って言葉の意味は分かる?
dropしたのはDroppedDownイベントを発生させるオブジェクトではないよね?
イベントを発生させるオブジェクトはdropしたんじゃなくて「された」んだよw

もちろん「何かが落ちた」という現象を通知するイベントなんだと強弁することもできるが、
これ言ってて苦しいでしょ(笑)不自然で無理矢理すぎる。
受動態だって考える方が100倍自然だ。

Clickedイベントとかも同じ。
これが過去形ならButtonが自分で自分をクリックしたのかとw
お前はクリックしたんじゃなくてされたんだろうがとw
2021/07/24(土) 02:49:48.99ID:hRScAD3a0
どうでもいいことをw
2021/07/24(土) 07:33:48.35ID:Ogl9r0n00
続きは議論スレでどうぞ。

ふらっと C#,C♯,C#(議論用) [無断転載禁止]©2ch.net
https://mevius.5ch.net/test/read.cgi/tech/1469538912/
2021/07/24(土) 09:11:25.75ID:5I2AJlas0
>>696
自動詞わかるよ?

なんで自制を使うかって理由が抜けてるんだと思う。
ネイティブにとってもそこはMSの方針いけてねえよなって思うところかもしれんのだと思うんだけど、MSはBeforeClickとAfterClickとかそういう接頭語を使ってイベント発火順を表して欲しくないんよ。
なので、Clickのあとに起こるイベントはClickedなんよ。
Click→Clicking→Clickedになる。
2021/07/24(土) 09:34:03.83ID:LgxXeocX0
NCが無いぞ
2021/07/24(土) 10:12:44.82ID:mVGUTLQy0
>>694
ViewModelでの話に限って言うと
setterを持っているってことはViewから入力があるという含意がある
(もちろんケースバイケースでそうでない設計にすることもある)

で、例えばViewのラベルで現在時刻表示するためにViewModelにNowTimeプロパティを用意したとして
Viewからの入力はないんだからsetterを用意するのはおかしいよね、ということ
2021/07/24(土) 11:05:01.44ID:syFCi9m80
>>698
誘われてあっちを久し振りに読んでみたけど、ここよりも有意義なことが書いてある気がしてならない。
2021/07/24(土) 12:26:37.04ID:rh7fcU6F0
>>701
現在時刻は変化してくんだからprivateなセッターで値を更新して、プロパティ変更イベント発生させればいいんじゃないの?
2021/07/24(土) 12:40:41.42ID:qEX1axDl0
>>701
>setterを持っているってことはViewから入力があるという含意がある

ないよ
外部から呼ばれたくなければprivate/protectedなsetterを使う

現在時刻のような呼び出しのたびに変化するような値は一般的にプロパティにすべきじゃないよ
(DateTime.Nowとかあるけど、あれはMSも間違いだと思ってるらしい)
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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