C#, C♯, C#相談室 Part97

■ このスレッドは過去ログ倉庫に格納されています
2022/12/21(水) 10:18:38.02ID:DxBIri9+0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512

■Visual Studio 2017 Community(無償の統合開発環境)等はこちら
http://www.visualstudio.com/downloads/

■コードを貼る場合はこちら
http://ideone.com/

■前スレ
C#, C♯, C#相談室 Part94
https://mevius.5ch.net/test/read.cgi/tech/1553075856/

■次スレは>>970が建てる事。
建てられない場合は他を指定する事。

C#, C♯, C#相談室 Part96
https://mevius.5ch.net/test/read.cgi/tech/1639965805/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2023/01/05(木) 11:22:59.00ID:ltDktvBL0
DLLを動的ロードして関数ポインタを取り出す部分はどっちかというとOSの仕事だしそこはDllImportとかに任せて
関数ポインタさえ手に入れば
.NET 2.0からデリゲートに変換できるメソッドがあるし
C# 9.0でそのまま扱うこともできるようになったよ
2023/01/05(木) 11:51:26.91ID:pzJhf9FT0
>>39
そりゃ当然出来る
型や呼び出し規約を合わせるのは自己責任だが
2023/01/05(木) 13:00:22.76ID:92Gx4s1W0
アンマネージド使うのは自己責任で
2023/01/05(木) 14:07:29.25ID:HFE02prZr
c++/cli 作って橋渡ししてたわ
2023/01/06(金) 00:26:12.47ID:rNk5rLcjM
とあるクラスにあるすべてのプロパティを読み取り専用にしたいんだけど、なにか良い方法ありますか?
やっぱり継承してプロパティの数だけ読み取り専用プロパティで定義するしかない?
45デフォルトの名無しさん (スプッッ Sdba-kLll)
垢版 |
2023/01/06(金) 07:59:18.36ID:vZ5ptmnXd
継承させたところで元クラスにアップキャストされたら終わり
constにさせる方法はたぶんないと思う
2023/01/06(金) 12:38:09.71ID:vCsnZijhM
recordにしたら
2023/01/06(金) 12:49:52.37ID:buYHqiH80
C#って地味にこの辺弱いよな
C++のconst ポインタと同等の機能があればReadOnlyCollectionとかReadOnlySpanなんてそもそもいらないのに
2023/01/06(金) 14:18:25.75ID:QdJf8bLxa
C++なら継承して読み取り専用にできると思ってるのか
2023/01/06(金) 14:27:10.69ID:zhrc9IIn0
いや継承は必要なくて、C++なら単にそのクラスのインスタンスを格納する変数や引数の型をconstにするだけで読み取り専用になるよ
TypeScriptもReadOnly<X>とするだけで簡単に読み取り専用のXの型を作れる
2023/01/06(金) 15:16:54.53ID:QdJf8bLxa
方法が違うだけでC#でも簡単にできるだろw
51デフォルトの名無しさん (アウアウウー Sac7-7txW)
垢版 |
2023/01/06(金) 17:46:49.43ID:MJJvxMZsa
>>50
どうやるの?
2023/01/06(金) 19:39:06.39ID:7HwChuQ+0
>>49
それ、そのクラスのプロパティも読み取り専用になるのか?
2023/01/06(金) 20:12:53.98ID:KHJficEWa
>>52
C++のconstの場合は、フィールドが全て読み取り専用になり、読み取り専用(const)としてマークされたメソッドしか呼べなくなる
TypeScriptのReadonly<>の場合は、全プロパティが読み取り専用になった「型」が生成される
TypeScriptというかJSではメソッドは単に関数を返すプロパティなので、メソッドの内容には特に関知しない
2023/01/07(土) 10:18:16.28ID:FC273Y3JM
>>44
誰かが書いてるけどrecordじゃだめなん?

public record Person(string FirstName, string LastName);
2023/01/07(土) 11:12:47.51ID:ErVvBSvoM
>>53
何それ凄い便利じゃん

