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

レス数が900を超えています。1000を超えると表示できなくなるよ。
2021/03/23(火) 12:58:24.10ID:ACoFzk2L0
!extend:checked:vvvvv:1000:512
次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為)

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

■前スレ
ふらっと C#,C♯,C#(初心者用) Part149
http://mevius.5ch.net/test/read.cgi/tech/1608085775/
■関連スレ
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
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2021/05/09(日) 13:23:44.08ID:rwsrdF7nd
古いガイドラインだけど
>✔ 必要な場合は、インスタンス コンストラクターから例外をスローします。
だからダメってことはないんだよね

コンストラクターのデザイン - Framework Design Guidelines | Microsoft Docs
https://docs.microsoft.com/ja-jp/dotnet/standard/design-guidelines/constructor
2021/05/09(日) 13:33:06.24ID:6ong4OY90
ちょっと大きめのメモリ割り当てたら1回の例外発生時にGC呼び出されてるのも確認できた
2021/05/09(日) 13:38:09.58ID:WHUEfE6G0
>>813
> どんな値が渡されるのかわからない関数などは例外処理、その逆(外部に公開しない関数)の値チェックになら使えそうなのかなと思ったんですが
ざっくりその認識で正しいよ
内部的にはあり得ない状態ならAssert投げる
デバッグ終えたら削除とかアホのやること
注意すべきなのはassertの条件の所に副作用を含む式を書いちゃいけないことぐらい
2021/05/09(日) 13:42:03.78ID:yIvZIEF/0
そもそもなんでもかんでもエラー処理を例外任せにするのが間違ってるような
2021/05/09(日) 13:46:49.04ID:rAnETUQPM
C#ではコンストラクタで例外が出るとファイナライザが呼ばれないことから
コンストラクタでは例外を出すべきでないとする派閥が昔は存在した

しかしこれが問題になるのはコンストラクタでアンマネージドリソースを確保してDisposeで解放するパターンを採用したクラスだけだ
ネイティブライブラリをPInvokeで呼び出すような低レベルの仕事では気を付ける必要があるが
そうでなければ気にしなくてよい

またそのようなアンマネージドリソースを扱う場合でもC#ではSafeHandleを実装して使うことになっている
SafeHandleを使う側はリークをことさら恐れる必要はない
コンストラクタで例外を投げてもよろしい
2021/05/09(日) 13:48:56.57ID:aeEkFGhTM
>>833
例外投げるなら、その前に既にnewしたものを全部綺麗にDisposeしなきゃいけないわけだけど
そこまで考慮して正しく実装されたコンストラクタなんてドカタのコードで見たことないな
自分でthrowしなくても呼び出し先から例外が飛んでくるケースもあるから、本来は常に考慮が必要
あくまで可能性の問題としてだけど、コンストラクタで例外を投げるとDispose漏れが起こりやすいのは事実だと思うよ
漏れを完全に防げなくても、GC任せで問題にならない程度に頻度を抑えることはできる
2021/05/09(日) 13:53:06.35ID:V90kiCWja
>>836-837
ちょっと何いってるのかわからないw

>>838
なるほどね。
コンストラクタで例外投げてもほとんどの場合
問題がないことはよくわかったけど、
それでも個人的にはやっぱり避けるかな。

コンストラクタで例外が飛んでくることを想定してないプログラマが多い気がするから。
あえて違和感を感じさせるためにファクトリーにすると思う。
まあ屁のツッパリ程度の効果しかない気もするが。
2021/05/09(日) 13:53:17.09ID:rAnETUQPM
>>836
プログラマが内部的にありえないと考えている状態が実際に発生するかしないかはプログラマにはわからない
それがバグというものの性質だ
バグはプログラマの意識の外からやってくる
プログラマが間違えるからバグが発生する

