◎正当な理由による書き込みの削除について: 生島英之とみられる方へ:
C#, C♯, C#相談室 Part98
動画、画像抽出 ||
この掲示板へ
類似スレ
掲示板一覧 人気スレ 動画人気順
このスレへの固定リンク: http://5chb.net/r/tech/1719656321/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
■Visual Studio 2022 Community(無償の統合開発環境)等はこちら
http://www.visualstudio.com/downloads/ ■コードを貼る場合はこちら
http://ideone.com/ ■前スレ
C#, C♯, C#相談室 Part97
http://2chb.net/r/tech/1671585518/ ■次スレは
>>970が建てる事。
建てられない場合は他を指定する事。
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
プロパティって、別クラスからprivateなフィールドにアクセスするためのメソッドという理解であってます?
自分のクラス内で完結するのであれば直接フィールドを操作すればいいですよね?
基本的にはそうだけどちょっとした小細工を仕込みたい場合とかにprivateプロパティという選択肢もなくはない
遅延初期化するものとかね(この用途では今はLazy<T>を使うけど)
フィールドのようにアクセス可能なクラスのインターフェースというかAPIを定義するのがプロパティ
中身は他のメソッド呼び出しの場合もあれば他のプロパティを元にした計算だけ行う場合もある
クラスのユーザーがフィールドにアクセスする必要がなく
継承して拡張する際にもフィールドにアクセスする必要がなく
クラス内からのフィールドアクセス時にも常にチェックすべき事前条件がなければ
privateフィールドを単純にラップするプロパティは基本的に不要
ありがとうございます
もう一点聞きたいんですが、プロパティ自体はアンチパターンではないですよね?
ある本にセッターを使うなら別にメソッド用意しろと書いてありました
理由はクラス外からメンバを操作してはいけないのと、値チェックができなくなるからと
これらは別にプロパティでもできるんで(そもそもプロパティはメソッド)、間違ってますよね?
>>8 >ある本にセッターを使うなら別にメソッド用意しろと書いてありました
状況による
publicなセッターのほうが望ましいケースが稀なのは確か
ぞもそもそれc#の本なのか?
なぜタイトルをぼかす
あれ?.NET CoreだとC++/CLIの1次元array使えない?
実行ファイルのあるフォルダを取得しようとぐぐってためしたらカレントディレクトリを返してくるんだが・・なんか変わった?
取得するコード書いてくれにゃ答えられんよ
あと.NET 5以降なのか.NET Frameworkなのかとか
テキトーな疑問だけ投げて二度と来ない単発荒らしか
>>14は
>>16 寂しがり屋なの?
来てほしかったの?
反応がない=同じ現象に出くわした人がここにはいない、ってことだからここにきても意味ないじゃん
もう返事もらってんだよ、それくらい理解できないの?なさけない
いつからか
こんな限界集落のマ板なんかに変なの居着いた
コンソールアプリで画面を上側へスクロールしたときに文字が表示されません
Console.BufferHeightで行数を増やしているのに、何故か反映されない
Win10では正常に表示されたのに、Win11では表示されない
ググっても出ない中々難しめの質問AIにしたらサンプルコードまで答えてくれやがった
正常動作するかは知らんが
仕様諸々精査してできるかどうかの判断を自動でやってくれるのは楽だわ
回答を検証できる質問でないとハマるよ
それっぽい回答来たから鵜呑みにしてたけど後からハルシネーションだったとわかってガックリ来た
付き合い方を考えないと
vscodeで作成してます。.NETではなく.NET Framework用でコンパイルしたいのですがcsprojをいじればいいんですか?イマイチぐぐっても分かりませんでした…
ターゲットフレームワークを変更する
おそらくNugetの依存関係が壊滅するのでライブラリのバージョン等を頑張って修正
まあ、そのレベルだと素直にVSでプロジェクト作り直した方が確実に早い
>>29 依存関係とか変更とかまったく分からないのでnet48でプロジェクトを作りました
しかしc#が勝手に最新で作り出すのでなんとかしないと…
implicitusingを無効にしたらいけました!
coreCLRの開始イベント使ってねーぞみたいな注意が出ますがとりあえず無視します
だからそんなこともわからんレベルなら
普通のVisualStudio IDE使ってテンプレートから作ってもらえ
.NET Core系用と.NET Framework系用でテンプレート別々にあるぞ
.NET Frameworkで作るのならVS Codeにこだわる意味が分からんな
初心者ならプロジェクト作成以外もVisual Studio使った方が楽じゃないか
初心者以外でもvisual studioでいいのでは?
VS Codeって何のためにあるの?
>>35 自由度の高い拡張機能が作成可能とか?
メリットいかせずに「他人と違ったことする俺すげぇ」ってバカのほうが多い気はする
そして拗れてcsc.exeへ。勉強効率も悪くろくなもの作れなくなるバカの末路
ちなみにどっちも初心者スレで「やり方わかりません教えて」みたいな質問者見たことある
VS CodeはVSがインストール出来ない環境で使うんだよ
maui、xamlとかモリモリ書かないならvscodeで.netは普通にいけると思う。
他のフレワークだとVSCode前提みたいなところがあるから、基本的にコマンド一発でテンプレートやコンフィグ全生成してくれるのが殆どなんだよなー
自分はC#使うのは2〜3割くらいに減ってるから、一旦VSのテンプレートで生成した後にVSCode持ってって作業してる。
別にVSのまま作業しても良いんだけど、他がずっとVSCode使ってるからそのまま殆どなんとなく。
ビルドの設定追い込む時とかはVSに戻って作業する
.NET8に移行しようとしてSystem.Drawing.Commonをnugetで取得して、参照のパッケージのところにもちゃんと入ってるのにビルドするとアセンブリ追加しろやってエラーが出ます
System.Drawing.Commonに限った話じゃないとは思うんですが、nugetしてるはずなのに使えないケースってあります?なんか対処法とかありますかね
nugetのフォルダのsystem.drawing.common.dllを直接追加してみるとエラーが出るし……
>>40 ターゲットOSをWindowsにしなきゃだめになったんじゃなかったっけか
>>41-42 ありがとうございます。解決しました。
プロジェクトじゃなくて、プロジェクトが参照してるライブラリが古くて画像周りがおかしかったことが原因でした……
いやーてっきりプロジェクトに問題があるものだとばかり。
お手数をおかけして申し訳ありませんでした。
string のなかに " いれたいんだができるん?
string x=""+"aaaa"+""
>>44 こういうこと?
string x = "\"+\"aaaa\"+\"";
それでできそうかも。試してみる。
プロセス起動させるとき、引数の変数にパス入れるけどパスの中にスペースがあると
だめなんでそれの回避として " が必要。
だめっぽいな。
aaaaはstring の変数でもってきてる。
string s = "aaaa";
string x = $"\"{s}\"";
System::Diagnostics::Process::Startとかだろ
"\"" + filePath + "\""
Windows君はパスに空白含んでたらバカになるからダブルクォートしないといけないからね
>>44 string x = """aaaa""";
これで
>>47を読んで無かったわww
それなら
>>51でいいか
string x = $"\"{s}\"";
これ採用 TNX!
もうちょっとあれこれ繋げるもんがあるならともかく
たったそれだけにString.Format使う意味ある?
2回以上+で結合すると無駄なアロケートとコピーが発生する
ループしないなら気にする必要ないけど、+に拘るメリットも特にないな
なんかふと気になってILSpyしてみたら
>>55程度だと+連結に置き換えられてて、もう一つ変数増やしたらDefaultInterpolatedStringHandler処理になってたわ
>>58 C#10から実装が変わってかなり高速化したらしい
https://ufcpp.net/study/csharp/sp_attribute.html 属性付加について質問です
上リンクにバブルソートの途中経過を出力する例がありますが、
/// <summary>
/// SHOW_INTERMEDIATE というシンボルが定義されているときのみ
/// 配列の内容をコンソールに表示する。
/// </summary>
[Conditional("SHOW_INTERMEDIATE")]
がよくわかりません。
このシンボルの定義はどこで誰がするのでしょう?
途中経過を見るかどうかならbool型を渡すだけでできると思うのですが属性を使うメリットは何でしょう?
https://hatsune.hatenablog.jp/entry/2021/12/20/151144 の条件つきコンパイルシンボルに
「SHOW_INTERMEDIATE」も指定して実行したときだけ
IntermediateOutput(array);
が呼ばれる
ソースコードをいじらすともプロジェクト設定だけで動作を切り替えられる
https://ufcpp.net/study/csharp/sp_attribute.html の例だけなら本来ならConditional属性より#ifで動作を切り替えるほうが自然かもしれないけど、メソッドに属性をつけることで「コンパイル時の」動作を切り替えることもできる
#if~#endifだけでこと足りるけど、使いすぎるとコードが見にくくなる。
Conditional属性ならメソッドを呼び出す部分に何も増えないからすっきり。
1年ぶりくらいにC#開発やったらPrismのライセンスが変更されててビックリした
条件があるとはいえ商用で使っていくのは厳しいからどうしようか迷ってる
とりあえずv9.0未満ならMITライセンスのままだから使えないこともないんだけど、このまま使うのもなぁ…
c#がニッチになればなるほど有料ライブラリの存在感が増してきて足元見られてる感はある
MAUIとか、何かググるとsyncfusionのボッタクリライブラリの広告ばっか出てきてめちゃくちゃげんなりする
どうしてこうなった・・・
>>66 Visual Studio for macの廃止で
MAUI の無料の開発環境はゴミすぎる VScode + C# Dev Kit しかなくなったからな。
もうお金持ちしか使っていない。
MAUI アプリは市場的に iOS 抜きでは考えられず、そうなると「mac上での開発」が大前提なのに
Visual Studio for macが廃止になったからな。
Expressも更新しないしドケチ弊社はvscodeですよ
結局あと数年は使うデスクトップアプリなら何使えばいいの
結局のところMAUIはAdobe FlashやSilverlightの失敗と同じ道を歩んでしまった。
スマホアプリとデスクトップアプリの統合なんてできるわけないのに。
アップルのMac Catalystも壮大にコケただろ。
いやいや、スマホとデスクトップのフレームワーク統合はReact NativeやFlutterで成功してるよ
MAUIが失敗したのは単にそれらの競合を上回るだけの魅力がなかったから
そもそも当のMS自身がMAUIではなくReact Nativeを主力として採用しているわけで、ドッグフーディングすらまともにやられてない冗談みたいなゴミよ
魅力が無いという消極的な話じゃなくバグがありすぎるんだよ
MAUI使うならMAUI Blazor一択
Flutterで作られたデスクトップアプリってあるの?ないこたないんだろうけど、聞いたことがない
ラムダ式だらけで何やってるか分からん
名前付きならその名前でなんとなくやってる事が推測出来るのに
具体的にどんなコード?
触れたことないからどんなもんか気になる
ラムダだとか無名なんたらって引数には名前書かせたりするのがイマイチだよな
全部匿名で書かせろや
最近のC#だと使わない変数/引数は「_」で書けるけどこれのことかな
破棄は呼び出し側だし、_だけで変数名にできるけど、やる意味無いしなぁ
名前無いと中身コメント書かれて無いと何やってるかますます分からないだろ
おまえら自分の事しか考えて無いのかよ
実例出さないとコードを書いたやつの問題なのか読んでるやつの問題なのかわからないな
普通にどっちもありえる
OpenAIが複雑な推論能力をもつAIモデル「OpenAI o1」と「OpenAI o1-mini」を発表、プログラミングや数学で高い能力を発揮
https://gigazine.net/news/20240913-openai-o1/ 宣言してない変数が出てきたらそれに引数割り当てろとかそんなことを言ってるのかな?
new Action<A>(=> Console.WriteLine( s ) );
か
new Action<A>(Console.WriteLine( s ) );
見たいなことなんじゃないかと
Unityって.NETに移植される予定あるの?
ここ5年ほどは.NETばかりが進化してUnityは時止まってる感あるけど
あのースレ違いとは重々承知の上なんですが、ASP.NETの求人ってどんな感じですかね
これまでずーっとC#のデスクトップアプリとかまぁローカルなシステム作りばかりやってきたんですが、いくらなんでも未来がないからウェブへの転職狙ってるんですよね
でキャリア活かそうとASPいじりはじめたんですが今はどこもかしこもjavascriptみたいなイメージで
業務でASP使ってるとかASPで転職活動したとかそういう人いたら話聞かせてほしいんです
どう考えても普通にJavaScriptやる方がいい。
C#履修者ならTypeScript自体の習得は爆速だよ、本気でやれば多分一週間もかからない。何しろ設計者が同じなので書き味に違和感が無くなるのはすぐのはず
問題はReact、Vue、Nextなどフレームワークやライブラリのスキルだけど、正直ここは常にコロコロ変わって勉強が必要な分野なので途中参加でもあまりハンデはないと思う
転職しても、JavaやC#のお硬い言語のキャリアは重宝されるから決して無駄にはならないはず
ASP.NETやBlazorの需要は限定的だし先行き不透明過ぎる
自分も似たようなことしたので頑張って
業務でASPNETCoreバリバリ使ってはいるけど
ASPNET単体の知見が転職活動で役に立つとは思えない
というか、C#ができてHTML/CSS/JavaScriptが読み書きできる人なら普通に無勉強/経験なしでもASPNETで開発できちゃうからセールスポイントにならないのよね
うちんとこはReactみたいなモダン()なフレームワークは使ってないけど、それでもJS/TSの知識は必須
愚直にWeb系の勉強をするのが先かなと思うよ
>>102 >>103 参考になりました。とりあえずHTML/CSS/JavaScript(TypeScript)辺りちゃんとやろうかと思います
ただなぁ……自習してました!じゃなんもアピールにならない気もするんだよなぁ……結局実務経験0だし
プログラミングスクールでも受講してある程度やったと保証になるものを取りに行こうかな
むしろプログラミングスクールの経験のほうが誰もまともに受け取らないよ
自走力がないやつと思われる
素人じゃないだろうしわざわざナメられる道を通るのはオススメしない
そもそもSVNの現場ばかりでgithubの使い方よくわからないレベルだわ
というか世の中10年前にはSVNなんてオワコン言われてたってのが信じられねぇ
個人で使う限りじゃ4つくらいしかコマンド使わんからなぁ
C#13(.net 9)でfieldキーワードが使えるようになるって聞いたのですが本当ですか?
VisualStudioでプレビュー版の.net9入れてみたけど使えないみたいでした
それともプレビュー版だから使えないのでしょうか?
え、一番期待してたのに…
c#でググれの人は何て言ってるんだろう
ありがとうございます
確かに記載が無いので残念ですが今回は見送りっぽいですね、、、
https://github.com/ufcpp-live/UfcppLiveAgenda/issues/94 >たぶんもう C# 13 で入れるもの確定。参考: Language Feature Status
>今入ってないものは入らない。
>field キーワードは「C# 13 GA のタイミングで、 preview で取り込み」みたいな話を
https://aka.ms/dotnet-discord で見た。
だそうです
うーん、微妙か
まぁ.net 10では入るだろうし来年に期待
C#追っかけなくなって知識がdotnet4.5辺りでとまっている…
それ以降はrecordとかしかしらん
メモ帳や日記帳アプリみたいな軽いアプリで、ソースコード公開されてて
コードが初心者にも参考になるようなサイトあるでしょうか?
こんなのじゃあかんのん?
C#で自分だけのメモ帳を作成してみよう!手順・方法を徹底解説します
https://www.sejuku.net/blog/102177 ググったら一分も掛からないで出たけど
>>122 サンクスです、丁寧に書いてあってわかりやすいのですが
設定項目を変更した時の設定反映のタイミングとか
form2からform1にデータ持っていく場合とか
やり直し機能とか
うまい人はどうやって全体まとめてるのかなって
必要な部分だけ他人のコードを読むか自分でひたすら考えて実装してトライアンドエラー
どちらも地力が格段に上がるけど中級者は避けがち
それメモ帳というかエディタで大変な箇所を全部端折った記事だから
適当な公開されてるソース読んだ方がいいね
その適当なのほしいって事やろな
ここの連中は冷たいから教えないんだよね
メモ帳とかの作者さんでソース公開されてる人もC++が多かったり
長大なテキストファイルの先頭から文字数を数えたり
一行の長さを測定して画面右端の折返し位置を決定したり
そういうのって現実的に可能なのか?
普通は穴あきバッファを使う
EZ/VZはlessに編集機能を付けるってユニークな設計をしている
設計自体を知りたいなら 「The Craft of Text Editing: Emacs for the Modern World」が参考になるかと
FINALはdumpすると、MIFESとREDの悪口が書いてある:-p
「穴あきバッファ」なんて初見なんだけどもしかして誤訳じゃない?
エディタのバッファ管理用のデータ構造は効率的な編集をサポートするためで
文字数カウントや行の折り返しの話はどういうデータ構造を使うかとはほとんど関係ないよね
今はGap Bufferもあまり主流じゃなくてPiece TableかRopeが使われることが多くなってる
興味があれば↓この辺読んでみるといい
TypeScriptだしC++に比べるとわかりやすいはず
https://code.visualstudio.com/blogs/2018/03/23/text-buffer-reimplementation この辺の話はエディタのコアな部分ではあるけど
>>123の知りたいこととはほぼ関係ない
なにかの文書を画面に表示したい
← 表示したい部分が何行目に当たるか計算する
← 一行に含まれる文字数を知りたい
← プロポーショナルフォントのときはどうするん?
← 行の長さを測定する関数使え
← 一文字ずつ足したり引いたりしながら測定を繰り返す
← 全部の行についてこれやんなきゃかよ?
← やってられない
>>135 >← 表示したい部分が何行目に当たるか計算する
テキストファイルなら頭から読み込むしかなく改行でカウントアップするだけ
>← 一行に含まれる文字数を知りたい
>← プロポーショナルフォントのときはどうするん?
文字数によって折り返し位置が決まるか
表示幅によって折り返し位置が決まるかのどちらか
両方のルールを同時に適用するというのは一般的ではない
プロポーショナルフォントが関係してくるのは後者の場合のみ
表示幅で折り返す場合は指定したRectangleにフィットするよう
よろしくやってくれる表OS提供のAPIがあるので基本的にはそれを使う
APIの内部的では各文字の表示幅を足し算してるが
とりあえずは画面表示部分だけを計算すればいいので
思ってるほど大した計算量ではない
>← やってられない
んなことたぁない
そもそも公開されてるソースがC++多いからなんだというのか
矢印 Unicode(ユニコード)一覧 文字 0g0.org
https://0g0.org/topic/arrows/ 個人レベルで作るなら別にベストな方法じゃなくても良い
とりあえず作ってみたらいい
そして徐々にブラッシュアップしていけばいい
どうせTextBoxかRichTextBox使うから
いちいち行の文字数数えて改行とかという発想がでてこなかったわ
毒されてるんだろうか
質問者の作りたい物に行番号やカーソル位置座標とか要らなさそうだから
テキストボックスで十分だと思う
行列番号、文字数、ファイルサイズ、ドラッグ移動、カラー絵文字、正規表現検索&置換、折り返し
これぐらい欲しい
まじかテキストボックスがカラー絵文字に対応したのか
週末試してみるわありがと
win11で作ったformアプリがwin10で盛大にズレてて頭抱えてる
>>152 何をもってOSに起因する症状だと判断したの?
OSバージョン毎のフレームサイズの差異とか気にもせずに処理でも書いたか?
OS関係なく単にディスプレイのスケーリングの違いでは
フォントとか配置とかやり直しはMacOSのあるあるだと思ってた
ライブラリを使用するために下みたいなコード書いた
ライブラリ内でIHoge.Method();の機能を上書きしたいのとHogeで設定されるさまざまな機能を使いたいがためにIHogeを実装したHogeクラスを継承してMethod();を隠蔽、そのうえでライブラリから呼び出されるようにIHogeをさらに継承?実装させてる
ちょっと無理矢理感強いけどこれはアリですか?
ライブラリの中
~
IHOGE.Method();
~
public interface IHoge
{
public void Method();
}
public class Hoge : IHoge
{
public void Method()
{
元の処理
}
}
自前で作ったクラス
public class NewHage : Hoge,IHoge
{
public new void Method()
{
上書き処理←やりたいこと
}
}
>>158 Hoge.Methodにvirtual
NewHage.Methodでoverride
>>158 それがやりたいことなら別にいいんじゃね?
Hogeの他のメソッドがMethod()を呼ぶとか
Method()がHogeの他のメソッドを呼ぶとかの関係が出てくると
newを使わない場合に比べるとバグるリスクが高くなるような気はする
インターフェース+コンポジションにしておけばバグるリスクは低くなる
その代わりに多少書く手間がかかる
>>160 Hogeはライブラリの中の実装だからvirtualにできないのつらみ
>>161 なるほどありがとう
てかVisualStudioが教えてくれた
緑波線でnewしてくださいって
public new 戻り値の型 メソッド名
ML.NETを試してみたら思いの外お手軽で面白いな
アプリにさくっと組み込めそうだ
.NET MAUIで試したことあるけどWindowsはいけたがAndroidではトレーニングでエラーはいた記憶
>>159 サンクスです、これはすごいな
解説がおおくてわかりやすい
これのソースコードがダウンロードできたらよかったのに
CookieってSystem.Text.Jsonでシリアライズ・デシリアラズするとDomainKey変わっちゃってSet-Cookieで同じ名前のクッキー来ても違う奴判定されてダブるんだな
正確に言うと先頭ドット有りだと変わらないのと、BinaryFormatterやNewtonsoft.Jsonで非パブリックフィールド含む全フィールドをそっくりそのままストア・ロードさせれば変わらないんだけど
ZipPlaってファイル管理ソフトのソース持ってる人いる?
居たらアップして欲しい
>>171 ぐぐったらGitHubにForkされたのがあるようだぞ
オリジナルからどの程度手が入ってるか知らんけど
>>172 自分もそれは見つけたんだけど、何を変えてるのかもハッキリしないんですよね
なのでオリジナル持ってる人が居たらと思いまして
WinFormsってWindowのクラスネーム決められないの?
Win32のFindWindowのClassNameで探させたいのだけど
protectedなCreateParamsプロパティをオーバーライドしてClassNameを書き換えることはできる
独自名ならとりあえずRegisterClassは必要だけどそれだけで済むかどうかは知らん
C#側のプロパティは書き換えられても実際の内部の値はそういうことしないと無理そうか
RegisterClassExしてやろうとしたことあるけど
CreateParamsでRegisterしたClassName指定してもエラーになって
それで良く分からんまま放棄したな昔
人間が垂れ流した知識を混ぜるだけのAIが、人間が知らないことを教えられるわけないだろw
世界中のどこかで語られたかもしれない事実をそこらの人間がすべて知ってると思うのがおかしい気がする
つーかさWin32APIのCreateWindowで作ったウィンドウをC#にAttachする程度基本的な仕組みぐらいあるやろ
あるやろ…
CSharp初心者が学習始めるなら何からがおすすめ?
多分IIS?使ったウェブアプリになるんだけども
Javaでのアプリ開発経験はあり
SetWindowLong
SetWindowLongEx
科学 + 5ch
【AI】AIはわずか2時間の対話で人間の性格をコピーできる [すらいむ★]
http://2chb.net/r/scienceplus/1733576027/ コメントに面白いことが書かれている
盲目的にvar使うなとは思うけど、一切使うなはないなぁ
まあマイクロソフトのサンプルにも使ってる例あるしな
varで参照型を扱うとnullableになるのはどうにかしてほしい
推論型なんだし、必要に応じて使えばいいんじゃね?
objectならともかく
varが絶対必要なのって匿名型使うときだけだから、必要に応じて使う、だとvarはほとんど用無しになっちゃう
戦争に参加するつもりはないが仮にvar使うんなら必要に応じてじゃなく基本varにしないと
c#は基本varでいいよね
多分大体のc#er?はvarじゃないときにだけ理由を気にするんじゃないかな
初期に頭のいい人は一番先に varに飛び移った
その後みんな気が付いて移行した
今でも使わないのはご老人
インターフェース分離の原則が分からない
「必要のない振る舞いを実装しない」のは適切だと思うんだけど、ポリモーフィズムとの組み合わせが悪いように思う
interface IBird { string Name { get; } }
interface IFlyable { void Fly(); }
// ペンギンは飛べないので IFlyableを実装しない
class Pengin : IBird { ... }
class Eagle : IBird, IFlyable { ... }
のようにした場合に、プログラムが List<IBird> birds のような形でデータを持つと、「飛べる鳥がいる」という情報が型から消える
foreach (IBird bird in birds) {
Console.write(bird.Name);
if (bird is IFlyable flyable) {
flyable.Fly();
}
}
「飛べる鳥なら飛ばす」ようにしたい場合、インターフェースを分離する場合だと上記のように is でキャストするしか無さそう?
IBirdで扱っているのに「インスタンスは IFlyable である可能性がある」という情報に依存してるのに少し違和感があって、より綺麗な解決策があれば知りたい
そこを別々のインターフェースとして分離するのが間違ってるだでは
飛べる飛べないも”鳥”の一要素でしょ
>>206 Nullableな IFrayable? をプロパティとして持たせて、飛ぶ鳥の場合はthisを返すようにするということ?
そこだけのインターフェース化に拘るなって言ってんだよ
鳥とペンギンだと近すぎて例えとして微妙だった
例えば「動物のリスト」のようなデータを持ち、動物には鳥のように飛べるクラス (Flyメソッドを持つ) と、トラやライオンのように走るクラス (Runメソッドを持つ) があるといった場合
動物の一覧を持つには List<IAnimal> のような型を使うと思うけど、これは合ってるよね?
その上で動物によって違うアクションを行わせたいとする
IAnimal側に CanFly のようなメソッドを追加していくと、例えばサルのように「道具を使う動物」が後から追加された場合、IAnimalにメソッド追加が必要になり、それはBirdなどの各クラスにも影響する
Birdクラスは「道具を使う」なんてことは知らないのに、インターフェースのために CanUseTool のようなメソッドを後から追加するのは違う気がする
そうするとやっぱインターフェース分離の形になりそうで、そうなると利用側で is でキャストするのが落としどころなのかと
鳥以外にも飛ぶ(正確には滑空だが滞空することに変わりはない)動物は居るし
鳥だって地面をRunするヤツは居る
鳥にも、猿程でなくてもその辺に落ちてる物を道具的に使うヤツも居る
お前の例題がそもそもめちゃくちゃなんだよ
ここの住人はC#を使っていてSOLID原則に悩まされたことなど無いのだろうか
>>203 ある動物が飛べることと、鳥であることは独立なんだから、
「飛べる鳥がいる」という情報はなくても仕方なくない?
統計的な相関関係はあるかもしれないが、包含関係でないなら仕方ない。
飛べる他の動物を無視するのなら、IBirdを継承したインタフェースでIFlyableBirdを作ればいいのでは?
ISP自体はC#でよく出てくる問題じゃないの?
これなんかまさにそう
https://dev.to/fabriziobagala/interface-segregation-principle-452m だけどこういった解説はISP単体の説明になっていて、泳ぐ、走るといった能力の異なるものを Animal として抽象化する方法を教えてくれない
綺麗な方法でなくても「C#ではこうすることが多い」のようなプラクティスがあれば知りたかったんだけど、そういうのは無さそうなんですかね
実装を伴わない抽象化の話ってなんの身にもならないからやめなさい
それとインターネットサービスプロバイダの話は他所でやってくれ
求めてそうなプラクティスは見た事ないなぁ
個人的には、飛ぶにしても走るにしても動物という存在の態様のひとつだから
動物IFのプロパティに含めるでいいんじゃないかと思うけどね
var unko = new Unko()
より
Unko unko = new()
の方が良くね?
もっと地球規模の視野で考えろよ
うんこも地球の一部だろ?つまりうんこは地球とも言える
わかるか?
>>217 まぁ、後者ができるようになったの後になってからだから
>>214 それISP単体の説明にもなってない
class Penguin : IAnimalにNotImplementedExceptionでFly()を実装すれば即ISP違反だというのは間違い
まずは原典にあたってISPを理解してきたほうがいい
謳われてる原則をどう活用するかはその後
そもそも
そんな鳥のプログラムなんか一般的じゃねーし
>>220 「クライアントが『泳ぐ、飛ぶ、もしくは走る動物』として使うことを想定するのなら、そのインターフェースであるIAnimalにその情報を含めるのは適切」ということですかね
class Penguin としては Fly や Run などのメソッドの実装はノイズに思えるけど、IAnimalとして使われるなら、その契約に従えという感じかな
(それだと後から「道具を使う」がIAnimalに追加された際に Penguine もメソッド追加が必要で、そこがモヤモヤしてる)
こういう場合にアダプタ (ラッパー?) を使うのって適切?
純粋に Penguine としての機能を提供するクラスと、それを IAnimal として使うためのアダプタみたいなの
それだと更に複雑さを増すだけ?
OOP難しい……
適切とか
とりあえず作ればよくね?
適切かどうかなんてエグゼにしたら関係なくね?
それとも論点だけ考えて実際のプログラム作らないの?
それ何したいの
SOLIDが現実のコードで使われなかったり、「オブジェクト指向は問題を複雑にするだけ」みたいなことを言われる原因
>>203 インターフェース分離の原則は「クラスが必要としないメソッドを実装しない」ってだけ
ペンギンのような飛べない鳥が IFlyable を実装しないのは正しい
あとは「飛べる鳥」をインターフェースで分かるようにしてやればいい
isを使う羽目になったのは飛べるかどうかわからない IBirdをListにしてるから
---
interface IBird { string Name { get; } }
interface IFlyable : IBird { void Fly(); }
// ペンギンは飛べない
class Penguin : IBird {
public string Name => "Penguin";
}
// ワシは飛べる
class Eagle : IFlyable {
public string Name => "Eagle";
public void Fly() => Console.WriteLine($"{Name} is flying!");
}
// 飛べる鳥だけを扱うリストを作る
List<IFlyable> flyableBirds = new List<IFlyable> { new Eagle() };
foreach (var bird in flyableBirds) {
bird.Fly(); // 明示的に飛べる鳥しか扱わない
}
SOLIDにしても所詮理想論であって現場に即してるわけじゃないしなぁ
サイコパスの脳の違いを発見。一般の人に比べ線条体が大きいことが判明
karapaia.com/archives/52313287.html
後から増えた「道具を使う」には何かいい感じにデフォルト実装つけとけば既存のクラスには影響しないんじゃない
C# 8 からはインターフェースのデフォルト実装が使える
Win10や11のOS付属のpowershell5.1でインラインで書けるC#ってバージョンちょっと古くね
できれば新しいRoslynのC#をpowershellから使いたいのだが
なんか昔の記事しか見つからん
どうせ別に入れる必要があるならPowerShell 7入れれば良くね
>>236 起動時に出て来るメッセージすら読めないのか
>>239 馬鹿が必死に調べただけの浅い知識で言い訳してる
今のところ互換性の為に残してあるんだろう
それを変えちゃうと問題が起こる可能性があるしMS側のメンテがめんどうなので
変えたい人は7とセットで入れろということなんだろう
>>239 バカの相手はしなくていいわ
その情報はありがたいが
PowerShellは完全に袋小路だからもう諦めた方がいい
6以降は事実上Azure専用
>>242 うわっ
自分の言い訳コメントに自作自演で恥ずかしい馬鹿発見
なんで作っては捨ててくスタイルなんかなMicrosoftは
Windowsに標準搭載されてる.NET Frameworkと今の.NETの時点で互換性ないのに
なんで.NETアプリであるPowerShellが叩かれるのか
標準搭載されてるPowerShellは.NETアプリじゃなくて.NET Frameworkアプリだからね
>>245 MSの社内政治に敗れたチームのプロダクトはそうなりがち
社内政治うまくやってると微妙なやつも長生きする
.NETがFrameworkと互換性無くて捨てられないから
互換性ないってことは、.NETとframeworkの2つのアプリを動かしたら、GCもそれぞれで動き始めるの?
PowerShellはWindowsにシステムワイドにインストールされた .NET Framework が存在するという前提で成立していたのに、
.NETでは.NET自体をアプリにバンドルするか、必要に応じて特定のバージョンを追加で入れるかになって完全に破綻しちゃったんだよね
一般的な.NETアプリならバンドルは可搬性が向上するから好ましいことだけど、
PowerShellの場合はシステムワイドにインストールされたいろんなモジュールと連携しなきゃいけないから.NETバンドルはありえない
完全に詰んでる
だからPowerShell Coreは標準装備じゃなくて追加装備
Windowsにそもそも入ってないなら追加インストールでいいんだけどね。問題は5が入っていること。
それによって「なぜ元々入っているのにわざわざ追加するのか」という当然の疑問を解消するコストが生じる。
開発者の好みだけでサポート期間も互換性も劣るゲテモノをゴリ押しするのは極めて困難だし、
そもそもPS書いて飯食ってるタイプのエンジニアでは最新に拘る人はそもそも少ないだろうね
またペンギンやら飛べない鳥だとかの話がしたいのかい?
それともPowshellの付属物の話がしたいのかい?
どっちなんだい?
>>257 >それによって「なぜ元々入っているのにわざわざ追加するのか」という当然の疑問を解消するコストが生じる。
>開発者の好みだけでサポート期間も互換性も劣るゲテモノをゴリ押しするのは極めて困難だし、
ほんそれ
5が全部入りにしておくのが正解だっただろうな
PS for sysetmみたいなのを最小セットで入れておけば良かった
>>264 お前がC#の話題振ってくれりゃ乗るよ
早くしろよ
いや知らんがw
俺がC#の話題にしろ言うたわけじゃないしw
今関わってるプロジェクトがスペース2つでインデントしててちょっと面食らってしまったんだけどこれ珍しくないもの?
今まで携わってきた中で一件も遭遇したことなかった
過去に深いネストを大量生産する人がエラくなっちゃって、そういうルールになってしまったんじゃないかと妄想しちゃうなw
今時スペース2個は珍しいな、C#とかではあんまりない気がする
昔々はどの言語でもタブを使っていいかとか、スペースで代用するなら2個か4個かで論争があったらしい
JSは2個が主流だった気がするけど今はどうだろ
タブのが合理的
Goみたいな標準フォーマッタがあるのが理想だけどC#はそう言う文化はないね
俺はスペース2個のが視線移動減って楽だと感じてるからかなり昔から2個派だよ
>>268みたいな日本人特有の右倣えのお仕着せルールに甘んず昔から超効率化してるやつらは世の中に沢山いるんだよ
勉強になったな
TABに統一してるけど
表示上は半角スペース2から4個で用途で変えてる
{}は
if(){
}
の方が好き
普通は
if()
{
}
これ?
逆、最初の頃は上が大多数
ブログやら初心者講座やらで下の書き方が主流担ってきてる感じ
スペース2個インデントって言うと、XMLやHTMLを思い浮かべるな
>>275 違うぞ
上のはJavaやJavaScript界隈でのデファクト
下はMicrosoft系のC#とかのデファクト
公式が出してるコーディング規約がそうなってるだけ
>>276 例えばC#というかasp.net系だとrazor構文でhtmlと一緒にC#のコード埋め込む
そうするとインデントは2の方が見やすい
>>271 C#はチェーンメソッドのドットを縦に綺麗に並べる文化が有るんでタブだと都合が悪い
2でも4でも良いけどスペースがデファクト
>>277 いやだから
C#が出る前というか出始めの頃で
Cプラプラ使い達が多かった時さ
当時、というか関数書くときって
hoge(){
…}
て書くのが一般的やったん
んでDelphiが出てきたらこの{}をBegin…Endで囲むから
hoge()
Begin
…
End
ここらへんはVBやVBAとかにも反映されて
その後C#で出した際にって感じかな
>>279 タブをインデントで使ってスペースをアライメントで使えば理論上ズレないよ
Goのフォーマッタはこれに従ってるからタブ幅は任意に設定できる
prettierみたいな途中で強制的に折り返すフォーマッタとは相性が悪いけど
Indent with tabs, align with spaces
https://dmitryfrank.com/articles/indent_with_tabs_align_with_spaces これね
これが理想だけどエンジニアのレベルが高くないとこのルールを守るのは難しいからスペースにしてるのが大半
ただしGoは強制フォーマッタでこれを解決してる
個人プロジェクトなら最初から好きなタブ幅にすればいいからタブにするメリットもあまりないし
気分でタブ幅変えれるのは結構メリットあるけどね
俺はずっと
>>274の前者でインデントはタブだなぁ
なおタブの幅はスペース4個分
この手の話は職場のルールで決まるから個人がどうこうは関係ないよな
ただ自分のツールなんかは好きにしろだが
カッコ、演算子、型と変数の宣言の間の空白などもめる話題はいくらでもある
>>285 「原子力発電所の建設」について議論したいなら付き合うよ、それで議題は?
まあreshaperでテーム共有設定使うだけだしな
>>287 では失礼して
Unity製ゲームのMOD開発なんかでリフレクション使いまくるのもなんかスマートじゃないから、
aelij氏のIgnoresAccessChecksToGeneratorを魔改造させてもらってフィールド含めて全パブリック&readonly解除でゲームのコードに全アクセス出来るようになってめっちゃ捗るようになったのだけど、
欲が出て標準ライブラリにも手を出したくなってやってみたらmscorlibなんかはReferenceAssemblyだからプライベートフィールドはそもそもdll内に含まれてないから書き換えられないんだよね。
ランタイム時の実体dllを決め打って渡せばstring.m_firstCharとかList<T>._sizeとかも全てアクセスできるようにはなるんだけど決め打ち渡しもスマートじゃないからどうにか自動で解決をしたい。
ILSpyやmono.cecilにはランタイム時の実体dllを特定するコードあるんだけどbuildアクションから同じ事するのって可能だろうか?
へー
なんだかもうゲームよりMOD開発、MOD開発より開発環境開発の方が長くなっちゃってますわ
だって、ここ
別にゲーム開発やないし
プログラムやで
いまだにmonoで簡単にいじられまくりゲームあるのか
>>289 日本語がややこしいけど
①標準ライブラリのPrivate含む全フィールドにリフレクションを使わずにアクセスして書き換えたりしたい
んで、
②実体DLLを決め打ちで渡せばアクセスできるってところまでできてる
あとは
③実体DLL取得を自動化したい
④なおかつビルドプロセスに組み込みたい
ってことか
MOD開発とか知らんけど面白そうじゃん
いまいち細かい要件がよくわからんけどAppDomain.CurrentDomain.GetAssemblies()で現在ロードされているすべてのアセンブリが取得できるらしいが、これ試した?
駄目だったならどういうところがダメだったのか教えてくれ
>>295 要するにIgnoresAccessChecksToGeneratorの話でMSBuild内のコードとして動くものだからそれやってもMSBuildがロードしてるものが返されるだけとなる
ILSpyなんかもtypeof(object)などから解決してるので上記の理屈でそのまま移植はできない
>>293 マルチメインじゃなくmodフレンドリーなゲームならil2cpp化せずそのまま出してるゲームも普通に多いよ
改変やチート防止のためなら難読化含めてやったところでそこまで難易度上がらないからそれ目的ならRustみたいにカーネルドライバ付けるしかない
個人開発の局所的な用途のマイナーツールの話が原発の建設並の重大事なのか
ちょっと難しすぎてわかんねえな
原発ってただの湯沸かし器じゃん
燃料がちょっとヤバイってだけで高尚なC#のプログラムと比較すんなよ
C#だってただの道具
しかもC#だけじゃお湯も沸かせない
高尚とかちゃんちゃらおかしい
ツールは手段であって目的はアクセシビリティバイパスだから言語レベルのスケールの話な
実際これ求めてる人は少なくないからUnsafeAccessorが実装された訳で
てかリフレクションの方が文字列で指定してる分よっぽど危険だと思うんだけどな
エロがビデオを進化させてきようにチートがソフトウェアを進化させるんだよ
湯沸かししかできない原発野郎は難しいなら黙ってろ
煽りたいだけのやつが居着いちゃってるのか、このスレ
Enum.IsDefined(enumType, intValue)ってボックス化する?
AIに聞いたら最初は「ボックス化しない」とか言われたんだけど、第2引数がobject型として受け取ることを指摘したら「ボックス化するかもしれません」みたいな曖昧な返答されてよく分からなくなってきた
object型ならするよ
.NETのバージョンにもよるけどgeneric版の方が型がコンパイル時解決されるからパフォーマンスは良い
確かにジェネリクスでstruct制約付けたらボックス化回避できそう
ありがとう
public TEnum ConvertToEnum<TStruct, TEnum>(TStruct value)
where TStruct : struct
where TEnum : Enum
{
if (!Enum.IsDefined(typeof(TEnum), value))
throw new ArgumentException();
return Unsafe.As<TStruct, TEnum>(ref value);
}
JetbrainsやILSpyでIL見てboxあるかどうかみればいいんじゃね
ハック的なことなんだけどインスタンスのオブジェクトヘッダに埋め込まれるクラスハンドルへのポインタ?をインスタンス無しで得る方法って無いかな
typeof(MyClass)ってすると正にそのポインタが「mov rcx, 7FFB716DE758 -> call clrのtype取得関数」って感じのアセンブラが生成される訳だけど、その7FFB716DE758を得たいんだよね
インスタンスがあればUnsafeライブラリ用いて簡単に得られるのだけど
文章修正してたら日本語おかしくなったけどもし知ってる方いたらヒントでも何でも教えていただきたい
>>313 GetTypeやtypeofで得られるものはあくまでもType型のマネージドインスタンスだから全く違う
だけど逆アセをするとtypeof()時には即値でハンドルへのポインタ?がアセンブラコードとして埋め込まれてるので内部的にはめちゃくちゃ簡単に得る方法があるはずなんだよね
一応自己解決だけどGetTypeやtypeofで得られたTypeインスタンスから「type.TypeHandle.Value」で希望のものは得られた
本来即値で得られるはずなのに冗長でもやもやはするが
ChatGPTに聞いたら同じ答えが返ってきたけどRuntimeTypeHandle.Valueは環境によってメソッドテーブルへのポインタじゃなくEETypeへのポインタや実装依存のメタデータへのポインタになる場合もあるから自分で確認しろよとのこと
JITだろうが何だろうがconst intなんかは即値で埋め込まれるしね
だからクラス名.TypeHandleValueみたいなconst持っててくれたら嬉しいんだけど需要ほぼゼロすぎるか
ん?即値で得られない理由の話だったか
そっちならJIT関係あるわな
いや関係ないよ
なぜなら逆アセすれば分かるけど思いっきりレジスタ長以下のconst同様の挙動を見せてるからね
typeof時にね
アドレスとかプロセス起動のたびに変わることは無いんだっけ?
>>323 .NETの場合は当然変わるしネイティブでも設定次第では変わり得る
でもそもそもC#やJavaは実行時にその都度機械語を組み立てて行く訳だから、であればその都度埋め込めばいいだけの話
なら結局、ユーザークラスじゃ都度変わりうるってことじゃ?
>>321 それはJITやAOT後のものを見てるからでしょ
JIT/AOT時に異なる相対アドレスに配置できる余地を残すためにC#/ILの段階では固定しない
ユーザークラスがILの段階で決め打ちになるわけないだろ
ユーザークラスだろうが何だろうが別に関係ないし
IL段階で定数になる必要もなくて事実として実行時に機械語になるタイミングで定数化されるんだよ
プログラマがその定数にアクセスする手段がないだけで
インスタンスの型の厳密なチェック typeof (X) == x.GetType() やジェネリック型のチェック typeof (T) == typeof (X) はJITで最適化されるから、
質問者のケースがもしこれらに該当するなら変なハックは必要ない
lud20250221235823このスレへの固定リンク: http://5chb.net/r/tech/1719656321/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。
TOPへ TOPへ
全掲示板一覧 この掲示板へ 人気スレ |
Youtube 動画
>50
>100
>200
>300
>500
>1000枚
新着画像
↓「C#, C♯, C#相談室 Part98 」を見た人も見ています:
・Cygwin + MinGW + GCC 相談室 Part 8 (950)
・荒らし相談室
・ハゲミン相談室
・C++相談室 part153
・C++相談室 part150
・C++相談室 part155
・C++相談室 part136
・C++相談室 part133
・シーバスなんでも相談室92
・シーバスなんでも相談室57
・C++相談室 part140
・C++相談室 part134
・C++相談室 part137
・シーバスなんでも相談室71
・シーバスなんでも相談室85
・C++相談室 part135
・シーバスなんでも相談室62
・C++相談室 part141
・C++相談室 part142
・シーバスなんでも相談室70
・C++相談室 part146
・C++相談室 part117
・シーバスなんでも相談室28
・シーバスなんでも相談室39
・MFC相談室 mfc23d.dll
・Dr林のこころと脳の相談室17
・C#, C♯, C#相談室 Part95
・C++Builder相談室 Part21
・C#, C♯, C#相談室 Part91
・C#, C♯, C#相談室 Part91
・0からの、超初心者C++相談室
・【不倫.浮気】お悩み相談室
・相談室のお姉さんに恋をしてしまった
・[特設]サマータイム対応相談室
・[特設]サマータイム対応相談室
・ギコネコ先生の自作PC相談室その43
・鍼灸マッサージ質問相談室パート14
・船乗りなんでも相談室 第7次航 【外航用】
・♪♯☆ IRCnet相談室 part2 ♪♯☆
・一級建築士設計製図相談室(199室)
・妖怪、幽霊と人にまつわるお話&相談室
・08070507787 ★ 真智宇 先生の悩み相談室
・【構成】BTO購入相談室【見積り】■37
・初心者優先デジタル一眼質問・購入相談室 103
・初心者優先デジタル一眼質問・購入相談室 158
・初心者優先デジタル一眼質問・購入相談室 152
・初心者優先デジタル一眼質問・購入相談室 108
・【構成】BTO購入相談室【見積もり】■ 246
・シーバスなんでも相談室 17©3ch.net
・■一級建築士設計製図試験相談室(179室)■
・必ず誰かが相談に乗ってくれる恋愛相談室Part607
・【谷回り】パラレル初級者 滑り方相談室【カービング】
・アパートマンション経営なんでも相談室【152号室】
・ネットワークプログラミング相談室 Port27
・必ず誰かが相談に乗ってくれる恋愛相談室Part632
・ネットワークプログラミング相談室 Port30
・「コンパイラ・スクリプトエンジン」相談室16
・アパートマンション経営なんでも相談室【154号室】
・【スキー】初心・初級者 滑り方相談室7【目指せパラレル】
・【即切りなさい】フレンド関係お悩み相談室【我慢しなさい】
・【ハァテレビも無エ】ageteoff茸 埋め立て荒らし はんなり相談室★63
・小室圭さんが「ビザ問題」を外務省に相談 外務省は「内政干渉になる」と困惑 ★5 [愛の戦士★]
・東京の梅毒感染者2400人超で過去最多ペースで増加…内訳は男性7割女性3割 無料・匿名の検査相談室を新宿や多摩地域に設置 ★2 [首都圏の虎★]
・C++相談室 part165 (722)
・0からの、超初心者C#相談室 (94)
18:19:34 up 51 days, 19:23, 0 users, load average: 40.12, 53.41, 52.17
in 0.061387062072754 sec
@0.061387062072754@0b7 on 030608
|