>>54
できればプロパティを1つ1つ書きたくないんだよね
2023/01/07(土) 11:42:41.36ID:iltXkPxC0
継承後のクラス定義って、継承前より厳しくできたっけ?
2023/01/07(土) 13:01:01.65ID:FC273Y3JM
>>55
いやいやw
これでもう終わりでreadonlyだよ
2023/01/07(土) 13:01:54.79ID:FC273Y3JM
これ以上短い書き方なんてできるか?
2023/01/07(土) 13:51:35.25ID:unZBLw7Xd
質問者は既存のミュータブルなクラスのプロパティを読み取り専用にしようとしている
>>54だと同じプロパティを全部定義し直さなきゃいけないし、元のクラスからコピーする手間も必要だ
>>49の方法であればプロパティを定義し直す必要もコピーする必要もない
2023/01/07(土) 14:55:27.90ID:FC273Y3JM
既存のプロパティに当たるものをconstにするのは全部定義しなおしてるの同じなんだけど…

どういうやり方で既存のプロパティを定義してるのかもわからないし意味不明だなと
2023/01/07(土) 14:56:55.34ID:FC273Y3JM
うまく行くならプロパティのsetをinitアクセサに変えるだけなんだけど
2023/01/07(土) 15:35:50.01ID:FC273Y3JM
特定のコンテキストで書き換え不可
状況次第で書き換えの可否を変える
とかならめんどいけどそういう話じゃないんだろ
2023/01/07(土) 16:17:29.42ID:rg/VZrjHa
>>60
いやまともなC++のコードならgetterはconstで定義されてるはずだから、変数の型をconstにするだけでreadonlyになるよ
64デフォルトの名無しさん (ワッチョイ 9301-GR7q)
垢版 |
2023/01/07(土) 17:38:18.83ID:mDCtTa800
君たち的に.NET MAUIでandroid,iphone,WindowsでC#のネタ帳的なの作ったら協力してくれる?
小ネタ集みたいなのを各々がSQLで保存してそれをカテゴリ分けで見れるようにするやつ
例えばRestAPI関係だったりの基本的な書き方を表示したりできる
ネットで調べれば一発だが1つにまとまってるのは利点かと、、、
65デフォルトの名無しさん (ワッチョイ 1176-1Rsz)
垢版 |
2023/01/07(土) 17:48:11.52ID:odL5Q3k30
wiki立ち上げればええやん
2023/01/07(土) 18:07:01.95ID:FC273Y3JM
多分世界中のc#プログラマの99.9%は.NET MAUIに興味ないと思う
67デフォルトの名無しさん (ワッチョイ b101-phWz)
垢版 |
2023/01/07(土) 18:08:54.54ID:St5PAkDm0
winui3でよくね?
2023/01/07(土) 18:14:01.42ID:FC273Y3JM
と言うよりいい加減いくつフレームワーク立ち上げれば済むんだよ