なので絶対に起こらないから本番では外しちゃえなどと安易に考えずに
俺の考えではまあまず起こらないと思うけどもし起こったらやばいから念の為に残しておこうと考えたほうがよい
2021/05/09(日) 13:56:13.68ID:aeEkFGhTM
>>838
.NET 5以降ではCERが廃止されたからSafeHandleは意味ないよ
2021/05/09(日) 14:05:22.60ID:aeEkFGhTM
ちなみに.NET Framework(非Core系)でもCriticalFinalizerObjectに意味があるのは複数のAppDomainを使ったアプリケーションの場合だけだよ
あまり理解されてないけど、99.9%の人には無関係な極めてニッチな機能
2021/05/09(日) 14:06:37.90ID:KNQAmpF60
また空中戦やってるな
設計はどうなってるのか?もこだわらず
どう処理したいかばっかり
客がエラー扱いにしたいって言ったら
テメーの例外のこだわりなんかゴミ箱だ
逆もまた然り
2021/05/09(日) 14:12:54.16ID:aeEkFGhTM
いや客ってのがユーザーのことなら例外処理なんて客と無関係な純粋に技術的な問題でしょw
多重下請けならその限りではないかもしれんが
2021/05/09(日) 14:27:16.94ID:rAnETUQPM
>>842
SafeHandleはCERのためのものではなく
アンマネージドリソースハンドルのラッパーを提供するための共通基盤でありCER対応はその部分でしかない
SafeHandleは依然として有用だよ

初心者は参考にするといい
https://docs.microsoft.com/ja-jp/dotnet/standard/garbage-collection/implementing-dispose
2021/05/09(日) 14:30:18.11ID:rAnETUQPM
もちろんオレオレハンドルラッパーをDIYしたいならそれを止める権利は俺にはない
しかし趣味ならともかく仕事ではDIYを避けたほうがいいだろうねとアドバイスだけはさせてもらおう
2021/05/09(日) 15:15:59.96ID:xtmxe3CZ0
>>824
ありがとうチェックしてみるよ
2021/05/09(日) 15:17:59.75ID:E0SRP95CM
>>846
それは眉唾だな
docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.safehandle?view=net-5.0
例えばこのサンプル、SafeHandle派生クラスを実装した上で更にそれを適切に解放するために普通にDisposeパターンを実装してる。
これが典型的な正しいSafeHandleの使い方だ。
CERが無いなら手間とミスしうるポイントが余計に増えるだけにしか俺には思えないね。
2021/05/09(日) 15:32:32.00ID:SuJMzV5Hr
newしたものが綺麗にdisposeされないって馬鹿のコードだろ

そもそもが引数チェックではじいてからnewするだろ馬鹿じゃないかと
2021/05/09(日) 15:40:33.58ID:SuJMzV5Hr
.netの内部でもこんな感じで普通にコンストラクタで例外投げてる
これ以外でどうやって通知すんだよ
馬鹿者が

if (path == null)
throw new ArgumentNullException("path", Environment.GetResourceString("ArgumentNull_Path"));
if (path.Length == 0)
throw new ArgumentException(Environment.GetResourceString("Argument_EmptyPath"));
2021/05/09(日) 15:45:00.43ID:E0SRP95CM
>>851
ArgumentExceptionは開発時のバグであり、ソースの修正が必要だ
そのまま実行を継続すべきものではないから、リソースの開放漏れ云々は全く関係ない
2021/05/09(日) 15:49:17.16ID:SuJMzV5Hr
コンストラクタで例外は投げても良い

でもおかしなことをする奴がいるからコンストラクタでは例外投げるなは暴論
2021/05/09(日) 15:51:19.62ID:FUAnWwVaa
>>849
プラットフォーム呼び出し時の参照カウントなどはどうする?
855デフォルトの名無しさん (ワッチョイ ea61-LExt)
垢版 |
2021/05/09(日) 22:04:27.52ID:pySvIkdW0
例外はcatchして握りつぶすのが吉
2021/05/09(日) 23:19:09.95ID:CIQV7Tg10
async voidも多用すべし
2021/05/10(月) 07:43:24.96ID:v9qGjilad
クラスとかメソッドとか分けるときの命名が大変で時間が掛かるお…
適当にそれっぽい英単語繋げてるけど、メソッド名が50文字以上になることがよくあるお…
ForとかByとかFromとかも使うとより長くなるんだお…
どうしたらいいんだお?
2021/05/10(月) 08:00:47.54ID:XZUy8xNJ0
>>857
俺は命名には
https://codic.jp/engine
使ってる

