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

■ このスレッドは過去ログ倉庫に格納されています
2021/08/25(水) 19:44:16.81ID:tgvUkE6r0
!extend:checked:vvvvv:1000:512
次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為)

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

■前スレ
ふらっと C#,C♯,C#(初心者用) Part151
https://mevius.5ch.net/test/read.cgi/tech/1621129559/
■関連スレ
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/09/22(水) 19:30:17.32ID:BIVRjYoPd
>>184
しつこい
2021/09/22(水) 20:59:35.34ID:ykEJ9q7La
>>185-186
という粘着。
まだこんな自分棚上げの2ch脳的思考が染みついちゃってるお方いるんだね
2021/09/22(水) 21:17:53.61ID:3pWwqqR20
ところで、どの書き方が好き?
コーディングルール云々は別として好みの話ね
(1) Hoge hoge = new Hoge();
(2) var hoge = new Hoge();
(3) Hoge hoge = new();
2021/09/22(水) 21:32:29.48ID:vBUUQQ5hM
hoge嫌い
190デフォルトの名無しさん (ワッチョイ f737-tt/w)
垢版 |
2021/09/22(水) 22:51:39.25ID:d5y6nh1w0
じゃあ2で
2021/09/22(水) 23:31:30.21ID:SH+Gpd0ma
Piyo piyo = new Piyo().piyo;
2021/09/23(木) 00:08:14.65ID:e9nBPEnq0
var hage = new Hage(light)
193デフォルトの名無しさん (アウアウウー Sa5b-hED7)
垢版 |
2021/09/23(木) 00:18:07.56ID:1QHTb9H7a
Hoge hoge();
2021/09/23(木) 00:22:45.17ID:W+8jwCREd
>>188
2
2021/09/23(木) 02:40:16.71ID:xSNs6jtp0
>>188
varが使いたいから(2)で統一。
196デフォルトの名無しさん (ワッチョイ d75f-P0JL)
垢版 |
2021/09/23(木) 06:17:51.94ID:knB3B2Kp0
3だな
2021/09/23(木) 10:39:33.85ID:k5aXOyOM0
4バイトも節約できるんだから3に決まっとろうが
198デフォルトの名無しさん (ワッチョイ 775f-4bEA)
垢版 |
2021/09/23(木) 10:45:10.69ID:zah9lHsX0
1か3
varはjsっぽくていや
2021/09/23(木) 10:48:49.49ID:A5zZg67+0
>>188
(2)
2021/09/23(木) 11:28:35.90ID:oS4wzjRX0
>>198
型推論と動的型付けはまったくの別物だぞ
2021/09/23(木) 11:34:40.89ID:dUOklB1+M
>>188
(3) なんて書けんのか?
って思ったらC# 9.0からの機能なんだな
(2) でいいと思うんだがなんかメリットあるんか?
202デフォルトの名無しさん (ブーイモ MMcf-fBlf)
垢版 |
2021/09/23(木) 11:56:33.67ID:acEFt2vDM
>>188
Javaやってるから(1)だ。