モバイル関連は全部html+jsにしてデバイスを仮想サーバにしてそいつにREST api投げてjsonでセンサ値とか取るようにすればいい
そしたらもう再生産しなくていい
2023/01/07(土) 18:17:46.74ID:unZBLw7Xd
>>64
コンテンツが利用者頼みのサービスは最初自分で頑張るか金出すかしてコンテンツを揃えない限り必ず失敗する
というわけでまずは自分で頑張れ
70デフォルトの名無しさん (ワッチョイ 9301-GR7q)
垢版 |
2023/01/07(土) 18:24:07.38ID:mDCtTa800
>>69
なるほど
2023/01/07(土) 18:25:21.79ID:FC273Y3JM
一度覚えた技術を何十年も使いまわせるような仕組みにしろよ
都度都度新しいAPIセット出して馬鹿なのかMSは?
2023/01/07(土) 18:30:58.40ID:UPEdDe6/0
ワッチョイ 9301
こいつマウイ君だろ、自分のスレでやれ。NG
73デフォルトの名無しさん (ワッチョイ b101-phWz)
垢版 |
2023/01/07(土) 18:44:15.99ID:St5PAkDm0
ここにまでマウイ出張ってきたか
ちゃんとワッチョイを恐れろよ
2023/01/07(土) 20:02:44.89ID:Xl5j6yUn0
マウいじゃん
2023/01/07(土) 21:02:06.62ID:FC273Y3JM
そんなにマウいかな?
2023/01/07(土) 21:14:41.15ID:mnUUIrvLa
チョベリグ
77デフォルトの名無しさん (ワッチョイ 515f-DWwd)
垢版 |
2023/01/07(土) 22:07:32.34ID:8LnSupdD0
>>64
> 例えばRestAPI関係だったりの基本的な書き方を表示したりできる
今からこの手のサービスやってもCopilotに勝てないだろ
78デフォルトの名無しさん (ワッチョイ 9301-GR7q)
垢版 |
2023/01/07(土) 23:32:10.91ID:mDCtTa800
>>77
copilotって別にこれしたいって言えば全部記入してくれるわけじゃなくね?
俺としてはあぁRestAPIの使い方ど忘れした~
なんだったっけ???ってGoogleで調べる時間をアプリで素早く検索できるって感じのものを作りたいかな
2,3回やったことあるやつでもどうだったっけ?って忘れることままある
まぁGoogleとかでいいんだけど1つのアプリにまとまってるってのはなかなか便利なんじゃないかなと…
79デフォルトの名無しさん (ワッチョイ 9301-GR7q)
垢版 |
2023/01/07(土) 23:32:40.09ID:mDCtTa800
自分で追加もできるしな
2023/01/08(日) 16:11:14.19ID:qCDijd6S0
Aクラスを継承したBクラスがあります
BクラスのリストにAクラスをAddしたいんですが、どうすればいいのでしょうか?
2023/01/08(日) 16:20:03.96ID:PrLa9yfk0
>>80
それは無理
Bは絶対にAだけどAはBとは限らないでしょ?
つまりAクラスのリストにするしかない
まあUnsafe.As使えば無理矢理入れられるけど
2023/01/08(日) 16:24:40.95ID:GEbVHkXI0
>>80みたいな質問する奴って意味も分からず継承使ってたりしてそうで怖いわw
83デフォルトの名無しさん (ワッチョイ 1176-1Rsz)
垢版 |
2023/01/08(日) 16:25:49.80ID:+2bxRzY60
A a=new B(); とかで、実体がB型かもしれないならBにキャストすればいい。
A a=new A(); でA型そのものだったらそもそもこの話は成立しない。

list.Add((B)a);
2023/01/08(日) 16:40:39.00ID:Z6otLx+Dd
>>78
massCodeとかgistとかでいいんじゃない
85デフォルトの名無しさん (ワッチョイ 9301-GR7q)
垢版 |
2023/01/08(日) 16:50:26.87ID:+xzWagUM0
>>80
継承じゃなくてBクラスにAクラスのプロパティのリストを入れる場合はたしかいけたぞ
2023/01/10(火) 13:29:49.07ID:yPlBxuJ3M
>>71
ほんとこれ
2023/01/10(火) 15:05:52.75ID:ZisiPnco0
スマホアプリ作ってると毎年アプデで便利な機能がdeprecatedされてくのがストレス
それに比べたらMSの方が優しい
2023/01/10(火) 17:23:44.95ID:qAIynO1bM
>>86
それじゃ入門書売れないだろ
バカ?
2023/01/10(火) 18:28:40.94ID:IC+XgAqf0
android何かも最近コード書いてないけど、非推奨や消えたりする機能が結構あるよね
古いコードをメンテナンスするときに良く引っかかる気がするわ
90デフォルトの名無しさん (ワッチョイ b101-tb1I)
垢版 |
2023/01/10(火) 19:16:36.48ID:0yW4rCRf0
C言語の重力付き4目並べです、ここのコードを簡略化したいです。