文字数減らすためじゃなくて、英語力不足を補うためだけどw
50文字超えることはあんまりないかなぁ。
2021/05/10(月) 08:05:31.40ID:AtOV5vKAM
>>857
https://www.japan9.com/cgi/rand_num.cgi
2021/05/10(月) 08:26:26.05ID:v9qGjilad
>>800
自分は投げますね
MSが作ったデフォのクラスにも投げてるやつあったと思うのでそれを言い訳にしてます
2021/05/10(月) 08:28:55.47ID:EOKyCo1ad
>>858
>>859
ありがトンブレロ!
2021/05/10(月) 08:51:24.61ID:y0jj8Ah00
引数エラー一個一個出してくわけには行かない場合例外だと処理しにくいな
2021/05/10(月) 09:51:39.48ID:6ezg7cUTd
コメント打つ代わりにフルスペルで命名するっていう手もあるよね。
そうすれば入力する手間は変わらない。
でも英語が見慣れてなくて辛い。
2021/05/10(月) 09:56:18.04ID:AtOV5vKAM
C#は日本語ok
2021/05/10(月) 12:05:19.67ID:OSpjgtmc0
命名に悩んで手が止まるのアホらしいので、一旦日本語で命名して後で英語に変えてる
2021/05/10(月) 12:08:15.82ID:EOKyCo1ad
下手に英語やローマ字使うより日本のプロパティ名を使った方が分かり易いこともありますな
敢えて外人だけに意味を理解しにくくさせたいときなんかにも使えそうですな
2021/05/10(月) 12:21:43.63ID:XZUy8xNJ0
>>866
どんな場面を想定しているのか、すげぇ気になる
2021/05/10(月) 12:34:14.65ID:3Mkz5DyC0
enumの要素が日本語だとコメント要らずではある
本体がアルファベットならインテリセンスも問題ない
2021/05/10(月) 12:37:31.60ID:85dwBuQM0
国民健康保険保険者番号、という単語を変数名にするときは、だいぶ議論した上で、
kokuho_hnoになったな。
national_health_insurance_insurer_numberはとても反発が大きかった。
2021/05/10(月) 12:56:28.88ID:2MQuNC0ra
英語力がボトルネックになってるケースはむしろ少ない気がするね。
命名下手な人は日本語でも意味不明な名前付けそうな気がする
というより、だいたい命名以前の問題で既に失敗してるんだよね

普通のプログラマはそれが何をするメソッドなのか、「何者」なのかを
明確にしてからメソッドを書き始める。

命名で止まっちゃう人はそこがいい加減なんだよね。抽象化が出来てない。
2021/05/10(月) 13:00:52.85ID:y0jj8Ah00
enumって継承できない?
872デフォルトの名無しさん (エムゾネ FF8a-dxvU)
垢版 |
2021/05/10(月) 15:31:20.10ID:lCZGOQhNF
>>841
良い心掛けをお持ちですね
大事になすってください
2021/05/10(月) 15:37:52.56ID:DLVUJfkF0
>>869
プロジェクト全体で使えるならnhi_insurer_numberみたいな略語ならありだと思うけどね
2021/05/10(月) 15:58:21.88ID:l/O9+A2Na
グロサリーは作った方がいいけどNHIで辞書に載ってるから(普通何だこれと思ったらググるよね?)
それはNhiIDでいいでしょ
875デフォルトの名無しさん (エムゾネ FF8a-dxvU)
垢版 |
2021/05/10(月) 16:21:26.47ID:lCZGOQhNF
>>869
>>873
https://www.youtube.com/watch?v=qQDGX7Lj-RE
2021/05/10(月) 17:51:27.04ID:85dwBuQM0
俺も別に良いと思ったんだけど、とにかく反発がやばかった。
HNI_Insurer_No推しだった。
俺的には番号とついてるものにIDはまずい気がする。
2021/05/10(月) 17:56:24.33ID:giJ6lOgz0
kokuho_hnoだと保険者番号と被保険者番号の区別がつけにくいので
nhi_insurer_numberとnhi_numberくらいがいい気がする
kokuho_insurer_numberでも別にいいかな
2021/05/10(月) 18:24:14.99ID:id38dQYPr
変数名は単体で使ってるのか?
それともPersonクラスなどののメンバーなのかによって扱いが違う
2021/05/10(月) 18:31:34.09ID:Jv8jAyYxd
>>877
被保険者番号はhhnoという悲しいスタイルに。。
2021/05/10(月) 18:37:55.44ID:l/O9+A2Na
>>876
識別のために割り当てる符号は数字だろうがギリシャ文字だろうがID(identifier)でしょうw
ただ、保険者(業者)と被保険者を区別する必要があることに気づかなかった
この場合NhiIDはまずいね