Javaだと(1)、C#だと(2)、のようにわざわざ使い分けるのが面倒で嫌い。
2021/09/23(木) 11:58:17.37ID:8wTnR9dmM
Javaはvar使えるぞ
204デフォルトの名無しさん (エムゾネ FFbf-hED7)
垢版 |
2021/09/23(木) 12:34:19.60ID:7tGJmFKPF
auto がいいな
2021/09/23(木) 12:52:13.66ID:mH17AHdd0
varは使わなくなったな、書き捨てのコードなら速く作業終わってよかったんだけど
後で保守することになって、何の型だかぱっと見て分からない、結局書き直す羽目になる
二度手間
2021/09/23(木) 13:06:25.13ID:GXKXc62za
variant型
2021/09/23(木) 13:36:37.01ID:tEWlRRfOM
>>205
まさかと思うけど印刷したリスト見てデバッグしてるとかじゃないよね?
2021/09/23(木) 13:37:43.63ID:oS4wzjRX0
>>205
varの上にカーソル持って行ったらツールチップで型が表示されるけど
2021/09/23(木) 14:16:06.38ID:lUK0l/hC0
Vim使いの人が同じような理由でvar嫌がってたな
まぁVim使いに合わせる訳にもいかないからそのままにしたけど
2021/09/23(木) 14:22:03.84ID:lUK0l/hC0
(Vim使いはC#じゃなくてC++のautoの話だったかも)
それにvar使わないとジェネリックとかで複雑な型が出た時書くの面倒だからね
それに型が変えられたら書き直さないといけないし
2021/09/23(木) 14:25:27.53ID:+1CY5Q9Y0
>>201
聞いて驚けよ
varの三文字分短くなる
俺も今知った
2021/09/23(木) 14:28:02.99ID:+1CY5Q9Y0
VSCodeですらインテリジェンスなのにVim男は化石すぎるな
2021/09/23(木) 14:32:54.37ID:CUMa33xsd
>>205
秀丸でコーディングしてんの?
2021/09/23(木) 14:37:00.53ID:dUOklB1+M
>>211
それを言うなら空白も1つ減るから4文字分だろ
4バイトとか言ってたアホもいるけどw
2021/09/23(木) 14:46:20.44ID:lUK0l/hC0
>>201
(3)の書き方は俺も今知ったな
まぁ元々は
private List<WeatherObservation> _observations = new List<WeatherObservation>();
って書いてたのが
private List<WeatherObservation> _observations = new();
と書けるようになるってことみたいだね

ローカル変数でそう各メリットは少ないかもだけど、今は(2)に慣れてるだけだろうから、そのうち(3)になってくのかも
2021/09/23(木) 15:27:13.76ID:o2KvPEYta
VSさんがしきりにvarはやめろ型名書けって囁いてくるからVS使ってる時だけHoge hoge = new();だな
VSCodeのときは脳死でvarって打ってる
本音ではconstって打ちたい
2021/09/23(木) 15:41:02.12ID:oS4wzjRX0
>>216
俺のVSはvar使えって言ってくるけど
2021/09/23(木) 16:30:44.15ID:tEWlRRfOM
>>215
長たらしい型名を2回書きたくないと言うのはわかるんだけどそれはvarで充分だと思うんだよね
new()じゃなくてメソッドがインスタンス返すような時はvar使わざるを得ないしマジでメリットが4文字減るだけにしか見えない…
2021/09/23(木) 16:44:32.43ID:oS4wzjRX0
>>218
普段はvar使ってるけど>>215の例みたいにフィールドとかプロパティの初期化にはnew()が便利だなと思った
2021/09/23(木) 16:51:19.32ID:VgSYdOn80
varが使えないところで使えってことなんだろうけど
正直そこまでしてタイプ量を減らす意義が見出せん

varの本来の使い方はLINQなんかでの匿名型なんじゃないのかと
2021/09/23(木) 16:51:37.14ID:tEWlRRfOM
>>219
ああ、なるほどフィールドとかだと
private var _observations = new List<WeatherObservation>();
って書けないのか
ちょっとググったら確かに実装がめちゃ大変そうだな
https://stackoverflow.com/questions/4461597/why-cant-class-fields-be-var
222デフォルトの名無しさん (ワッチョイ d75f-P0JL)
垢版 |
2021/09/23(木) 17:00:18.43ID:knB3B2Kp0
十分とか言ってるけど215のってvar使えるの?
2021/09/23(木) 17:01:07.90ID:PpSx1KBx0
私はあの中からは選ばない、絶対に
224デフォルトの名無しさん (ワッチョイ d75f-P0JL)
垢版 |
2021/09/23(木) 17:01:12.39ID:knB3B2Kp0
じゃあ3のほうが統一できるメリットあるじゃん
2021/09/23(木) 17:12:04.49ID:Sp5Iyysf0
new以外の関数からの戻り値を受けるのにvarが使えるから共存するだろ
2021/09/23(木) 17:31:12.69ID:+1CY5Q9Y0
>>216
設定で変わるんですが
2021/09/23(木) 19:02:03.53ID:sP+rEUVs0
私は(3)にしてます
慣れもあってか(2)のほうが書きやすいですが
githubとかでコード見る場合に関数の戻りをvar書かれると型がわからない
VS以外で読み書しないなら(2)でいいと思います。
2021/09/23(木) 20:01:59.44ID:O4CJNIQl0
>>216
え?
MSはvar推奨じゃなかった?
2021/09/23(木) 23:00:18.51ID:/ClkVF3E0
>>228
プロジェクトによって違う
230デフォルトの名無しさん (ブーイモ MMde-DBkT)
垢版 |
2021/09/24(金) 04:58:42.78ID:y2XYMU1vM
StyleCopで設定するんじゃないの?
2021/09/24(金) 05:56:28.56ID:qfZk0bKT0
>>188
同じ事を何度も書かないってルールで(1)は無い。
(3)も微妙に無いかな。定義だけメソッドの外、=new()だけ処理前にするとか。
2021/09/24(金) 08:28:43.49ID:NPGccV1b0
そんなマイルールあるとプログラミング難しそう。
233デフォルトの名無しさん (ブーイモ MMde-DBkT)
垢版 |
2021/09/24(金) 09:33:22.65ID:irV+RdEOM
マイルールで書いてもボタン一発でコーディングルールに沿ったのに変換してくれればおk
2021/09/24(金) 09:39:21.92ID:5BpUyVVQ0
>>228
推奨してるけどMS自身はvar絶対使わないマン
ギフハブみてみ
2021/09/24(金) 09:49:52.41ID:/LssCrRN0
>>234
そうだっけ?
と思って検索したら普通に使ってるですけお??
https://github.com/microsoft/winget-create/blob/a230d51ec9a64f0e980c10bba4941cb09def5cd6/src/WingetCreateCore/Common/GitHub.cs#L54
2021/09/24(金) 10:03:35.81ID:5BQj5+hr0
>>234
説明用にわかりやすく書いてるだけなんじゃあ
2021/09/24(金) 10:14:18.30ID:U+wMsrW6M
>>235
135: Dictionary<string, string> contents = new Dictionary<string, string>();
みたいな行もあってあんまり気にしてない感じやね
編集した時期が違うんだろうけど
238デフォルトの名無しさん (ワッチョイ 175f-6iP1)
垢版 |
2021/09/24(金) 10:24:15.05ID:/Uk5P+XR0
new()が使えるならnew()
それ以外はvarが最強
2021/09/24(金) 10:49:29.55ID:Qkaih1UNa
スタイル統一って本当に無駄な努力だよな
ただの見た目、書き方で迷うより同じ時間を使ってそもそもこの変数を消せないか、みたいな方向で悩みたい
2021/09/24(金) 11:31:51.86ID:eAv8Xp0Q0
>>234
みてみ
https://github.com/dotnet/aspnetcore/blob/277e42f4dcf1ee41c8a1b61a6aaa3e17ef15a1d9/.editorconfig#L36
2021/09/24(金) 13:33:19.92ID:5RECe5Rpa
>>239
そんなことはないと思うけど程度問題だね。
何であれ手段を自己目的化してしまうのは確かに愚かだ。

そんなことよりスレ違いだのなんだの他人のやることに
いちいちケチをつけないと気が済まないいつもの数人が静かなのが笑えるねw

ああいう人たちはその自分の欺瞞性に嫌気がささないものなのかw
242デフォルトの名無しさん (エムゾネ FF32-kEnG)
垢版 |
2021/09/24(金) 14:32:17.00ID:6iUyOY+3F
スレチ警察ωωω
2021/09/24(金) 18:05:14.38ID:5BpUyVVQ0
>>235>>240
派遣が書いたやつだろうな
2021/09/24(金) 18:11:46.80ID:O5E8wnHVd
>>243
悔しいね
2021/09/24(金) 18:57:42.89ID:w2u8w+pK0
>>243
糞ダサい
2021/09/24(金) 19:48:31.43ID:aNx0zmzyp
>>243
ばーwww
247デフォルトの名無しさん (エアペラ SD9b-OE0s)
垢版 |
2021/09/24(金) 20:03:25.45ID:KNT3aGoVD
ageておきますね
2021/09/24(金) 21:23:21.37ID:eAv8Xp0Q0
>>243
コーディング規約ですよw
249デフォルトの名無しさん (ワッチョイ 032f-f7S3)
垢版 |
2021/09/24(金) 21:38:44.12ID:RcC3+NL00
hageておきますね
        ______ 
      /     〇⊂⊃\
    /             \
   /                 ヽ
    l:::::::::               | 
    |::::::::::   (●)    (●)  o| 
   |:::::::::::::::::   \___/    .0|
    ヽ:::::::::::::::::::.  \/      ノ
2021/09/24(金) 21:59:31.97ID:Dq17+3pv0
hage.Dispose();
2021/09/24(金) 23:49:51.90ID:LxZpM9VS0
平日なのにわずか10分で否定されるのキツい
2021/09/25(土) 08:04:24.52ID:FSKWmZuJ0
配列関連をお勉強しとるんですが、
Array, Buffer, BitConverter, Collections.Genericのクラス
これらの他に見ておくべきクラスはありますか?
2021/09/25(土) 08:16:02.18ID:1B2aC0zA0
Dictionary
2021/09/25(土) 08:46:03.41ID:HriS4h5O0
List
2021/09/25(土) 10:24:06.98ID:BHEQVKdgM
>>253-254
それ
> Collections.Genericのクラス
だろ
2021/09/25(土) 11:36:42.78ID:+gmyYm6Y0
しいて言えばCollections.Generic全部だけど
何にでも使うものだからここだけお勉強しとけっての無さげ
2021/09/25(土) 12:46:07.75ID:utiZsGgVa
>>252
配列まわりだとSpan、Memoryあたりかな
コレクションまわりと拡大解釈するともう少し増えるが
2021/09/25(土) 13:14:02.37ID:HriS4h5O0
>>255
そうでしたっけオホホ
2021/09/25(土) 14:38:27.74ID:Ims+woa0M
SpanやMemoryは一通りモノ作れるようになるまではスルーでいいというか知らないほうがいい
厨二病のはじまり
2021/09/25(土) 16:31:09.85ID:YVyIn4WH0
SpanやMemory多発だと言語選択間違えてないか疑ったほいがいいな。
261デフォルトの名無しさん (ワッチョイ 9f24-2Lmd)
垢版 |
2021/09/25(土) 17:06:12.97ID:fbhVUQBc0
>>252
もう配列なんて時代遅れ
xmmレジスタで済ませるのが最先端だからSystem.Runtime.Intrinsicsを学ばないとオレにはついてこれないぞ
2021/09/25(土) 17:15:16.58ID:9oRN3Q4ya
先生、
>>261
がゴールと逆方向に独走してます!
2021/09/25(土) 17:23:02.02ID:IUkEhwfn0
そのまま行かせてあげましょう
2021/09/26(日) 15:18:24.34ID:ql2ts5nl0
Buffer, BitConverterってあまり使ったことないや
どういうときに使われるんだろ
画像とか扱いたい時?
2021/09/26(日) 15:29:09.22ID:beZMLKyb0
>>264
通信電文の解析とか
電文は通常ビッグエンディアンって決まりがあるので
2021/09/26(日) 21:02:40.12ID:gGZfowJe0
エンディアン変換めんどいよなぁ

たかだか2バイトのビックエンディアンをc#のshortに変換するだけでも
var dataLen = IPAddress.NetworkToHostOrder( BitConverter.ToInt16( buf, 32 ) );
で長すぎるんだよな。2バイトくらいだったら
var dataLen = buf[0] << 8 | buf[1];でもいいが、int幅なると記述量増えるし。

byte配列走査しているときはSpanを当てていることが多いから、Span<T>ももうちょっと使い勝手向上させて
int intLen = span.Slice(0,4).ToHostOrder();
みたいに書かせて欲しい
2021/09/26(日) 21:13:30.42ID:VX6MVIFY0
よくわからんけど拡張メソッドじゃあかんのか?
2021/09/26(日) 22:30:57.79ID:sbicFUHC0
拡張メソッドで対応可能だね
2021/09/26(日) 23:31:30.83ID:gGZfowJe0
い・いや、そうなんだけどね・・
車輪の再発明というか、作ると色々考慮が必要でとか、そもそもめんどいというか。
2021/09/27(月) 00:04:24.04ID:XMGm2liDa
まあライブラリで実装するほど汎用的というか需要がある処理じゃないって判断なんでしょうね。
つーか大昔からある宗教論争だけど個人的にはビッグエンディアンなんて
どっかのタイミングで追放してしまえばよかったのにw
つくづくこんなの考えた奴馬鹿だろとしかw

ところで、BitConverterってバイトオーダーは環境依存なのかリトルエンディアン固定なのかどっちなんだろう
2021/09/27(月) 00:19:20.50ID:OBbpWDI00
https://referencesource.microsoft.com/#mscorlib/system/bitconverter.cs,34

リトルエンディアン固定っぽいね
固定な癖にビッグエンディアンの実装してあるの謎だけど
2021/09/27(月) 01:04:33.98ID:lw6R4pVu0
BitConverterはちらっとソース見たらどっちのつもりだよこれって実装だったな
2021/09/27(月) 01:27:56.67ID:43Uiwmvz0
>>271のソースはビッグエンディアンのアーキテクチャの時は
BIGENDIANを定義してコンパイルして使うんでしょ
2021/09/27(月) 03:03:03.22ID:a10dBt+Nd
c#って機能的にはc++のメソッドを全部呼ぶことって出来ますか?

win32apiを弄っていて、当然ドキュメントは99%がc++なんだけど
dllimportとかを使えば全部の機能はc#からも使うことは出来ると思って良いのでしょうか?
それとも、言語仕様の壁があるから使えない機能も普通にあるのでしょうか
2021/09/27(月) 07:14:24.44ID:9HRv6vMlM
C++で作成したクラスのインスタンスメソッドが呼び出せなかったはず
DllImportで呼び出せるのはあくまでstatic相当メソッドのみ
2021/09/27(月) 07:49:13.10ID:VW3MkNv6M
環境決め打ちすれば無理矢理呼び出せなくなもないって感じ
https://qiita.com/tan-y/items/64711b244cf294d6bb9d
まあとてもおすすめできない
2021/09/27(月) 10:15:30.40ID:I8r9zhJi0
>>274>>275
アドレスさえ取得出来ればメンバ関数含めて全て呼べる
DllImportやGetProcAddresからはポインタ取得出来ないからそれを呼べると言えるかは微妙だが
メンバ関数は第一引数にインスタンスへのポインタが隠されてるだけの実態はただの静的関数だからdelegate* unmanaged[Stdcall]<void*, void>とかにキャストしてvoid*にオブジェクトポインタ渡せば正常に機能する
逆に言えば公開したいメンバ関数があるなら、第一引数にvoid*を沿えた静的関数にしてdllexportすればいい
2021/09/27(月) 17:06:27.12ID:yLuq9hY6a
double aaa = double.NaN;
bool bbb = (aaa == double.NaN) ? true : false; //bbb = false になる。えええ
bool ccc = (double.IsNaN(aaa)) ? true : false; //ccc = true になる
どうしてこうなるの?
2021/09/27(月) 17:16:06.27ID:xIAqABZoM
NaNは「数値ではない」ので、いかなる値と比較してもfalseになる
これはIEEEの規格で定められている
ゼロで割ったらいけないのと同じようなもんで、NaNの比較は原則やってはいけない
2021/09/27(月) 17:18:52.56ID:3tPBuYxM0
値がセットされてない状態が必要ならdouble?型使え
2021/09/27(月) 17:25:07.40ID:yLuq9hY6a
なるほど。厳しすぎるよ
(double.NaN == double.NaN)も成立しないのな
2021/09/27(月) 19:28:23.66ID:3UqjaTSrM
>>276>>277みたいなやり方もあったのか・・・
でもごめん276のQiitaを軽く読んだ限りだとちょっと怖くて&面倒くさくて使いたくない
どうしてもC++のインスタンスをいじらなきゃいけなくなったとしたら
従来通り無難にC++/CLIでラッパーを書くと思う
もう10年くらいそんなコード実装してないから書ける自信ないけど

おおもとの>>274への回答としては、一応条件付きでyes、ってことで合ってるよね?
C++で書かれたインスタンスのメソッドを呼ぶときには基本的には別途C++/CLIプロジェクトでソースを書き足す必要がある
その手間さえ許容できればC#で全部呼べる・・・はず
2021/09/27(月) 23:39:00.12ID:hzZ0wOco0
C#9の関数ポインタを利用したりMarshal.GetDelegateForFunctionPointerを利用したらどんなネイティブ関数も呼べるが(どちらも呼び出し規約設定可能)、
問題はそのDLL内の公開されてないメンバ関数ポインタをどう渡すか?に関してはC++同士でも独自に決めないといけない訳でC#どうこうの話ではなくないか?
2021/09/28(火) 20:06:35.50ID:HRlAR5zx0
こういうジェネリックの使い方ってありなん? 初めて見た

class Hoge<T>{
  Hoge2<T> hoge
}
class Hoge2<T>{
  Hoge3<T> hoge
}
class Hoge3<T>{
  T hoge
}
2021/09/28(火) 20:17:22.58ID:Y48RNilL0
特に意外なところもないと思うが…どこに引っかかったのか
2021/09/28(火) 20:26:34.83ID:v2L5F78s0
>>280
NaNを理解できない子にnullableとか鬼やな
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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