int SetXpos(int player) // コマの置き場所を入力または探して盤を更新,コマの置き場所(0-6)を返す
{
int xpos = 0; // コマの置き場所
if ((choice == 2 && player == 2) || (choice == 3 && player == 1)) // コンピュータとの対戦の場合に,コンピュータの手を計算
{
xpos = ComputeXpos(player);
printf("%sの番です\n", player == 1 ? "●" : "〇");
printf("コンピュータは%dに置きます\n", xpos);
}
else // 人間の手を選択
{
while (1)
{
printf("%sの番です\n", player == 1 ? "●" : "〇");
printf("どこに置きますか? 0-6の数字を半角で入力してください: ");
scanf_s("%d", &xpos);
if ((0 <= xpos && xpos < XMAX) && (num[xpos] < YMAX)) // 置ける場所かどうか判定
break;
printf("%dには置けません!\n", xpos);
}
}
board[xpos][num[xpos]++] = player;// コマをxpos列に置き,xpos列のコマ数を1増やす
return xpos;
}
2023/01/10(火) 19:28:44.72ID:uTLnAVho0
頑張ってください
2023/01/10(火) 19:32:45.96ID:IC+XgAqf0
そもそもC#のスレだからすれ違いだがw

printf("%sの番です\n", player == 1 ? "●" : "〇");
をifの前にするとか(それぞれにあるから冗長)
プレイヤーの処理もPlayerXpos()とかに出すとかすれば良いのでは?
93デフォルトの名無しさん (ワッチョイ b101-tb1I)
垢版 |
2023/01/13(金) 06:38:18.48ID:CqT5d+dn0
ありがとうございます
94デフォルトの名無しさん (ワッチョイ ca01-FIs7)
垢版 |
2023/01/15(日) 19:05:41.63ID:CnKOeOE30
Shift-JISの文字列をutr-8に簡単に変換する方法ってありますか?
やはり一度Stream(バイナリ)に変換する必要があるのでしょうか
2023/01/15(日) 19:23:52.26ID:gGAdUt3l0
>>94
streamじゃなくてbyte[]じゃないの
Encoding.GetString(Encoding.GetBytes(string))ってことだよね
何のためにそんなことするか知らんけど
96デフォルトの名無しさん (ワッチョイ ca01-FIs7)
垢版 |
2023/01/15(日) 19:25:34.21ID:CnKOeOE30
>>95
つまりstringの状態でencodingは可能なのですか?
97デフォルトの名無しさん (ワッチョイ ca01-FIs7)
垢版 |
2023/01/15(日) 19:28:04.22ID:CnKOeOE30
C#でRestAPIを投げてブラウザ側から貰ってくる文字列はShift-JISらしい
それでC#はutr-8で表記されるため変換(Encoding)が必要になるのです
2023/01/15(日) 19:51:16.92ID:wUGuc0E00
stringはunicodeだぞ?
2023/01/15(日) 22:26:45.28ID:pBiKKGenM
unicodeは符号化方式など規格とそのコード群の名前
2023/01/15(日) 22:56:10.93ID:AxXMsEIz0
そのREST APIをどうやって呼び出してるのか知らんけど
真っ当なサーバならContent-Typeにcharset設定してて
一般的なライブラリなら文字列として読み取るときにcharset参照して適切に文字列型に変換してくれる
から特にプログラマが考えることはない
これらの前提が崩れてるなら文字列として読み取るんじゃなくてバイト配列として読み取って
System.Text.Encodingクラスを使ってバイト配列をstringに変換する必要がある
この場合変換先の符号化形式を考える必要はなくてShift_JISをstringに変換することだけ考えればいい

もしライブラリの都合でstringとして受け取ることしかできなくて
かつその時点で文字化けが出るようなら
それはもうどうしようもないので使うライブラリを変える必要がある
2023/01/15(日) 23:38:57.01ID:r5uLxMWea
sjis/CP932 とか、何十年前の話w

sjisのサイトも、5ch だけだろw
2023/01/16(月) 00:18:41.42ID:sUZCnaKRM
古の生き残りのサイトもsjis