まあスレ違い甚だしいな
2021/05/10(月) 18:42:01.34ID:giJ6lOgz0
hhnoかぁ

nhiもそうだけどhhnoやhnoみたいな普段の会話で使わない略語よりも
kokuho_hokensha_noとkokuho_hihokensha_noみたいに
普段の会話で使う日本語読みに寄せたほうが何かと良さそうだね
2021/05/10(月) 18:42:58.08ID:zy2rFAto0
番号なのにnoとか付けないってセンスなくね?
2021/05/10(月) 18:46:43.73ID:T4WFU4KFH
被保険者番号みたいなのは
コーディング規約をいじる裁量があれば日本語変数名が最強なんだよなあ
入力はちょっと大変だけど、視認性最強でドキュメントコメント不要になるし
英字表記に悩んだり表記ゆれに煩わされることもない、変な英略語覚えるのに頭使わなくて済む
2021/05/10(月) 18:46:58.67ID:id38dQYPr
みんな業務はjavaの人なんだなと
2021/05/10(月) 21:46:48.97ID:y0jj8Ah00
基底クラスでenumのステータス持ってて
継承してそのステータスの種類が増えるとき
enumが継承できないとステータスの種類が増やせなくない?
2021/05/10(月) 21:56:52.64ID:/NuMOBBIM
>>885
enumは決まった値しか取り得ない型
継承して取りうる値が増えたら、それは基底クラスにおける「決まった値のみを取る」という規約を破ってしまうことになる
規約を破らずに値を追加するには、継承せず普通にenumに追加しなければならない
2021/05/10(月) 22:00:17.01ID:y0jj8Ah00
>>886
したらステータス値はどうやって持つべきだと思ってる?
ここでenumが使えないと言うなら一体どこで使えと言うの?

まあ、const intで頑張ってるけど
2021/05/10(月) 22:38:40.75ID:8qfIqwaR0
>>871
出来ぬ、出来ぬのだ
俺も出来たら便利だよなーと思ったけどダメだった
2021/05/11(火) 00:18:16.99ID:lKBWqYLpa
率直に言ってenumを継承するって発想自体が理解不能w

>>885
enum Eを継承してFを作れるとして、Eの型のプロパティHogeを持つクラスAを継承してBを作っても、
Hogeの型をFに変えることはできないよね?

スーパークラスでステート値を増やすって発想に無理がある気がする
2021/05/11(火) 00:47:29.66ID:aDB05LmB0
>>889
継承してステータスの取りうる状態が増えるときはどーするの?
ステータスはenum使えってみんなが言うから使ったらこのザマだよ
所詮、プログラムなんか組んだことないアホの戯言だった
継承して増える可能性のある値はenumなんか使っちゃ駄目だってことだね
俺は一生使わないと思う
2021/05/11(火) 01:06:35.85ID:lKBWqYLpa
>>890
まずそういうケースがあんまりありそうもない気がするけどあるとして、

(1) ベースクラスを書く段階でサブクラスでありうる拡張を織り込んで予約しておく

(2) それが無理なら
enum BorderStyle {None, Single, Double, ExtendedStyle };

みたいにしておいて、BorderStyle == BorderStyle.ExtendedStyle
の時には別のプロパティでスタイルが決まるようにする
2021/05/11(火) 01:27:29.73ID:qWgZ839v0
> Console.WriteLine("Hello, {0}! Today is {1}, it's {2:HH:mm} now.", name, date.DayOfWeek, date);
> Console.WriteLine($"Hello, {name}! Today is {date.DayOfWeek}, it's {date:HH:mm} now.")

