1 名前:デフォルトの名無しさん mailto:sage [2020/05/27(水) 20:28:41.27 ID:Pggemlyq0.net] !extend:checked:vvvvv:1000:512 次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為) 「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。 他のスレッドでは書き込めないような低レベルな質問、質問者自身なんだか意味がよく分からない質問、 ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。 内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。 なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。 C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください >>980 を踏んだ人は新スレを建てて下さい。>>980 が無理な場合、話し合って新スレを建てる人を決めて下さい。 ■前スレ ふらっと C#,C♯,C#(初心者用) Part147 mevius.5ch.net/test/read.cgi/tech/1582100741/ ■関連スレ C#, C♯, C#相談室 Part94 mevius.5ch.net/test/read.cgi/tech/1553075856/ ■コードを貼る場合は↓を使いましょう。 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/index https://docs.microsoft.com/en-us/dotnet/standard/class-libraries 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
680 名前:デフォルトの名無しさん mailto:sage [2020/11/19(木) 16:48:49.64 ID:k15rqtpOa.net] >>670 そんな馬鹿な実装するはずがないと思うよw そもそもイミュータブルとは状態を変更する方法を外部に提供しない、という意味以上でも以下でもない。 そこのところを勘違いしている気がする
681 名前:デフォルトの名無しさん mailto:sage [2020/11/19(木) 16:50:55.24 ID:EbSX4tjh0.net] >>672 ソース見れば普通にわかるやろ https://referencesource.microsoft.com/#mscorlib/system/text/stringbuilder.cs,338 string ret = string.FastAllocateString(Length);
682 名前:デフォルトの名無しさん mailto:sage [2020/11/19(木) 17:07:14.79 ID:9igY/Fs20.net] りふぁれんすそーすw
683 名前:デフォルトの名無しさん mailto:sage [2020/11/19(木) 17:26:57.34 ID:k15rqtpOa.net] .NETのStringが機械語レベルでどう実装されてるか勉強したことはないが、 普通に考えればパスカルストリングとCストリングのあいの子みたいな単純な構造でしょたぶん。 ごにょごにょした後のバイト列を普通にstringと「みなす」だけにするよね。 わざわざ別のメモリ確保してベタコピーする馬鹿な実装をする人がいるだろうか。 その必要性ができてからで遅くないと思うんだけど。
684 名前:デフォルトの名無しさん mailto:sage [2020/11/19(木) 18:08:19.31 ID:fvT6uEqW0.net] >>675 C#のstringはBStrというoffset0にlength、offset4からcharの配列、そのoffset4へのポインタがstringとなる 末尾がnull文字じゃなくても問題ないが基本は末尾にnull文字が入ってるためconst wchar_t*としても扱える そんなことはどうでもよくてマネージド内で上記の内部バイナリを書き換える方法は一切無いからわざわざアンセーフstringラッパーを作ったんだよ 一見書き換えられてるように見えるstring操作は全て新stringとして生成されてるだけだからな +連結は長さが変わるから想像できるだろうけど、Substringすらも切り取り参照をしている訳ではなく新たにstringを生成してる(それを解決しうるマネージドな手段としてReadOnlySpanというのも一応あるが)
685 名前:デフォルトの名無しさん [2020/11/19(木) 19:50:48.14 ID:nKYhLbF50.net] 細かいことを気にしてまでC#を使う矛盾をどう解決してるのか気になるわ
686 名前:デフォルトの名無しさん mailto:sage [2020/11/19(木) 20:59:45.17 ID:fvT6uEqW0.net] >>677 だからプライベートリポの8割はC/C++って程度には普段はC使ってるけど でもその理論言っちゃうと本家StringBuilderも要らんってことになるしな 全部+とか$"{}"でええやん
687 名前:デフォルトの名無しさん [2020/11/19(木) 21:03:40.41 ID:nKYhLbF50.net] StringBuilderを使えというのは学ぶでしょ そこまででいい それ以上やるならもうC#使う意味ない
688 名前:デフォルトの名無しさん mailto:sage [2020/11/19(木) 21:04:23.57 ID:fvT6uEqW0.net] >>679 それじゃSpanとか実装したMSがバカみたいじゃん
689 名前:デフォルトの名無しさん mailto:sage [2020/11/19(木) 21:28:29.15 ID:A4wcMVuA0.net] >>663 が挙げてたZStringの解説記事 個人的にはそこまでパフォーマンス気にするような物作ってないから「へー」って感じで読んだだけだけど ZString – Unity/.NET CoreにおけるゼロアロケーションのC#文字列生成 ttps://tech.cygames.co.jp/archives/3383/
690 名前:デフォルトの名無しさん mailto:sage [2020/11/19(木) 21:32:12.66 ID:s0VdR5fOd.net] 国内C#erで有名どころだしstringはパフォーマンス絡みでよく上がるから割と有名な方じゃないかな? あんなにパフォーマンス気にする人が知らないのには驚きだけどw
691 名前:デフォルトの名無しさん mailto:sage [2020/11/20(金) 01:24:52.99 ID:ViPIBq0U0.net] パフォーマンスは気にしてないんじゃないの? アロケーション気にしてただけで
692 名前:デフォルトの名無しさん mailto:sage [2020/11/20(金) 07:19:27.10 ID:ShozvaYJ0.net] C++は基本がスタック、C#は基本がヒープ この二者の最大の差はこれなのでC#のパフォーマンス改善=アロケーション回避に終始する
693 名前:デフォルトの名無しさん mailto:sage [2020/11/21(土) 03:48:47.56 ID:zIAbzPq60.net] 俺バカだから何万回の処理で何ms差が出るのか教えてほしい
694 名前:デフォルトの名無しさん [2020/11/21(土) 08:27:18.63 ID:WoKZFdST0.net] 手段が目的と化している人達にそんなこと聞いても無駄だよ
695 名前:デフォルトの名無しさん mailto:sage [2020/11/21(土) 11:57:08.18 ID:6fJp/BaL0.net] 初心者スレらしい馬鹿がいて嬉しい
696 名前:デフォルトの名無しさん mailto:sage [2020/11/21(土) 11:59:54.22 ID:zQZxJMDr0.net] >>681 のブログ主みたいな人の方が結局生産性も高いのだから、パフォーマンス厨を馬鹿にするのは知への嫉妬にしか見えない 尤も初心者用スレで話す内容ではないが
697 名前:デフォルトの名無しさん mailto:sage [2020/11/21(土) 13:04:44.65 ID:Ny+zGkjNa.net] まあちょっと前の数値演算の話と同じだよ。 純粋な学問として円周率の桁数を追求することを否定する人はいないけど、 実用上必要ないのにそれを追求するのはただの馬鹿なフェティシズム
698 名前:デフォルトの名無しさん mailto:sage [2020/11/21(土) 13:16:59.22 ID:QfF2kXL70.net] こだわっている当人が>>663 を提案されているのに >良く知らないけどそれもその都度string生成してるんじゃないの って見もせずに切り捨てているのがわけわからない。自分の作ったunsafeメソッド誉めてほしかったの?
699 名前:デフォルトの名無しさん mailto:sage [2020/11/21(土) 15:32:05.57 ID:TFceIuuT0.net] 誰も>>661 の質問自体には答えてあげてないんだからスレチとしてスルーで良いのでは
700 名前:デフォルトの名無しさん mailto:sage [2020/11/21(土) 16:59:03.08 ID:ZU3qCVhf0.net] ASP.NET Coreを勉強してみようと思うんだけど レンタルサーバの「使えるプログラム」のところに PHP, Ruby, PyThon, Sh としか書かれてないところはダメですよね?
701 名前:デフォルトの名無しさん mailto:sage [2020/11/21(土) 18:32:27.77 ID:+zQLxjm30.net] 勉強ならローカルで動かせばよろし。
702 名前:デフォルトの名無しさん mailto:sage [2020/11/21(土) 19:15:26.59 ID:pEQG3awY0.net] >>690 ライブラリ教えてなんてレスは一度もしてないし主題とは違う返信に対して検索や外部リンクまでチェックする義務が発生する理屈の方が訳わからない 提案してくれた>>663 には感謝するけど、あくまで自分の質問は660のレス内容 C#の質問をしたつもりだけど言語の質問とは違うということであればスレチと言われても仕方ないが
703 名前:デフォルトの名無しさん mailto:sage [2020/11/21(土) 20:16:31.79 ID:WQW9Bpg70.net] >>669 編集してるXXX.csファイルを読み込んで NameValueCollection vals = new NameValueCollection行の次の {行からそのあとの};行の間の行に先頭スペースを揃えて挿入して ファイルを上書き保存するミニアプリを作って実行すればいい テキストの平文ファイルだから編集は簡単 VSで編集中にそのような外部エディタで編集がされると 編集を反映しますかって即座に聞いてくるからはいすれば位置がそろう
704 名前:デフォルトの名無しさん mailto:sage [2020/11/21(土) 23:02:14.09 ID:eXf0RCq40.net] >>689 全世界で行われてる円周率演算がすべて世界記録出すために動いてると思ってる馬鹿
705 名前:デフォルトの名無しさん mailto:sage [2020/11/22(日) 02:05:01.90 ID:eyJ/0uPg0.net] >>694 @マジレスするとメモリリークはしない。こんなのはGC.Collectしてメモリ使用量を見比べるだけで分かる Aでも>>661 の使い方ではインターンプールで潜在的なバグを抱えるからやめた方が良い Bやりたいこと汲み取るなら先人が同じ悩みから到達したソースを使うべき CZStringいいよ 余計な遠回りをしないようにこの結論から言ってくれてるんだよ >>663 は優しい奴だよ、まったく
706 名前:デフォルトの名無しさん mailto:sage [2020/11/22(日) 02:09:21.16 ID:r7dn6Jzr0.net] >>696 何のためにやってるの?自己満オナニー?
707 名前:デフォルトの名無しさん mailto:sage [2020/11/22(日) 02:37:39.25 ID:XfbnXwSba.net] >>696 どっから世界記録とか出てくるの?w 読解力大丈夫かこの人
708 名前:デフォルトの名無しさん mailto:sage [2020/11/22(日) 08:48:28.54 ID:VTf/cbNB0.net] >>697 マジレスすると今のところはヘッダオンリーならぬ単ソースオンリーで済ませたいのであんまり外部ライブラリには乗り気じゃないというのもあるが とは言えZStringを拝見したところu8stringをC#で実装出来てる凄いライブラリであるようなのでtext系ファイルやらwebやらdbのクエリやらで利用したい構想立ちまくったのでありがたくスターポチって記憶させていただく 確かにただのバッファとして作ったものの実態はstringに違いないので何かの拍子にstring.Internしてしまうと結構不味いことになるね とりあえずGCに影響ないと教えてくれて大分スッキリしたのでありがとう
709 名前:デフォルトの名無しさん mailto:sage [2020/11/22(日) 09:03:29.09 ID:0zyBqMyr0.net] >>699 「円周率の桁数を追求する」ってのは結局そういうこと
710 名前:デフォルトの名無しさん mailto:sage [2020/11/22(日) 09:27:31.41 ID:7FLAKb9y0.net] 一番じゃないと駄目なんですか?
711 名前:デフォルトの名無しさん mailto:sage [2020/11/22(日) 13:34:50.51 ID:vJ51qgrt0.net] superPIじゃ駄目なんですか?
712 名前:デフォルトの名無しさん mailto:sage [2020/11/25(水) 08:28:57.90 ID:5XzEVJhy0.net] COMインターフェイスをstructに付けてboxing発生させずに使用する方法って皆無でしょうか?
713 名前:デフォルトの名無しさん mailto:sage [2020/11/28(土) 16:25:59.35 ID:Msb6oswN0.net] c# プログラマは goto でコロナを拡散してるから、ウィルス作成罪とかで刑務所にぶちこむべき。 もちろん、実質的に goto と同じ if文 、swich case とか使ってるc# プログラマも有罪。 swift や Pythonプログラマは goto 使ってないから無罪。
714 名前:デフォルトの名無しさん mailto:sage [2020/11/28(土) 17:07:38.54 ID:goyIH8CW0.net] 面白いと思って書いたの?
715 名前:デフォルトの名無しさん [2020/11/28(土) 17:18:49.30 ID:qYAW4hVUM.net] 705は死刑
716 名前:デフォルトの名無しさん mailto:sage [2020/11/28(土) 17:53:33.87 ID:yGy7muY00.net] >>705 Go To Hell
717 名前:デフォルトの名無しさん [2020/11/28(土) 17:57:32.34 ID:qYAW4hVUM.net] >>708 このハゲェ!
718 名前:デフォルトの名無しさん [2020/11/28(土) 18:38:36.41 ID:pMGwV9fR0.net] Windowsの ini ファイルの内容を Section, Key, Value の順で List<Dictionary<string, List<Dictionary<string, string>>>> ini; ini = new List<Dictionary<string, List<Dictionary<string, string>>>>(); として取り込んだものから Section の一覧(Delphi の ReadSections 相当)を 得たいのですが方法がわかりません。 教えていただけませんでしょうか。
719 名前:デフォルトの名無しさん mailto:sage [2020/11/28(土) 18:43:14.08 ID:YkgqIE2E0.net] それのどこが分からないのか分からん あとListはいらなくない?
720 名前:デフォルトの名無しさん mailto:sage [2020/11/28(土) 18:54:47.55 ID:v3rIW/CF0.net] >>705 よくわかりません。 C#はgotoを使わずとも実質gotoできるが、 swiftやPythonが実質gotoもできない根拠を示して下さい。
721 名前:デフォルトの名無しさん mailto:<
[] [ここ壊れてます]
722 名前:>2020/11/28(土) 19:14:35.24 ID:pMGwV9fR0.net mailto: >>711 説明が下手ですいません。 セクション名の一覧が下記のような考え方で取得できないかと考えていました。 public void ReadSections(ref string[] sections) { Array.Resize(ref sections, ini.Count); var i = 0; foreach (var dic1 in ini) { sections[i] = セクション名 i++; } } 書き込んだ後、下記のようにしたら希望の動作をしました。 public void ReadSections(ref string[] sections) { Array.Resize(ref sections, ini.Count); var i = 0; foreach (var dic1 in ini) { dic1.Keys.CopyTo(sections, i); i++; } } [] [ここ壊れてます]
723 名前:デフォルトの名無しさん mailto:sage [2020/11/28(土) 19:41:10.86 ID:7NcH7NyO0.net] >>710 自分もList使う意味が見いだせない var ini = Dictionary<string, Dictionary<string, string>>とかで良いんじゃないの? これならvar value = ini["セクション名"]["キー名"]で取り出せる if (ini.TryGetValue("セクション名", out var keys) && keys.TryGetValue("キー名", out var value)) とやったほうが良いと思うが 代入はini["セクション名"]["キー名"] = value;
724 名前:デフォルトの名無しさん mailto:sage [2020/11/28(土) 20:02:20.04 ID:M3lV8yHm0.net] Sectionの配列を得たいなら>>714 にLinqのini.Keys.ToArray()
725 名前:デフォルトの名無しさん [2020/11/28(土) 20:33:03.95 ID:pMGwV9fR0.net] >>714 ,715 .NET 5 が出たのを機に c# を始めたところなのでよくわかっていません。 勉強がてら自作の Delphi7(Lazarus) の自作ライブラリと同じ物の作成に挑戦中です。 ini ファイルの読み込みもネットからダウンロードしたものをベースに 改造して動きを勉強しているところです。 ですので List になっている理由もまだ理解できていませんし、Dictionary も 今日初めて見た状態です。一応 List を外してみると foreach (var dic1 in ini) { if (dic1.ContainsKey(section)) { foreach (var dic2 in dic1[section]) { if (dic2.ContainsKey(key)) { return dic2[key]; } } } } のような場面で ContainsKey がエラーとなりました。 とりあえず Delphi の TMemIniFile と同じ程度までできました。
726 名前:デフォルトの名無しさん mailto:sage [2020/11/28(土) 21:13:18.17 ID:M3lV8yHm0.net] >>716 Listを外してforeachする場合はこう変える必要がある foreach (var dic1 in ini) { if (dic1.Key == section) { foreach (var dic2 in dic1.Value) { if (dic2.Key == key) { return dic2.Value; } } } } もっと簡単な方法は>>714 に書かれてる通り if (ini.TryGetValue(section, out var keys) && keys.TryGetValue(key, out var value)) return value;
727 名前:デフォルトの名無しさん mailto:sage [2020/11/28(土) 21:20:41.11 ID:M3lV8yHm0.net] pascalのiniなんてもう遥か昔に使ったきりだからあんまり覚えてないがそれっぽいの作るとしたらこんな感じか Dictionary<string, Dictionary<string, string>> ini = Dictionary<string, Dictionary<string, string>>(); string ReadString(string section, string key) { if (ini.TryGetValue(section, out var keys) && keys.TryGetValue(key, out var value)) return value; else return null; } これだとnullチェックが必要になるから、Tryメソッドの方が便利だったりする bool TryReadString(string section, string key, out string value) { value = null; return ini.TryGetValue(section, out var keys) && keys.TryGetValue(key, out value); }
728 名前:デフォルトの名無しさん mailto:sage [2020/11/28(土) 21:27:31.90 ID:M3lV8yHm0.net] そういえばiniは無かった場合の規定値を第3引数に入れておけばいいだけか それならTryメソッドいらんね
729 名前:デフォルトの名無しさん mailto:sage [2020/11/28(土) 23:40:53.47 ID:xlHMBUaz0.net] sectionの一覧が欲しいって言ってるのに、valueを取り出す説明を延々してる奴何なの?
730 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 00:02:00.65 ID:agHPEKHb0.net] string GetValue(Dictionary<string, Dictionary<string, string >> ini, string section, string key){ if(! ini.ContainsKey(section)) return null; if(! ini[section].ContainsKey(key)) return null; return ini[section][key]; } c#に限った事ではないが、何をしたいのか分かりやすいコードを目指そうな。
731 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 00:10:23.95 ID:eEpZgXkU0.net] だから質問者が欲しいのはvalueじゃなくてsection一覧だっての
732 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 06:31:38.45 ID:kNuJF9Ar0.net] datagridviewにユーザーコントロールを埋め込みたいんですけどどうすればいいですか? windowsformアプリです ていうかdatagridviewじゃなくてもユーザーコントロールをリストで表示できれば何でもいいです どなたか教えて下さい
733 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 08:16:40.50 ID:+pk7xniq0.net] >>723 TableLayoutPanel とか FlowLayoutPanel はどう?
734 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 08:16:40.50 ID:+pk7xniq0.net] >>723 TableLayoutPanel とか FlowLayoutPanel はどう?
735 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 09:35:53.03 ID:yrxBBFH+0.net] >>720 それは一番上に書いたんだが
736 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 09:40:01.71 ID:yrxBBFH+0.net] >>721 section取り出す説明は昨日一番最初のレスで書いたからもう脱線して話すけどなんでここまでTryGet使わない奴って多いんだろうな どうせ後々インデクサアクセスするならTryGetValueの方がよっぽど分かりやすいと思うんだが
737 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 12:22:24.94 ID:kNuJF9Ar0.net] >>724 ありがとうございます 試してみます
738 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 17:19:06.82 ID:b9LXd7l70.net] >>723 DataGridViewCellとDataGridViewColumnを継承して自作
739 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 17:32:18.08 ID:MpNpLm4W0.net] >>721 >>727 ConstainsKey → []は、まずContainsKeyの内部でFindEntry走らせて存在確認し、存在したらインデクサアクセスして再度内部でFindEntry走らせて取り出すという2度手間してるIQ低いコード TryGetValueは存在確認時にFindEntryしたついでに値も取り出すというスマートな関数 そもそも前者で済むならTryGetValueは存在意義ないから、上記の仕組みを想像できずとも「なんでTryGetValueってあるんだろう?」と疑問に思わなければいけない ま、C#は多様性受け入れてる言語だから個人開発なら好きに書いたらいいが
740 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 18:14:07.88 ID:o/YPVzQP0.net] そういう値をローカル変数に代入するのを無駄と言い張って勝手にワンライナーに書き直すような地雷プログラマの振りをするのはやめろよ……初心者が本気にしたらどうするんだよ
741 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 18:23:09.50 ID:MpNpLm4W0.net] >>731 今の話でローカル変数やワンライナーが出てくる余地あるか?
742 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 18:52:20.22 ID:o/YPVzQP0.net] >>732 明確にガード節で判定が切り分けられているのに、 「TryGetValueなら判定と取得を同時に行える」と言い出すのはまさしくワンライナー君の物言いだぞ ifをあえて二つ用意してContainsKeyを使ってる時点で 「ははーん、論理重視のコーディングスタイルか」と察してやるのが有能なプログラマってもんだ
743 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 18:58:47.11 ID:MpNpLm4W0.net] >>733 ??? 2連続で全く不必要に同じ処理を挟むような奴がとても論理重視とは思えないんだが、ContainsKey + []とTryGetValueじゃ2倍以上パフォーマンス変わってくるって知ってる? さっきも言ったけどContainsKeyでも内部的にFindEntryが走り、インデクサアクセスでも再度FindEntryが走るという無駄がある 再度言うがMSがなんでTryGetValueというメソッドを公式でわざわざ用意したかって疑問に思わない? 簡潔さ全振りならそもそもLinq使えばいい話
744 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 19:01:28.82 ID:tRrXGfded.net] メソッドの戻り値を一回判定するだけなら 一行で書かないほうが変じゃね? それをわざわざ一旦保存とか逆になんの意図があるのかと たまにはデバッグやらログで出したいからと言うのはあるがそれは2回利用に当たるから入れて当然やしな
745 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 19:41:11.64 ID:o/YPVzQP0.net] >>734 久々にふふってなった まるで昨日の俺を見ているようだ……お前にもいつか悟れる日が来ると良いな
746 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 20:16:26.39 ID:EVjNfLc/0.net] 判定と取得を行いたいんじゃなくて取得を行いたい なのに判定しないとプログラム上まずいことになるので判定機能付きの取得メソッドを使う 読む上でわざわざ判定と取得を別に書いてるならそこにあえての理由があるんだろうな、と推測しないといけない 今回のケースならあえてのケースなど無いので可読性を下げる要因でしか無い
747 名前:デフォルトの名無しさん mailto:hage [2020/11/29(日) 20:17:12.32 ID:3Ka2HmX40.net] >>736 きみ中学生? 男?女?どこ住み?
748 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 20:28:09.84 ID:HJnVnweF0.net] >>736 それは廓然大悟かね?
749 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 20:31:48.44 ID:yrxBBFH+0.net] >>737 これのどっちが可読性良いかなんて個人の感想レベルだろ 実際俺は100%下のほうで書いてるけど一度もコードレビューで指摘されたことないしな そして>>734 が言うように実行効率は下の方が2倍近く良いので下を選択すべき理由はある 一方で上を選択すべき理由は見当たらない if(! ini.ContainsKey(section)) return null; if(! ini[section].ContainsKey(key)) return null; return ini[section][key]; if (!ini.TryGetValue(section, out var keys)) return null; if (!keys.TryGetValue(key, out var value)) return null; return value;
750 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 20:43:57.67 ID:yrxBBFH+0.net] 一応言っておくけどここでは713や720に合わせて書いてるだけで実際には1行で書いたりこんなに複数retは使わない returnは一つにしろというレビューは受けたことあるんでな
751 名前:デフォルトの名無しさん mailto:hage [2020/11/29(日) 20:51:31.28 ID:3Ka2HmX40.net] >>740 普通に英語として下の方が直感的に分かる 上だと今ですら非直感的な上に変数名によっては更に分かりづらくなる可能性をはらんでる
752 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 20:54:18.24 ID:YUoXGIHl0.net] >>720 TryGetValue()知ってるオレカッケー って言うおこちゃまだろw
753 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 20:56:55.50 ID:EVjNfLc/0.net] 無理に一行にするな、が通るならreturnを1つにしなくていいのでは? 数十行あるメソッドのいろんな箇所でreturnしてると気持ち悪いと思うが、こういうタイプなら複数returnで良い 可読性が個人レベルなのはそのとおり 文字の並びが似通っている、ではなくどういう機能を呼んでいるか?という意味 判定付き取得メソッドが標準で用意され、しかもメジャーな内容でパフォーマンスも良い それでもあえてそれを呼ばないのは特殊な事情があるのでは?と読み手の思考を止めることにつながるという意味
754 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 21:06:40.39 ID:o/YPVzQP0.net] >>740 上のコードを採用する理由は何の値を戻しているか即座に分かるところ、と俺は判断した return ini[section][key]; この一文で読解に要する数秒を削る為だけに2倍程度のパフォーマンスを許容するのは普通にありだよ
755 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 21:23:27.82 ID:EVjNfLc/0.net] メソッド名見りゃそれはわかんじゃん return文にそういう責務を与える意味は? どうしても必要というならコメントでも書いとけば良い
756 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 21:36:16.22 ID:yrxBBFH+0.net] >>744 returnについては可読性に関わる納得できた理由はちゃんとあるんだが自分やチームが使わないというだけで別にうちのコーディング規約を議題に上げるつもりはない(ツッコんでくる人いそうだったから一応書いただけ) まぁもう好きにしたらええんやない C#メインで使っていきたいなら言語として用意されてるものは出来る限り利用すべきと思うけど そこまで学習コスト払いたくないってことなら一つの方法を出来る限り使いまわすというのも利に適ってるしな
757 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 21:49:34.68 ID:EVjNfLc/0.net] チーム内でのローカルルールがどうなってるかはどうでも良いんですよ そのチームで合意が取れてるならなんの問題もない ローカルルールを隠した状態で突っ込まれてローカルルールなんです!って言われても知るかよ、という感想しか出ない ローカルなものでないなら、基本的には標準に準拠すべきで標準がわざわざtryメソッドを回避している書き方をしていない限り公の場でもそれに準じたほうが良いのでは?というだけ
758 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 21:53:07.17 ID:yrxBBFH+0.net] >>748 いやだからTryGetValueに関してはそれが標準だろっていうのが一貫した俺の意見であってローカルルールなのは>>741 で書いた事 実際にギブハブなんかで数多くのプロジェクト参考にしてきたけどLinqで手っ取り早く書く事は多くてもTryGetValueを使わずにContainsとインデクサとかいう非効率な方法採用してる人なんて見た記憶ないしな
759 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 21:58:49.11 ID:EVjNfLc/0.net] >>749 なんで突っかかってくるかわからんけど747の前半は複数retの話、後半はtryの話 わざわざローカルの話である複数retのことなんざ話題に上げんで良いよ、try使うのが標準なんだからそれに習ったほうがよくね、 後半は君と同意見なんだよ
760 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 22:01:07.98 ID:yrxBBFH+0.net] >>750 捕捉程度のノリで書いた事に異様に突っ込んでくるなと思ってビックリしたんでね それも議題に上げたいのであれば>>740 でそういう書き方してるから
761 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 22:11:12.12 ID:EVjNfLc/0.net] >>751 前提として標準に準拠したほうが良いよね、という主張がある 標準では複数retなんて当たり前に使ってる それをなぜか否定しているので突っ込んだらローカルルールだ!と言われる そういうローカルルールがあるのは構わんが、それならそう明記しなきゃ標準に準拠しようという主張とズレてブレブレなだけでは? まさかレビューを受けたことがある、がうちにはそういうコーディング規約があるんです、の意味だったの?
762 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 22:16:38.50 ID:yrxBBFH+0.net] >>752 だから本気で否定したいなら739でもそうやって書いてるって言ってるやん 740で書いたのは「沢山return書いてる時点で可読性低い」みたいなツッコミが入るかなーと予測して"一応"と前置きして書いたと言っただろ そこを議論するつもりはないと書いたのに異様に拘るんだな
763 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 22:22:25.03 ID:kxXRvhGP0.net] 複数リターン禁止www
764 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 22:22:55.87 ID:o/YPVzQP0.net] >>749 正直俺も見たことないが、>>721 が書いてるんだからいるところにはいるんだろ 肝心なのはそいつが何を思ってそういうスタイルにしたのか察して評価してやることで、 >>730 みたいに重箱の隅突いて喜ぶのはただの地雷コーダーだからやめるべきだよ 例えば誰かが「ギブハブ」とか言ってても、わざわざ「ギブハブってなんだよバカかよ」と噛み付く必要はないだろ? GitHubなのは分かるし話は通じてるんだからこいつの中ではこうなのかと納得して「ほーん、ギブハブがどうした?」と聞き返すのが有能なんだよ
765 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 22:26:49.20 ID:EVjNfLc/0.net] >>753 意味がわからんけど補足がなけりゃツッコミなんてなかったんだよw こだわってるのはそっちでしょwこっちはそうですか、という感想しか無いよって言ってるやんw
766 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 22:38:58.86 ID:5TTB8+bC0.net] チャゲアスASUKAのギフハブに監視されてるネタに掛けてGitHubをギフハブと呼ぶのは5chの標準語だと俺も思ってたがそこまで浸透してないのか
767 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 22:42:09.42 ID:T9vV3uABa.net] なんとも不思議な世界があるんだなあ・・・・ TryGetValueを使うのが今どきの常識的なコーディングだと思ってた自分としては 老害(あるいは悪意があって不適切なコーディングを押し付けようとしてる人)が世迷言をほざいてるだけにしか見えないや
768 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 22:53:33.81 ID:yrxBBFH+0.net] >>755 その理屈で行くとコードレビューなんて出来なくなるな (これ明らかに意味のない文だけど何かスピリチュアル的な深い意味があるのだろうか…?配慮して指摘すべきではないか…?)なんて一々考察しなきゃいけないのかよ
769 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 23:00:13.09 ID:YUoXGIHl0.net] 了解
770 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 23:03:55.81 ID:YUoXGIHl0.net] >>754 MISRAにもあるし高信頼性を要求される場面ではそれなりにありがちな話だよ
771 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 23:14:22.90 ID:iy3zNsHi0.net] >>759 レビュー受けてるような新人はそんなこと考えなくていいと思うよ 多次元辞書でアクセスそのまま返す利点が分からないならまだお勉強段階なんだから、そういうやり方もあると素直に学んでおけば良い とりあえずチューニングはベテランがもっと後でやる仕事だから、パフォーマンスがーとか言い出すのは十年早い
772 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 23:30:20.42 ID:yrxBBFH+0.net] そう主張するのであれば具体的な利点を述べろよ TryGetValue派は俺以外にもメリット述べてる奴いるけどContainsKey派は「そのほうが見やすい」程度の個人の感想以上は出てきてない 勿論それもメリットではあるがTryGetValueの方が見やすいと言う人もいるのでそこでは差は付かない
773 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 23:51:14.64 ID:kxXRvhGP0.net] >>761 ねーよ
774 名前:デフォルトの名無しさん mailto:sage [2020/11/29(日) 23:59:15.56 ID:AAs5LLYH0.net] 宗教論争オモロイなw
775 名前:デフォルトの名無しさん mailto:sage [2020/11/30(月) 00:00:33.52 ID:n5NKB6GR0.net] >>763 しょうがないな こういうケースは極端化すれば明確になる dic.TryGetValue(a, out var dic2) dic2.TryGetValue(b, out var dic3) dic3.TryGetValue(c, out var dic4) dic4.TryGetValue(d, out var dic5) dic5.TryGetValue(e, out var value) vs var value = dic[a][b][c][d][e] とりあえず値の取得を比較した場合こうなる 非常に馬鹿げたコードだが後者の方が察しやすくバグりにくいのは分かるはず これは分岐を差し込んでも同じこと こんなコードは現実にあり得ないから無効と言い張るなら、所詮はその程度のレベルなんだから黙るべき
776 名前:デフォルトの名無しさん mailto:sage [2020/11/30(月) 00:20:59.97 ID:9x2/PpIx0.net] TryGetValue vs ContainsKey+[]の争いでしょ? なら下はちゃんと一つ一つにContainsKey挟むべき そして後者の方がバグりにくい理由が全く分からない。まず何のバグを対象としているのか明確に
777 名前:デフォルトの名無しさん mailto:sage [2020/11/30(月) 00:25:39.57 ID:G1P0/YpK0.net] レビューを受けるのが新人とか言ってる時点でまともじゃないでしょ いつの時代のエンジニア思想よw
778 名前:デフォルトの名無しさん mailto:sage [2020/11/30(月) 00:26:29.87 ID:E5czHbG2a.net] なんというかb7e4-nc77みたいなのがレビュアーやったら地獄だな 自分が新人だったらたまったもんじゃない
779 名前:デフォルトの名無しさん mailto:sage [2020/11/30(月) 00:36:41.15 ID:EEdVS6ls0.net] >>767 お前さんプログラマ向いてないから転職した方が良いよ、マジで ちゃんと理屈で教えられたことを受け付けないとか先が無さすぎる
780 名前:デフォルトの名無しさん mailto:sage [2020/11/30(月) 00:39:46.85 ID:qXuQLmTVa.net] どうせ過疎スレだからスレ消費するのは問題ないと思うけど あまりに下らな過ぎる論争で萎えるねw よく読んでないので素っ頓狂なこと言ってるかもしれないけど、 iniファイルぐらいなら馬鹿正直にDictionaryをネストなんかしなくても section+keyをキーにして平坦化しても良いような気もする