chromeが文字コード判定ミスしてても今は手動で文字コードは変えられない
103デフォルトの名無しさん (ワッチョイ ca01-FIs7)
垢版 |
2023/01/16(月) 01:06:54.26ID:Iz2auSAp0
>>100
なるほど
助かります!
2023/01/17(火) 01:05:55.75ID:BTJjkb3Ra
手動で文字コードを変更できる、Chrome の拡張機能は無いの?
2023/01/17(火) 18:23:06.75ID:EvOewZJzd
ブックマークレットのレベルで出来そう
知らんけど
106デフォルトの名無しさん (アウアウウー Sa91-5Koo)
垢版 |
2023/01/17(火) 19:13:35.87ID:reGY8TLTa
charsetのタグいれればええんかね
2023/01/17(火) 19:17:51.92ID:3iw8L5pXa
x-sjisとかの指定もあったからな
2023/01/18(水) 12:59:30.83ID:KNmhbmwea
>>104
たくさんあるが
2023/01/18(水) 20:59:57.78ID:5annSIeD0
たくさんあるのかよ
一個でいいやろ
2023/01/18(水) 21:51:34.28ID:oIAAyMph0
win32APiのChangeDisplaySettingsExをC#から呼び出して、
モニタのポジションを変更してるんだけど、
変更直後にScreenのBoundsから値をとっても値が変化しない・・・
アプリ再起動するとちゃんと変わってる。
ディスプレイの設定ってレジストリに保存してるから、もしかして
アプリ再起動しないとScreenクラスのBounds反映されない?
アプリ再起動せずになんとかする方法ないですかね?
2023/01/18(水) 22:07:32.78ID:jVn9UUXQ0
自分でバンズ計算すりゃいいじゃない
知らんけど
2023/01/18(水) 22:14:35.47ID:/+rmiMsB0
Screenオブジェクトフィールドに保存してたりする?
毎回Screen.AllScreensとか.PrimaryScreenとかから取得すればどう?
ところでSystemEvents.DisplaySettingsChangedイベントは発生してる?
2023/01/19(木) 07:38:17.94ID:K9HYHkiWM
2つのクラスを1つのクラスに合体させて使いたいんだけど、どうやるのがスマートですか?
多重継承ができたら良かったんですが…
2023/01/19(木) 09:03:14.21ID:Hct/UdRpp
合体?
またなんで、改悪臭しかしないわ
2023/01/19(木) 09:25:09.63ID:LXNiK0p/0
そういうのは大体気の迷いだから、落ち着いて全体から考え直せば
2023/01/19(木) 09:44:42.78ID:Hct/UdRpp
むしろ機能単位で分解するのが健全な方向なのに
違う機能を似たものだから合体とかわりと誤った方向に行く人かな?
2023/01/19(木) 09:56:12.01ID:zVWBDbvx0
ライオンクラスと山羊クラスと蛇クラスを一つにしたいんです
2023/01/19(木) 10:01:07.14ID:yp2D21uT0
>>117
つトレイト
119デフォルトの名無しさん (ブーイモ MM2e-laSj)
垢版 |
2023/01/19(木) 10:51:30.57ID:Iv2veF3WM
>>113
コンパイル時に型チェックしたいなら既存の型をインターフェースで定義し直して呼び出し側も修正
でもこういう変更が必要な状況はほとんどないのでコンポジションで移譲するケースなんじゃないかな

>>117
トレイトでもインターフェースでも同じだよ
2023/01/19(木) 11:01:05.91ID:yp2D21uT0
>>114
BindableBaseと他のクラスを両方継承したい場面はいくつかあるな
ソースコードジェネレータは中々いい
2023/01/19(木) 11:01:57.47ID:yp2D21uT0
>>119
トレイトはフィールドを持てるから同じではないけど言いたいことはわかる
122デフォルトの名無しさん (ワッチョイ 06bb-JXbu)
垢版 |
2023/01/19(木) 11:31:03.31ID:kysdIh6r0
質問内容はクラスをまとめたいってことなので、ずれちゃう話にはなるけどさあ
(フレームワーク等を使う場面を除いて)初心者中級者のうちにクラスを継承をしようと思ったら設計段階でおかしいので、正解はどうするべきなのかを聞いた方がいいんじゃないのかな
2023/01/19(木) 12:04:02.54ID:WELAMOcMp
クラスインスタンスを取り込めばいいのに
なんで継承にこだわる?
2023/01/19(木) 12:21:58.33ID:tEHmCOQcM
やりたいことは
いくつかのプロパティを持つデータを格納するだけのクラスAがある
クラスAにバインド用のプロパティをいくつか追加したクラスBを作って、それのリストをDataViewにバインドしたい