上の書き方の場合、文字列部分を定数で宣言できたってメリットあったと思うんだけど、$使う文字列挿入だとできないよね
使い分ければ良いだけだと思うんだけど、他に冴えたやり方あったりする?
2021/05/11(火) 01:28:06.43ID:aDB05LmB0
class作ってメンバでconst intにしようと思ったら
採番が面倒だから結局intになったわ
と思ったらそれもログ出力が面倒で
結局、状態クラス作ったわ
2021/05/11(火) 01:31:27.37ID:m6WVK0Xg0
enumは基本的に定数をならべただけだから不変のものにしか使っちゃだめ

ステータスを表すクラス作れよ
2021/05/11(火) 02:06:49.74ID:aDB05LmB0
>>894
不変よ
少なくともプログラムが実行されてからは
だって状態を表してるんだから
変更が必要になるのは継承で分岐するソースコードの修正作業時だけ

こういう形でenumが使えないなら
今後継承を行う可能性が少しでもあるならそのクラスではenumは一切使えないということ
実際使わないほうがいいと思う

赤青ランプを継承して
赤青黃ランプを作ったときに
状態赤青がenumで作られてたらゴミ箱にブチ込むしか道はない
2021/05/11(火) 02:09:51.01ID:lKBWqYLpa
挿入文字列はコンパイル時に解析される(実行時に解析されるわけじゃない)と思うので(知らんけど)
stringの変数に挿入文字列自体を入れるとかできないと思うけど、そもそも何でそんなことがしたいの?

多言語化のために文字列リソースにしておきたいという動機なら理解できるけど
変数に入れたい動機が思いつかない
2021/05/11(火) 02:10:54.04ID:aDB05LmB0
>>896
ログ出力したいんじゃん?
2021/05/11(火) 02:12:53.21ID:1Lpm83JY0
>>895
enumの定義をclassの外に出して独立させれば
2021/05/11(火) 02:13:54.09ID:aDB05LmB0
>>898
何の解決にもなんなくね?
2021/05/11(火) 02:16:57.22ID:aDB05LmB0
>>898
赤青黄と赤青緑に継承で分岐したとき
どんなenum定義するって言ってる?
2021/05/11(火) 02:38:14.36ID:1Lpm83JY0
>>900
派生元も派生先も関係なく1つのenumで定義すればって意味で書いた
使う時はプロパティやメソッドでそのクラスで利用可能な値かをチェック
2021/05/11(火) 02:41:03.08ID:lKBWqYLpa
だからそもそも根本的に考え方がおかしいと思うよw
集合論的に考えてみて

例えば、

自然数⊂整数

ってことは明らかに「整数 is 自然数」ではないでしょ。
自然数を継承して整数を作る、とう発想がそもそもおかしい。
2021/05/11(火) 03:32:52.71ID:/5H26xT50
>>895
赤青ランプを継承して赤青黄ランプを作るってのがそもそも筋が悪いだろう
N色ランプを作って赤青でも虹色でも好きに作ればいい
2021/05/11(火) 07:38:19.05ID:aDB05LmB0
は?設計書にそう書いてあって
矛盾なく動くのに何がおかしいんだよ
頭いかれてんのか
いいからこの場合どういうenumになるのかさっさと書けよクズ
2021/05/11(火) 08:46:28.86ID:8Zm8z2p2p
普通そう言う場合enum使わんしょ
継承後色がどうなるか確定的じゃないし
stateを普通にintで管理して、それにRGB入りの配列で色を割り当てたら?
2021/05/11(火) 08:55:42.36ID:aDB05LmB0
>>905
それだとプログラムの拡張の際に取りうる値が増える(実行時ではない。ソース修正時)可能性がある項目は全部enum使えないじゃん

まあ、実際使えないけど
2021/05/11(火) 09:52:12.74ID:FCSidwoba
>>904
実装上の都合で赤青ランプに後付けで黄色を取り付けたのだから、色を表す定数として赤青のenumとは別に黄色の定数を定義することになるのは自然だろう。
それをあたかも三色同格のランプだと見せかけてるんだから、定数についても見かけ上同列に扱うためのenumを新たに定義しなければならないのは仕方ない。設計がいびつなのだから、内部処理的にもいびつになる。
2021/05/11(火) 10:10:24.00ID:aDB05LmB0
>>907
何言ってるかわかってる?
基底に20個ぐらいステータスあってさらに増え続けてるとき
継承した分だけenumに同じステータスを追加しまくれっていってんだよ
継承10も20もやったら大変だぞ
もう実際はハードごと20種類以上追加しないといけなくてやってられないから
俺はenumはゴミと切り捨てたけどね
2021/05/11(火) 10:33:16.06ID:aLadY06bM
>>908
だから追加できたところでそのステータスを何に使うんだよ
増やしたところで基底型では扱えない未知の値なんだから継承の意味がないだろ
2021/05/11(火) 10:45:31.24ID:fJhAJw720
♪燃〜〜えろよ燃えろ〜〜よ〜〜
2021/05/11(火) 11:02:46.92ID:aDB05LmB0
>>909
は?
お前、状態遷移組んだこと無さそうだからいいやw
2021/05/11(火) 11:03:10.18ID:8BKOP9bia
>>908
まだ言っとるんだねw
だから根本的に考え方が間違ってるんだってw

特化/汎化って言い方をすると思うけど、継承っていうのは
汎用的なものを特定用途に「特化」するものなんだってw

だから>>902に書いた通り汎用性が小さい自然数を継承して整数にする、って考えは根本的におかしいし、
汎用性が小さい2ステートを継承して3ステートの物にするというのも間違ってる

考え方が逆だ。
多ステートの特殊形が3ステートで、3ステートの特殊形が赤青黄でしょ。
赤青のロジックの一部を赤青黄で使いまわしたいなら継承以外の方法で考えましょう。

例えば、RGB.RをRB.Rに変換する変換関数は書けるんだから、
Color ToColor(RGB rgb){ ... }
というメソッドは、中で
Color ToColor{RB rb){ ...}
と使いまわすことはできる
2021/05/11(火) 11:06:54.31ID:aDB05LmB0
>>912
赤青黄はあくまで例であって実際にはハードの差分管理してんだよ
だから全部定義し直したらものすごい量になっちゃうの
2021/05/11(火) 11:11:17.08ID:aDB05LmB0
はっきり言うけど
べき論は結構だけど
enum型がこの仕様のままなら
なんにも使えない
もしくは使わないほうがいいと思う俺は
2021/05/11(火) 11:14:26.45ID:aDB05LmB0
じゃあ、いっそenumって定義をやめよう
state型が必要です

これでおk?

おそらくこれができたら
enumなんか誰も使わない
それだけの話
916デフォルトの名無しさん (エムゾネ FF8a-dxvU)
垢版 |
2021/05/11(火) 11:14:32.61ID:FWZS8iTBF
>enumはゴミ

知ってた
2021/05/11(火) 11:18:15.50ID:m6WVK0Xg0
>>895
不変っていうのは、実行時に変わらないって意味じゃないぞ
修正/機能追加でも変わらないってことだ
結論としては自分で書いてる通り
>今後継承を行う可能性が少しでもあるならそのクラスではenumは一切使えない
だよ。Enum継承したいってことはつまり変更したいってことだから

Color.RedやColor.BlueはEnumじゃないだろ
まあSystem.Drawing.Colorは構造体で継承できなかった気がするけど
そんな感じで作っとけ
2021/05/11(火) 12:02:27.73ID:N41oKzlma
>>915
話が通じない人だなw
問題はenumにあるんじゃない。
>>902にはどこにもenumなんか出てきてないでしょw

汎化するのに継承を使うのがおかしい。
継承は特化するのに使うんだってw
2021/05/11(火) 12:55:03.04ID:9XfnnIxq0
どれの話をしてるのかわからんけど困ったことない

Enumでやる
virtual List<enum> Lamps => 赤、青を返す
override List<enum> Lamps => base.Lampsと黄を返す

Flagでやる
virtual Color Lamp => Color.赤 | Color.青
override Color Lamp => base.Lamp | Color.黄

Flag側で継承
[flag]
enum Color{
赤=1,
青=2,
黄=4,
Hoge=赤 | 青,
Hoge2=Hoge | 黄
}
2021/05/11(火) 13:34:53.46ID:aDB05LmB0
>>917
そんなの未来永劫保証できないじゃん
enum作った人本当にバカなんだね
使えないもん作ってろよって感じ
2021/05/11(火) 13:38:39.20ID:aDB05LmB0
>>919
基底に黒とグレーを追加
2021/05/11(火) 14:03:01.12ID:9XfnnIxq0
>>921
別に俺が作ってる訳じゃないからそんなこと言われても知らんがな
enumでやりたくないならそれでいいと思うし好きにやりなよ
2021/05/11(火) 14:27:53.86ID:7X7kMfyca
>>919
enumの利点はコンパイル時に名前の集合を型として定義できる、
名前の集合が確定していて、だからインテリセンスが使えたり
集合に含まれないはずの名前が使われている間違いをコンパイル時に検出できることなので
それは代用にならんでしょ。