AとBのすべてのプロパティを書いたクラスCを作ればできるけど、なんとかして少ないコードで実現したいです
2023/01/19(木) 12:45:40.56ID:H7hm+dDpa
Aをバインドできるよう書き直せばいいんじゃね
2023/01/19(木) 12:52:06.93ID:8nS1/G/Mr
>クラスAにバインド用のプロパティをいくつか追加したクラスB
>AとBのすべてのプロパティを書いたクラスC
なんかおかしくない?
2023/01/19(木) 16:09:46.95ID:h7ydINbB0
Aを継承してバインド用のプロパティを追加したBを作って
List<B>を持つCを作ってそのList<B>をバインドすればいいんじゃないの
2023/01/19(木) 17:30:22.46ID:tEHmCOQcM
>>127
それで出来るんですが、バインド用のプロパティが沢山あったときに毎回書くのが面倒で、どうにかして効率化できないか考えてます
2023/01/19(木) 18:00:00.70ID:pNQOSNx5M
ここですら見かけない超クソ黒魔法もあるけど全くお勧めしない

普通にコンポジションで書くのが正解じゃないかな
アンマネージドなものをラップするのと変わらない
手書きでも自作コードジェネレータでもどうぞ
2023/01/19(木) 18:06:50.46ID:pNQOSNx5M
黒魔術な…
2023/01/19(木) 19:44:59.20ID:cZ+iShes0
やりたい事は理解できる
構造体を合体させるにあたりフィールドで保持すれば良いというのはその通りなんだがアクセス手段が冗長になるのは嫌っていうワガママな気分によくなる
C++のように素直に構造体継承や多重継承認めてくれって思う事は頻繁にある
2023/01/19(木) 21:19:14.97ID:z427r+xYp
プロパティにしてバケツリレーw
2023/01/19(木) 22:05:29.65ID:wlAvkW/br
>>128
バインド用のプロパティってクラスAのもつフィールドを参照するの?
2023/01/20(金) 01:42:18.00ID:Jpp0Ng/yM
>>133
しない前提です。

データソースクラスにバインド用のプロパティも含めれば実現できるけど、クラス設計として微妙なんだよな
2023/01/20(金) 12:05:04.93ID:rWqtsOF60
>>134
>>125が正解な気がするが、
そもそもバインド用のプロパティってどういうものを想定してるんだ?
よくあるINotifyPropertyChanged自動実装したいとかそんな話か?
2023/01/20(金) 20:51:09.38ID:jJGC4T1tr
つまるところ、M(クラスA)とVM(クラスB)を煩雑にならないように扱いたいって話かね
この辺は詳しくないけどいろいろプラクティスがあるんじゃない?
2023/01/21(土) 11:56:14.92ID:cGrVppR7M
C#だとあまり楽な方法はない
2023/01/21(土) 12:36:53.78ID:rZUyyxKK0
そんなアホなことしたがるやつがそもそもいないからな
することが多ければすぐに楽な構文が作られるのがC#
2023/01/21(土) 16:52:35.79ID:H5hcEaoi0
C#は基本的に
・static寄せ集めユーティリティのクラス
・必要な画面フォームのクラス
・メインプログラムのクラス
この3つ以外要らないのだよ
意識高い系が説くMやらVに振り回されてはいけないのだよ
変な抽象化は問題をややこしくするだけだと学ぼう
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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