質問している人の問題はたぶん継承に固執してること。

部分集合を再利用して上位集合を定義したいって問題意識は分からんでもないけど、
emumなんてただの名前の集合なんだからそういう場合はコピペ継承するのが多分正解。
2021/05/11(火) 14:31:08.99ID:pmLjbtQdD
適材適所
2021/05/11(火) 14:40:19.26ID:/TD/rkCHM
C#や諸々の言語はそもそも、継承の仕様が出来損ないなんだよね
Java 16みたいにSealed Classを定義できるなら、まだしもねぇ

どんなクラスでも継承できます、なんて言われてもね
全てのサブクラスの面倒を見るなんて、事実上不可能だろ

だからサブクラスを限定する仕組みが必要なのだが…
C#はまだまだ、遅れてるね
2021/05/11(火) 14:45:04.15ID:9XfnnIxq0
>>923
ああ、そういう事ね
Nullとか空とかのEnumを用意しとくべきかみたいな話と似てるな
2021/05/11(火) 15:00:11.95ID:1Lpm83JY0
>>925
Javaのことは知らんけど
C#のsealed classでは駄目なの
2021/05/11(火) 15:07:01.36ID:9XfnnIxq0
自分ならカスタム属性と拡張メソッド作って、集合.Hoge.Colors()で一覧を取れるようにするかな
まあケースバイケース

enum 集合{
[AddColor(Color.赤, Color.青)]
Hoge,
[InheriteColor(集合.Hoge)]
[AddColor(Color.黄)]
Hoge2
}
2021/05/11(火) 15:14:49.86ID:Fjpe2RX80
>>927
そっちじゃなくて継承できる型を限定する機能だね
ShapeインターフェイスをRectangleクラスとCircleクラスのみ実装可能にする
他の奴がTriangleクラスを作ってShapeを実装するのは認めない
2021/05/11(火) 15:43:37.19ID:1Lpm83JY0
>>929
なるほどC#に限定する機能はないね
コンストラクタのアクセス権をinternalにしてアセンブリを分ければ実用上はそんなに困らなそうだけど
2021/05/11(火) 16:04:08.87ID:gVDvfxdk0
>>919
>override List<enum> Lamps => base.Lampsと黄を返す

これはEnumでやってるんじゃなくListでやってるだけのような・・
取りうる状態の範囲をEnumで表現してないしコンパイル時のチェックも無理だよね

>override Color Lamp => base.Lamp | Color.黄

こっちも型としてはColorになるので既存のColor定義が赤と青だけなら
全く別のEnumを新しく定義することか、既存の定義自体を変更して黄を足すかになるので
既存のコードを維持したまま新しいコードを追加することはできないよね?

Enumを使うべきユースケースじゃないからできなくて当たり前なんだけどさ
2021/05/11(火) 16:18:03.82ID:qWgZ839v0
>>896
文字列の雛形をDBに持たせて、パラメータ部分を置換して出力するみたいなことやってたのよ
『置換して出力』部分を$使う挿入文字列で置き換えられたらいいなって夢想した

pythonの似たような機能でキーワード引数による指定が出来るから、似たようなこと出来ないかなって
> print('{first} and {second}'.format(first=a, second=b))

string.format使えばいいだけなんだけどね
2021/05/11(火) 20:06:26.01ID:7D4cBYXWM
>>932のやりたいことが挿入文字列を共通化したいってことならおとなしくメソッド化して
string ToHelloText(string name, DateTime date) => $"Hello, {name}! Today is {date.DayOfWeek}, it's {date:HH:mm} now.";

Console.WriteLine(ToHelloText(name, date));
みたいな使い方するほうがいいんじゃ
レス数が900を超えています。1000を超えると表示できなくなるよ。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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