!extend:checked:vvvvv:1000:512
次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為)
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください
>>980を踏んだ人は新スレを建てて下さい。>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。
■前スレ
ふらっと C#,C♯,C#(初心者用) Part144
https://mevius.5ch.net/test/read.cgi/tech/1563258983/
■関連スレ
C#, C♯, C#相談室 Part95
https://mevius.5ch.net/test/read.cgi/tech/1508168482/
■コードを貼る場合は↓を使いましょう。
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/index
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
ふらっと C#,C♯,C#(初心者用) Part145
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 1e7b-qjLW)
2019/10/07(月) 20:16:17.93ID:9eyAES450794デフォルトの名無しさん (ブーイモ MMcb-+o02)
2019/11/22(金) 12:26:27.67ID:8PnAlYZlM 戻りの型名を普通に書くのがスマート
くだらないアイデアでコードを汚さないで
くだらないアイデアでコードを汚さないで
795776 (ワッチョイ 93bd-AvZR)
2019/11/22(金) 12:29:12.04ID:k4KfXICB0796776 (ワッチョイ 93bd-AvZR)
2019/11/22(金) 12:35:32.03ID:k4KfXICB0797デフォルトの名無しさん (ワッチョイ 1301-hZ32)
2019/11/22(金) 13:01:16.69ID:VuiommTl0 >>791
今どきのコンパイラでワンパスなんてないだろw
今どきのコンパイラでワンパスなんてないだろw
798デフォルトの名無しさん (ワッチョイ 3988-+jxl)
2019/11/22(金) 13:09:44.77ID:miLj5dAA0 な?名称が長いかどうかなんて関係ない質問なのに余計な単語から質問を始めるから周りが混乱する。
コメントで超長いクラス名とかまで書いてんじゃん
そんで指摘したらそーじゃねぇよ!ってあほかとwどんだけ説明下手くそなのw
コメントで超長いクラス名とかまで書いてんじゃん
そんで指摘したらそーじゃねぇよ!ってあほかとwどんだけ説明下手くそなのw
799デフォルトの名無しさん (アウアウウー Sa9d-927E)
2019/11/22(金) 13:09:46.78ID:fOeQA7sva800776 (ワッチョイ 93bd-AvZR)
2019/11/22(金) 13:22:21.21ID:k4KfXICB0 型推論ともちょっと違うからなあ
801デフォルトの名無しさん (ドコグロ MM63-5f43)
2019/11/22(金) 13:24:19.67ID:627roQa/M802デフォルトの名無しさん (ワッチョイ 1301-hZ32)
2019/11/22(金) 13:48:44.67ID:VuiommTl0803デフォルトの名無しさん (アウアウウー Sa9d-927E)
2019/11/22(金) 14:08:44.11ID:fOeQA7sva >>800
そうなの?w
// VLLCNじゃ何だかわからないので必要な場面で説明的な名前を与えるためだけのクラス
// 空っぽの継承のまま維持せよ。メンバ追加禁止!!!
class VeryLongLongClassName : VLLCN { private VeryLongLongClassName(){} }
// VeryLongLongClassNameの実体はこっち。
class VLLCN
{
....
}
まさかこんなのがお好みなのかなw
そうなの?w
// VLLCNじゃ何だかわからないので必要な場面で説明的な名前を与えるためだけのクラス
// 空っぽの継承のまま維持せよ。メンバ追加禁止!!!
class VeryLongLongClassName : VLLCN { private VeryLongLongClassName(){} }
// VeryLongLongClassNameの実体はこっち。
class VLLCN
{
....
}
まさかこんなのがお好みなのかなw
804デフォルトの名無しさん (ワッチョイ 3988-+jxl)
2019/11/22(金) 14:16:21.50ID:miLj5dAA0 自身のクラス返すときだけ利用したいんでしょ
tweenerみたいな設定が多いものをチェインメソッドで必要な設定を好きな順番で書くとか
他にはfactoryみたいなのをわかりやすくするとか
気持ちはわからんでもないけど局所的すぎると思う
tweenerみたいな設定が多いものをチェインメソッドで必要な設定を好きな順番で書くとか
他にはfactoryみたいなのをわかりやすくするとか
気持ちはわからんでもないけど局所的すぎると思う
805デフォルトの名無しさん (ワッチョイ b32d-gZQb)
2019/11/22(金) 14:17:29.50ID:k9hYLF030 .Net CoreからBitFlyerの認証が必要なWebAPIを使いたいんだけどさあ
業者は暗号化キーをソースコードやファイル等に保存しないよう求めてるんだけど、.Net Coreでキーを守る手段ってどういうのがあるの?
WindowsやmacOS付属の機能も使えなさそうだし、最終的に動かしたいLinuxなんかそもそもそんな機能がないし・・・・
ランタイムにもそんな機能なさそうだし、どうすればいいんだろ
業者は暗号化キーをソースコードやファイル等に保存しないよう求めてるんだけど、.Net Coreでキーを守る手段ってどういうのがあるの?
WindowsやmacOS付属の機能も使えなさそうだし、最終的に動かしたいLinuxなんかそもそもそんな機能がないし・・・・
ランタイムにもそんな機能なさそうだし、どうすればいいんだろ
806デフォルトの名無しさん (ブーイモ MMcb-+o02)
2019/11/22(金) 14:51:55.96ID:8PnAlYZlM ソースはともかくファイルに保存は普通にやるよ
リポジトリに機密情報をコミットしない、と勘違いしてないか?
リポジトリに機密情報をコミットしない、と勘違いしてないか?
807デフォルトの名無しさん (ワッチョイ 1301-hZ32)
2019/11/22(金) 15:31:23.92ID:VuiommTl0 >>804
> tweenerみたいな設定が多いものをチェインメソッドで必要な設定を好きな順番で書くとか
チェインメソッドってよく見かけるようになったけど見易いのかなぁ…
X.A( ).B( ).C( );
より
X.A( );
X.B( );
X.C( );
の方が見易いと思う俺は老害なんだろうか
> tweenerみたいな設定が多いものをチェインメソッドで必要な設定を好きな順番で書くとか
チェインメソッドってよく見かけるようになったけど見易いのかなぁ…
X.A( ).B( ).C( );
より
X.A( );
X.B( );
X.C( );
の方が見易いと思う俺は老害なんだろうか
808デフォルトの名無しさん (ワッチョイ 3988-+jxl)
2019/11/22(金) 16:18:12.63ID:miLj5dAA0809デフォルトの名無しさん (ワッチョイ 1301-hZ32)
2019/11/22(金) 16:37:13.07ID:VuiommTl0810デフォルトの名無しさん (ワッチョイ 132c-4eZD)
2019/11/22(金) 19:30:22.12ID:IgRfeEG+0 Groovy などでやる、フォームビルダーみたいに、
各コントロールのサイズ・色など、設定項目が多いものは、メソッドチェーンでは見にくい
各コントロールのサイズ・色など、設定項目が多いものは、メソッドチェーンでは見にくい
811デフォルトの名無しさん (ワッチョイ 7997-Rk0C)
2019/11/23(土) 02:25:29.33ID:LRCCNZf00 >>807
自分もそう思う
>>808
LINQでつなげる場合はLINQメソッドの戻り値を意識しながらつなげるわけだから、話が違うじゃん
list.Reversed().Select((v)=>v+1)みたいな例はデータをどんどん変換しているから良いと思うけど、
form.ForeColor(Color.Red).BackColor(Color.Black)みたいなやつは1行で書けるメリットがあるのはわかるけど、
やってることは関数じゃないのに関数っぽくっ振る舞ってるのがすごくモニョモニョする。
これが、
form.CopyWithForeColor(Color.Red).CopyWithBackColor(Color.Black)で別のformが2つ作られるとか、
form.ForeColorChanger(Color.Red)でForeColorChanger<Form>が生成されて、ApplyFormで元のFormに反映されるとか
ToFormで新しくフォームが作れるとかならわかるんだけど、
副作用のあるメソッドで、戻り値がvoidのやつはもったいないから、戻り値をthisにするってのがなんか受け付けないんだよな―。
自分もそう思う
>>808
LINQでつなげる場合はLINQメソッドの戻り値を意識しながらつなげるわけだから、話が違うじゃん
list.Reversed().Select((v)=>v+1)みたいな例はデータをどんどん変換しているから良いと思うけど、
form.ForeColor(Color.Red).BackColor(Color.Black)みたいなやつは1行で書けるメリットがあるのはわかるけど、
やってることは関数じゃないのに関数っぽくっ振る舞ってるのがすごくモニョモニョする。
これが、
form.CopyWithForeColor(Color.Red).CopyWithBackColor(Color.Black)で別のformが2つ作られるとか、
form.ForeColorChanger(Color.Red)でForeColorChanger<Form>が生成されて、ApplyFormで元のFormに反映されるとか
ToFormで新しくフォームが作れるとかならわかるんだけど、
副作用のあるメソッドで、戻り値がvoidのやつはもったいないから、戻り値をthisにするってのがなんか受け付けないんだよな―。
812デフォルトの名無しさん (ワッチョイ 9301-wiXz)
2019/11/23(土) 02:58:58.06ID:8xX8HZu80 DSLとしてどの程度価値があるのか次第だと思う
https://martinfowler.com/bliki/FluentInterface.html
LINQのように関数型ライクな関数合成をOOで表現する場合と
FluentなBuilderパターンは見た目は似てても中身と目的は違うよね
https://martinfowler.com/bliki/FluentInterface.html
LINQのように関数型ライクな関数合成をOOで表現する場合と
FluentなBuilderパターンは見た目は似てても中身と目的は違うよね
813デフォルトの名無しさん (ワッチョイ 6963-+jxl)
2019/11/23(土) 03:16:21.47ID:gK3OO6AB0 だから意味合いは違うって書いてんでしょうが
this返して繋げる前提ライブラリなんてよくあるし好き嫌いの範疇
君が嫌いならしなきゃ良いだけじゃん
俺だってC#のライブラリ作るとき設定するだけのメソッドでthisなんて返さないよ
それは俺が作るものが小さいものだからできるだけ標準に近いものが良いだろうってだけ
大きめのものでそれが全体を通して同じようにthis返す設計で、それを使うならなるべくその思想には従うかもしれん程度
this返して繋げる前提ライブラリなんてよくあるし好き嫌いの範疇
君が嫌いならしなきゃ良いだけじゃん
俺だってC#のライブラリ作るとき設定するだけのメソッドでthisなんて返さないよ
それは俺が作るものが小さいものだからできるだけ標準に近いものが良いだろうってだけ
大きめのものでそれが全体を通して同じようにthis返す設計で、それを使うならなるべくその思想には従うかもしれん程度
814デフォルトの名無しさん (アウアウウー Sa9d-927E)
2019/11/23(土) 04:29:53.39ID:1tUJgTKRa this返すお作法は昔のjava方面の文化じゃない?
C#は1.xの時代にMSか何かのガイドラインで「やるな」って書いてあったのを読んだ記憶がある。
個人的にそもそもそんなキモいことやらないよと思ったので禁止の理由までは覚えてないが。
C#は1.xの時代にMSか何かのガイドラインで「やるな」って書いてあったのを読んだ記憶がある。
個人的にそもそもそんなキモいことやらないよと思ったので禁止の理由までは覚えてないが。
815デフォルトの名無しさん (ワッチョイ 1301-hZ32)
2019/11/23(土) 08:12:23.68ID:IdTl1qyV0816デフォルトの名無しさん (ワッチョイ 5142-/L9V)
2019/11/23(土) 08:50:13.03ID:0TwI+VPl0 とは言え
X.A()?.B()?.C();
ならどうだろう?
X.A()?.B()?.C();
ならどうだろう?
817デフォルトの名無しさん (ワッチョイ 6963-+jxl)
2019/11/23(土) 11:11:29.56ID:gK3OO6AB0 意味合い違うものを出すのがおかしいなら807のレスがおかしいんだよ?
見やすいとか関係なくて776がこんな機能ないの?→無いよ→なんで欲しいの?→こういうのしたいんでしょ→見にくくね?気持ち悪くね?
って知るかよw
機能の話してんのになんで見易さの話にシフトすんだよ
見易さの話に変えられたので同じ表記の例示だしただけだし、そもそもlinqではないが採用してるライブラリも例示してんのになんでそこにこだわんの?w
見やすいとか関係なくて776がこんな機能ないの?→無いよ→なんで欲しいの?→こういうのしたいんでしょ→見にくくね?気持ち悪くね?
って知るかよw
機能の話してんのになんで見易さの話にシフトすんだよ
見易さの話に変えられたので同じ表記の例示だしただけだし、そもそもlinqではないが採用してるライブラリも例示してんのになんでそこにこだわんの?w
818デフォルトの名無しさん (アウアウイー Sa45-FRU3)
2019/11/23(土) 11:15:35.39ID:jZmYWOXfa おおもとの>>776や>>793の疑問についてはusingでエイリアスをつけて
『using [別名] = [VeryLongLongClassNameとか別名をつけたいクラス名];』と宣言して、
『[別名] Foo() { return this; }』みたいなメソッドの書き方することはできるし、
その別名に「This」を使ってるようなソースもたまに見かける
なんだけど・・・そもそも戻り値が特にないからとりあえず安易にthisを返すみたいな考え方は間違ってる
戻り値がないならvoidにして無駄な戻り値を返さない
そのクラスがBuilder的な使い方をするクラスである場合に限って、
そういうクラスであることをクラス名ほかで明示したうえで首尾一貫して全voidメソッドでthisを返す
>>782みたいな考え方で戻り値がthisなのか新しいインスタンスなのかブレるかもしれないのは論外
戻り値が後者なメソッドが混ざってると>>807の2種類の書き方で結果が同一にならなくなる
『using [別名] = [VeryLongLongClassNameとか別名をつけたいクラス名];』と宣言して、
『[別名] Foo() { return this; }』みたいなメソッドの書き方することはできるし、
その別名に「This」を使ってるようなソースもたまに見かける
なんだけど・・・そもそも戻り値が特にないからとりあえず安易にthisを返すみたいな考え方は間違ってる
戻り値がないならvoidにして無駄な戻り値を返さない
そのクラスがBuilder的な使い方をするクラスである場合に限って、
そういうクラスであることをクラス名ほかで明示したうえで首尾一貫して全voidメソッドでthisを返す
>>782みたいな考え方で戻り値がthisなのか新しいインスタンスなのかブレるかもしれないのは論外
戻り値が後者なメソッドが混ざってると>>807の2種類の書き方で結果が同一にならなくなる
819デフォルトの名無しさん (ブーイモ MMcb-+o02)
2019/11/23(土) 11:33:01.08ID:fy5uwVSkM Fluent apiってthisを返すことが目的じゃないからな
メソッドチェインで宣言的っぽくプログラミングするためのアイデアであってthisを返すメソッドはそのサブセットでしかない
世に出てるライブラリを見ればわかるがthis以外もバンバン返してる
だから作法としてとりあえずthisを返すなんてのは何もわかってない全く馬鹿げたことだ
先にFluent apiの設計をしなければならない
その設計に必要ならthisを返すメソッドを加えるだけだ
メソッドチェインで宣言的っぽくプログラミングするためのアイデアであってthisを返すメソッドはそのサブセットでしかない
世に出てるライブラリを見ればわかるがthis以外もバンバン返してる
だから作法としてとりあえずthisを返すなんてのは何もわかってない全く馬鹿げたことだ
先にFluent apiの設計をしなければならない
その設計に必要ならthisを返すメソッドを加えるだけだ
820デフォルトの名無しさん (ワッチョイ 1301-hZ32)
2019/11/23(土) 11:54:08.57ID:IdTl1qyV0821デフォルトの名無しさん (ワッチョイ 6963-+jxl)
2019/11/23(土) 12:07:14.69ID:gK3OO6AB0 >>820
話題を変えたから見た目の話してんのに機能面に難癖つけてるの分かってる?
見た目はこれと一緒、機能はちがうけどね
ってレスしたらそれは機能が違う!って戻してんじゃんw
見た目も機能も同じtweenerという例示
見た目の話に切り替えたので見た目は同じだが機能は異なるlinqという例示
念の為機能は異なることも明記した上での提示に対して機能面についてあーだこーだ言われてもねぇ
話題を変えたから見た目の話してんのに機能面に難癖つけてるの分かってる?
見た目はこれと一緒、機能はちがうけどね
ってレスしたらそれは機能が違う!って戻してんじゃんw
見た目も機能も同じtweenerという例示
見た目の話に切り替えたので見た目は同じだが機能は異なるlinqという例示
念の為機能は異なることも明記した上での提示に対して機能面についてあーだこーだ言われてもねぇ
822デフォルトの名無しさん (ワッチョイ 69a0-x9/g)
2019/11/23(土) 12:14:24.40ID:WMLRYpBj0 喧嘩すんなよ。
いろいろな観点から指摘が入って、設計やスタイルに関する考察が深まるのはいいことだ。
揚げ足取りとか噛み付きとか不毛だからやめような。
いろいろな観点から指摘が入って、設計やスタイルに関する考察が深まるのはいいことだ。
揚げ足取りとか噛み付きとか不毛だからやめような。
823デフォルトの名無しさん (ワッチョイ 9138-4UII)
2019/11/23(土) 12:25:25.02ID:2fNzxcKi0 コードレビューするなら
本質的な機能では無いのに戻り値返すのは利用者の理解を妨げる上に、バグの元にもなるので、余計な事すんなと言うな
あとから戻り値欲しくなった途端に困るやろ
本質的な機能では無いのに戻り値返すのは利用者の理解を妨げる上に、バグの元にもなるので、余計な事すんなと言うな
あとから戻り値欲しくなった途端に困るやろ
824デフォルトの名無しさん (ワッチョイ 6963-+jxl)
2019/11/23(土) 12:58:03.05ID:gK3OO6AB0 今までレスしてる中でthis返す設計に肯定的な姿勢なのは元の質問者である782だけ
C#標準にそういう設計は無いからその利用者の多くは否定的になる、俺も含めて
世の中いろんな設計指針があるし他言語の流儀を真似することもある
同じチームで開発することになるならその辺りはできるだけ同じ方向を向きたいけれど、そういうのじゃなければ最終的にはお好きなようにとなるよね
C#標準にそういう設計は無いからその利用者の多くは否定的になる、俺も含めて
世の中いろんな設計指針があるし他言語の流儀を真似することもある
同じチームで開発することになるならその辺りはできるだけ同じ方向を向きたいけれど、そういうのじゃなければ最終的にはお好きなようにとなるよね
825デフォルトの名無しさん (ワッチョイ 1301-hZ32)
2019/11/23(土) 13:19:13.45ID:IdTl1qyV0 >>821
バカなの?
> linqはパイプみたいに順次処理して行くからまだ理解できるんだけど
って書いてあるだろ
そういう必然性のない
> 設定が多いものをチェインメソッドで必要な設定を好きな順番で書く
を同一視してるのがおかしいの
わかった?
バカなの?
> linqはパイプみたいに順次処理して行くからまだ理解できるんだけど
って書いてあるだろ
そういう必然性のない
> 設定が多いものをチェインメソッドで必要な設定を好きな順番で書く
を同一視してるのがおかしいの
わかった?
826デフォルトの名無しさん (ワッチョイ 6963-+jxl)
2019/11/23(土) 13:30:54.32ID:gK3OO6AB0827デフォルトの名無しさん (アウアウイー Sa45-FRU3)
2019/11/23(土) 13:39:42.87ID:jZmYWOXfa 揚げ足取りだけど&Javaからの輸入だけど
>C#標準
つStringBuilder
もっとも自分でコード書くなら(変数名が短い前提で)メソッドチェーンにはしないけど
「文字列組み立ての順序を明示する」意図でメソッドチェーンで書くのはまあ理解できる
>C#標準
つStringBuilder
もっとも自分でコード書くなら(変数名が短い前提で)メソッドチェーンにはしないけど
「文字列組み立ての順序を明示する」意図でメソッドチェーンで書くのはまあ理解できる
828デフォルトの名無しさん (ワッチョイ 6963-+jxl)
2019/11/23(土) 13:44:55.41ID:gK3OO6AB0 linqもtweenerみたなのもメソッドをドットでつなげて表記する
データを加工して流すものとthisを返すものという機能面では全く異なるもの
機能と見た目を完全に切り離せるわけではないので、その見た目から機能面を理解しづらい=可読性に影響があるという議題は残るものの、どちらも利用する上での表記は同じ
ただこれだけで当初から機能は異なることを明記してるのになんで機能違うじゃねーか!みたいなすでに注釈してる内容に噛み付いてくるんだ
データを加工して流すものとthisを返すものという機能面では全く異なるもの
機能と見た目を完全に切り離せるわけではないので、その見た目から機能面を理解しづらい=可読性に影響があるという議題は残るものの、どちらも利用する上での表記は同じ
ただこれだけで当初から機能は異なることを明記してるのになんで機能違うじゃねーか!みたいなすでに注釈してる内容に噛み付いてくるんだ
829デフォルトの名無しさん (ワッチョイ 6963-+jxl)
2019/11/23(土) 13:48:34.67ID:gK3OO6AB0830デフォルトの名無しさん (ドコグロ MM63-hZ32)
2019/11/23(土) 14:30:45.15ID:1F/kr+dxM831デフォルトの名無しさん (ワッチョイ 69a0-x9/g)
2019/11/23(土) 14:39:10.21ID:WMLRYpBj0 >>827
fact を提示するのは揚げ足取りではないと思うよ。
return this は言われるほど悪いものではないと個人的には思う。が、メソッドチェーンにする価値は LINQ に比べるとさしてないという意見にも同意。
fact を提示するのは揚げ足取りではないと思うよ。
return this は言われるほど悪いものではないと個人的には思う。が、メソッドチェーンにする価値は LINQ に比べるとさしてないという意見にも同意。
832デフォルトの名無しさん (ワッチョイ 6963-+jxl)
2019/11/23(土) 14:40:26.89ID:gK3OO6AB0 >>830
うん、使わなくてよくね?
使うべきとも使ったほうが良いとも書いてない
そういうライブラリがこの世に多少は存在することを例示しただけ
そもそも俺自身がthis返す設計に否定的だって何度も書いてるんだけど読んでる?
うん、使わなくてよくね?
使うべきとも使ったほうが良いとも書いてない
そういうライブラリがこの世に多少は存在することを例示しただけ
そもそも俺自身がthis返す設計に否定的だって何度も書いてるんだけど読んでる?
833デフォルトの名無しさん (ワッチョイ 9301-wiXz)
2019/11/23(土) 15:10:38.43ID:8xX8HZu80 他言語だけどスクレイピングでよく使う
browser
.GotoHome()
.Login()
.DoSomething()
.DoAnother()
.SkipSomething()
.PrintResult()
コンテキストのつながりが自分にとって自然で
各メソッドを部品としてチェリーピックして使うような場合は
読みやすくなると思ってる
結局 return thisの是非じゃなく
メソッドチェーンでつないでいくのが適してる用途なのか
そうじゃないのかの話だよねこれ
browser
.GotoHome()
.Login()
.DoSomething()
.DoAnother()
.SkipSomething()
.PrintResult()
コンテキストのつながりが自分にとって自然で
各メソッドを部品としてチェリーピックして使うような場合は
読みやすくなると思ってる
結局 return thisの是非じゃなく
メソッドチェーンでつないでいくのが適してる用途なのか
そうじゃないのかの話だよねこれ
834デフォルトの名無しさん (ワッチョイ 1301-hZ32)
2019/11/23(土) 15:17:05.69ID:IdTl1qyV0835デフォルトの名無しさん (ワッチョイ 6963-+jxl)
2019/11/23(土) 16:24:36.28ID:gK3OO6AB0 なんか絡まれたから対応したら君の意見はどうでもいいって…
じゃあなんで絡んだんだよw
じゃあなんで絡んだんだよw
836デフォルトの名無しさん (アウアウエー Sae3-+o02)
2019/11/23(土) 16:33:18.34ID:i26Fm466a VBのWithみたいなことやりたいって理由でthis返すんなら最低だな
837デフォルトの名無しさん (ワッチョイ 1301-hZ32)
2019/11/23(土) 17:56:40.63ID:IdTl1qyV0 >>835
> じゃあなんで絡んだんだよw
ちゃんと書いてあるだろ…
> 必然性の有無にも気づけずにLinqガーとかいうアホがいたって話だしw
見た目の話だけなら個人の好みだから人それぞれでいいけどLinqとかの必然性があるものを持って来られても困る
> じゃあなんで絡んだんだよw
ちゃんと書いてあるだろ…
> 必然性の有無にも気づけずにLinqガーとかいうアホがいたって話だしw
見た目の話だけなら個人の好みだから人それぞれでいいけどLinqとかの必然性があるものを持って来られても困る
838デフォルトの名無しさん (ワッチョイ 6963-+jxl)
2019/11/23(土) 18:13:01.41ID:gK3OO6AB0 >>837
いや、だからなんで俺の意見はどうでも良いはずなのに未だに絡むの?
何を説明しようがどうでもいいで片付けるんだから話にならないじゃんw
もう一回説明しようか?
linqと見た目が一緒、機能は異なる
ただそれだけなんだけど伝わらない?これも意見だからどうでも良いんだと思うけど
ずーっとこう主張してるのになんでlinqは必然性があるから良いんだ!みたいな頓珍漢な絡みするの?
いや、だからなんで俺の意見はどうでも良いはずなのに未だに絡むの?
何を説明しようがどうでもいいで片付けるんだから話にならないじゃんw
もう一回説明しようか?
linqと見た目が一緒、機能は異なる
ただそれだけなんだけど伝わらない?これも意見だからどうでも良いんだと思うけど
ずーっとこう主張してるのになんでlinqは必然性があるから良いんだ!みたいな頓珍漢な絡みするの?
839デフォルトの名無しさん (ワッチョイ 1301-hZ32)
2019/11/23(土) 18:19:16.92ID:IdTl1qyV0840デフォルトの名無しさん (ワッチョイ 6963-+jxl)
2019/11/23(土) 18:31:57.35ID:gK3OO6AB0 >>839
いや、だからそんなことわかりきってるよw
807で君が言った内容に対して表記が同じとしか言ってない
ちゃんと機能が異なることを追記した上で同じ表記だね、って言っただけでしょ?
それに対して延々と同じ内容で煽り続けてるんだよ?
linqは意味が違うよっていう808からの始まった内容に対してlinqは意味が違う!馬鹿なの?って
もっかい始めの方からレス内容確認したほうが良いよ
言葉尻捕まえて煽るだけで引っ込みつかなくなってるのはたぶん君の方だよ
いや、だからそんなことわかりきってるよw
807で君が言った内容に対して表記が同じとしか言ってない
ちゃんと機能が異なることを追記した上で同じ表記だね、って言っただけでしょ?
それに対して延々と同じ内容で煽り続けてるんだよ?
linqは意味が違うよっていう808からの始まった内容に対してlinqは意味が違う!馬鹿なの?って
もっかい始めの方からレス内容確認したほうが良いよ
言葉尻捕まえて煽るだけで引っ込みつかなくなってるのはたぶん君の方だよ
841デフォルトの名無しさん (ワッチョイ 8901-r6xQ)
2019/11/23(土) 18:40:43.12ID:FJ5K4BwR0 判った。LINQ宗教だ
842デフォルトの名無しさん (ワッチョイ 1301-hZ32)
2019/11/23(土) 18:41:15.69ID:IdTl1qyV0 もう堂々巡りにして引き分けに持ち込もうと必死だな
Linqならメソッドチェーンにする意味があるから
> tweenerみたいな設定が多いもの
と一緒にされても困るって何度書いても同じこと書いてくるんだろうなw
Linqならメソッドチェーンにする意味があるから
> tweenerみたいな設定が多いもの
と一緒にされても困るって何度書いても同じこと書いてくるんだろうなw
843デフォルトの名無しさん (ワッチョイ 6963-+jxl)
2019/11/23(土) 18:46:16.32ID:gK3OO6AB0 機能の話から表記の話なってまた機能の話に戻す
表記の話のときに表記が同じ例を提示すると機能が違うんだから同じにすんな!
ってそりゃそうですよね、機能は違うってみんな言ってますもん
機能が同じだなんてレスどこにありました?
表記の話のときに表記が同じ例を提示すると機能が違うんだから同じにすんな!
ってそりゃそうですよね、機能は違うってみんな言ってますもん
機能が同じだなんてレスどこにありました?
844デフォルトの名無しさん (ワッチョイ 6963-+jxl)
2019/11/23(土) 19:45:54.89ID:gK3OO6AB0 804:機能の話
807:機能から発展した表記の話
808:表記の類似例の提示
811:機能ちげーじゃんというツッコミ
813:そうだよ機能は違うよという返し
ここから延々、表記の類似例に対して機能が違うじゃんというツッコミ
811は807とは違う人だけどね
807でも機能の話をしてたと言うなら俺の読解力が悪かった
表記の話であることを明確にするために808に意味合いが異なると注記したつもりではあった
今見返しても表記に関しての話題転換にしか見えないけど
807:機能から発展した表記の話
808:表記の類似例の提示
811:機能ちげーじゃんというツッコミ
813:そうだよ機能は違うよという返し
ここから延々、表記の類似例に対して機能が違うじゃんというツッコミ
811は807とは違う人だけどね
807でも機能の話をしてたと言うなら俺の読解力が悪かった
表記の話であることを明確にするために808に意味合いが異なると注記したつもりではあった
今見返しても表記に関しての話題転換にしか見えないけど
845デフォルトの名無しさん (ワッチョイ 13a7-Xt/m)
2019/11/23(土) 19:53:56.23ID:1OCMO4gt0 linqなんてゴミだろ
846デフォルトの名無しさん (ワッチョイ 13a7-Xt/m)
2019/11/23(土) 19:58:41.98ID:1OCMO4gt0 LINQ友の会スレ消えちゃった?(核爆)
847デフォルトの名無しさん (ワッチョイ f963-kgoK)
2019/11/23(土) 19:59:21.32ID:4Ca6PtTC0 ゴミのような時間の使い方をしている人らとはどっこいどっこいって感じよ
848デフォルトの名無しさん (ワッチョイ 1301-hZ32)
2019/11/23(土) 19:59:52.48ID:IdTl1qyV0 まだ言ってるのかよw
> 機能が違うからダメと言うより必要もないのにチェインメソッド使わなくても良くね?
> って話な
って書いてあるのに「機能が違う」を連呼するしかない脳無し乙
> 機能が違うからダメと言うより必要もないのにチェインメソッド使わなくても良くね?
> って話な
って書いてあるのに「機能が違う」を連呼するしかない脳無し乙
849デフォルトの名無しさん (ワッチョイ 7117-/L9V)
2019/11/23(土) 20:07:04.96ID:Q44dea670 >>1
>なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
>C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください
ID真っ赤にしている人はコレ100回読んでね
>なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
>C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください
ID真っ赤にしている人はコレ100回読んでね
850デフォルトの名無しさん (ワッチョイ 69a0-x9/g)
2019/11/23(土) 20:20:39.76ID:WMLRYpBj0 お互い口汚く罵るのはやめよう。どちらも有益な情報を持ち込み、スレに貢献してると思うよ。
>>844
機能と表記の 2 観点からの考察ありがとう。君の主張は首尾一貫していて妥当だと思うよ。
私は return this 完全否定はしないけどね。
>>842
tweener なるものが何か知らないのだが、設定の手数の観点で C# と比較できるものではないということはわかった。ありがとう。
私が return this を時折使う理由も設定の手数あたりにあるかもしれないと思った。
変数宣言&インスタンス初期化を “本処理とは分けて” ワンライナーで書きたいのだが、初期化の手数が多いときに return this 使うよ。
var a = new ClassA().Init1().Init2().Init3();
var b = new ClassB().Init(a);
// a, b, その他の変数を用いた本処理
という感じで。
初期化と本処理をごちゃ混ぜに書くと本処理の本質が見えづらくなるため好きではないし、if, for などで新しいブロックが出てくるわけでもないのにコンテクストの途中で新規変数宣言するのも好きではない。純粋に表記スタイルの (好みの) 話。
>>844
機能と表記の 2 観点からの考察ありがとう。君の主張は首尾一貫していて妥当だと思うよ。
私は return this 完全否定はしないけどね。
>>842
tweener なるものが何か知らないのだが、設定の手数の観点で C# と比較できるものではないということはわかった。ありがとう。
私が return this を時折使う理由も設定の手数あたりにあるかもしれないと思った。
変数宣言&インスタンス初期化を “本処理とは分けて” ワンライナーで書きたいのだが、初期化の手数が多いときに return this 使うよ。
var a = new ClassA().Init1().Init2().Init3();
var b = new ClassB().Init(a);
// a, b, その他の変数を用いた本処理
という感じで。
初期化と本処理をごちゃ混ぜに書くと本処理の本質が見えづらくなるため好きではないし、if, for などで新しいブロックが出てくるわけでもないのにコンテクストの途中で新規変数宣言するのも好きではない。純粋に表記スタイルの (好みの) 話。
851デフォルトの名無しさん (ワッチョイ 93bd-AvZR)
2019/11/23(土) 20:21:25.84ID:zU8fto2w0 まあLINQはさておき
前者と後者じゃ後者のほうがスッキリして見える場合もあるんじゃないかなとは思う
hoge.foo();
hoge.bar();
hoge.baz();
hoge.quz();
hoge
.foo()
.bar()
.baz()
.quz();
セミコロン必須の言語やif文とは相性そんなに良くないけどさ
前者と後者じゃ後者のほうがスッキリして見える場合もあるんじゃないかなとは思う
hoge.foo();
hoge.bar();
hoge.baz();
hoge.quz();
hoge
.foo()
.bar()
.baz()
.quz();
セミコロン必須の言語やif文とは相性そんなに良くないけどさ
852デフォルトの名無しさん (ワッチョイ 6963-+jxl)
2019/11/23(土) 20:27:14.79ID:gK3OO6AB0 >>850
tweenerはたぶんゲーム分野とかで使うことが多いと思うけど表示物のアニメーション制御に使うようなライブラリを指して言った
最近はweb系もアニメーションには富んでるからそっちにも似たようなものはある
表示物のx座標をaからbにc秒かけて移動させる、そのときd秒遅れてアニメーションを開始して終了後にe関数を呼ぶ
みたいな設定をするのに使う
tweenerはたぶんゲーム分野とかで使うことが多いと思うけど表示物のアニメーション制御に使うようなライブラリを指して言った
最近はweb系もアニメーションには富んでるからそっちにも似たようなものはある
表示物のx座標をaからbにc秒かけて移動させる、そのときd秒遅れてアニメーションを開始して終了後にe関数を呼ぶ
みたいな設定をするのに使う
853デフォルトの名無しさん (ワッチョイ 1901-xPlI)
2019/11/23(土) 20:32:13.74ID:lT+2m/c90 >>851
疑似with構文ってとこかな?
疑似with構文ってとこかな?
854デフォルトの名無しさん (オッペケ Src5-BEIG)
2019/11/23(土) 21:28:03.06ID:o0OxBnlFr c#の先祖に当たるdelphiではwithがあったがC#で亡くなった
855デフォルトの名無しさん (アウアウウー Sa9d-927E)
2019/11/23(土) 21:33:29.44ID:TBCDcXkja まあ罵倒は見てて見苦しいねw
thisを返す手法に違和感を感じる人(自分もその一人)が多いのは、
(1) シグジェチャだけではメソッドが返す値がthisなのか別のインスタンスなのか分からない
(2) チェーンさせる目的でthisを返すのは意味論(メソッド名はそのメソッドの機能を表現する)を破壊する
こんなところか。
本来は必用なら言語レベルで実現すべき機能なんだろうね。
でもC#erってVBのWithブロックには否定的な人が多かったよな
thisを返す手法に違和感を感じる人(自分もその一人)が多いのは、
(1) シグジェチャだけではメソッドが返す値がthisなのか別のインスタンスなのか分からない
(2) チェーンさせる目的でthisを返すのは意味論(メソッド名はそのメソッドの機能を表現する)を破壊する
こんなところか。
本来は必用なら言語レベルで実現すべき機能なんだろうね。
でもC#erってVBのWithブロックには否定的な人が多かったよな
856デフォルトの名無しさん (ワッチョイ 13b9-0DuE)
2019/11/23(土) 22:00:39.91ID:6Id8VYs40 相談させてください。
以下のようなクラスを作りたいと考えています。
class MyStaticClass1
{
static double HighCostMethod() { ... }
public static double X = Math.Sign(HighCostMethod());
public static double Y = Math.Abs(HighCostMethod());
}
しかし高コストな HighCostMethod を2回も呼びだすのは無駄なので
以下のように改良しました。
class MyStaticClass2
{
static double HighCostMethod() { ... }
public static double X, Y;
static MyStaticClass2()
{
var v = HighCostMethod();
X = Math.Sign(v);
Y = Math.Abs(v);
}
}
ところがこのコードは規則 CA1810 に違反すると警告が表示されました。
静的コンストラクターにはパフォーマンス上の欠点があるようなのです。
【CA1810 参照型の静的フィールドをインラインで初期化します - Visual Studio Microsoft Docs】
https://docs.microsoft.com/ja-jp/visualstudio/code-quality/ca1810?view=vs-2019
(続く)
以下のようなクラスを作りたいと考えています。
class MyStaticClass1
{
static double HighCostMethod() { ... }
public static double X = Math.Sign(HighCostMethod());
public static double Y = Math.Abs(HighCostMethod());
}
しかし高コストな HighCostMethod を2回も呼びだすのは無駄なので
以下のように改良しました。
class MyStaticClass2
{
static double HighCostMethod() { ... }
public static double X, Y;
static MyStaticClass2()
{
var v = HighCostMethod();
X = Math.Sign(v);
Y = Math.Abs(v);
}
}
ところがこのコードは規則 CA1810 に違反すると警告が表示されました。
静的コンストラクターにはパフォーマンス上の欠点があるようなのです。
【CA1810 参照型の静的フィールドをインラインで初期化します - Visual Studio Microsoft Docs】
https://docs.microsoft.com/ja-jp/visualstudio/code-quality/ca1810?view=vs-2019
(続く)
857デフォルトの名無しさん (ワッチョイ 13b9-0DuE)
2019/11/23(土) 22:01:03.42ID:6Id8VYs40 (続き)
そこでさらに次のように改良したところ、無事警告は表示されなくなりました。
class MyStaticClass3
{
static double HighCostMethod() { ... }
public static double X = Initialiser.Instance.X;
public static double Y = Initialiser.Instance.Y;
class Initialiser
{
public static Initialiser Instance = new Initialiser();
public double X, Y;
Initialiser()
{
var v = HighCostMethod();
X = Math.Sign(v);
Y = Math.Abs(v);
}
}
}
ただ、クラス初期化時のパフォーマンス上の問題を解消するために
さらに別のクラスを定義するのは本末転倒な気もします。
私のアプローチは正しいのでしょうか。
それとも素直に CA1810 の警告表示を抑制すべきでしょうか。
もしくは、別のもっとスマートな解決策があるのでしょうか。
アドバイス等をいただけると嬉しく思います。よろしくお願いいたします。
そこでさらに次のように改良したところ、無事警告は表示されなくなりました。
class MyStaticClass3
{
static double HighCostMethod() { ... }
public static double X = Initialiser.Instance.X;
public static double Y = Initialiser.Instance.Y;
class Initialiser
{
public static Initialiser Instance = new Initialiser();
public double X, Y;
Initialiser()
{
var v = HighCostMethod();
X = Math.Sign(v);
Y = Math.Abs(v);
}
}
}
ただ、クラス初期化時のパフォーマンス上の問題を解消するために
さらに別のクラスを定義するのは本末転倒な気もします。
私のアプローチは正しいのでしょうか。
それとも素直に CA1810 の警告表示を抑制すべきでしょうか。
もしくは、別のもっとスマートな解決策があるのでしょうか。
アドバイス等をいただけると嬉しく思います。よろしくお願いいたします。
858デフォルトの名無しさん (ワッチョイ 6963-+jxl)
2019/11/23(土) 22:01:38.76ID:gK3OO6AB0 俺自身もthis返す設計に否定的で813で明確に表明してるんだけどねw
850の初期化の例みたいなのもC#ではメソッドに引数名を指定して呼び出すことができる機能があるからそれで事足りる
引数の数が多くなったりオプション引数使えば更に長くなったり呼び出し側も見た目はスマートとは言えないような書き方になったりするんで多用は避けたいところだけど局所的な利用なら無しでは無い気もする
まぁ設定用の構造体作って渡すとかjson等をシリアライズしたものを渡すとかのほうがいいんじゃない?とは思う
850の初期化の例みたいなのもC#ではメソッドに引数名を指定して呼び出すことができる機能があるからそれで事足りる
引数の数が多くなったりオプション引数使えば更に長くなったり呼び出し側も見た目はスマートとは言えないような書き方になったりするんで多用は避けたいところだけど局所的な利用なら無しでは無い気もする
まぁ設定用の構造体作って渡すとかjson等をシリアライズしたものを渡すとかのほうがいいんじゃない?とは思う
859デフォルトの名無しさん (ワッチョイ 132c-4eZD)
2019/11/23(土) 22:08:25.71ID:fygFNKSM0 >>856
>高コストな HighCostMethod を2回も呼びだすのは無駄なので
典型的なシングルトン。
データベースマネージャーとか、何かを管理するクラスは、基本的に1回しか実行しない
init( ) みたいな、特別な関数でしかnew できない。
通常の方法では、newできないように、エラーになるように作る
>高コストな HighCostMethod を2回も呼びだすのは無駄なので
典型的なシングルトン。
データベースマネージャーとか、何かを管理するクラスは、基本的に1回しか実行しない
init( ) みたいな、特別な関数でしかnew できない。
通常の方法では、newできないように、エラーになるように作る
860デフォルトの名無しさん (ワッチョイ 9301-wiXz)
2019/11/23(土) 22:09:46.52ID:8xX8HZu80861デフォルトの名無しさん (アウアウウー Sa9d-Q1nT)
2019/11/23(土) 22:14:33.73ID:IgdFxqh4a >>856
private static double Cache = HighCostMethod();
public static double X = Math.Sign(Cache);
public static double Y = Math.Abs(Cache);
みたいに一旦結果を受けるものを作れば回避できそう
private static double Cache = HighCostMethod();
public static double X = Math.Sign(Cache);
public static double Y = Math.Abs(Cache);
みたいに一旦結果を受けるものを作れば回避できそう
862デフォルトの名無しさん (ワッチョイ 13b9-0DuE)
2019/11/23(土) 22:25:20.74ID:6Id8VYs40 >>859
レスありがとうございます。
おっしゃるとおり、シングルトンを使えば問題は解決するだろうと考えて
作成したのが MyStaticClass3 なのですが、
MyStaticClass3 が MyStaticClass2 よりも
パフォーマンス的に優れていると考えられなくて
質問させていただきました。
> init( ) みたいな、特別な関数でしかnew できない。
> 通常の方法では、newできないように、エラーになるように作る
ここで説明していただいているお話と
MyStaticClass3 の中身の違いがよく理解できていないので
詳しく教えていただけないでしょうか。
よろしくお願いいたします。
>>860
レスありがとうございます。
HighCostMethod()の結果をキャッシュするための装置として
MyStaticClass3.Initializer を作ったつもりなのですが、
改良点などがあればご指摘いただけると幸いです。
よろしくお願いいたします。
>>861
なるほど!レスありがとうございます。
ただ、一時的に値を保持するためにフィールドを使うのは
少し抵抗があるきもするのですが、よく使われる手法なのでしょうか。
また、一つのクラスを複数ファイルに分けて記述できることを考えると、
フィールドの初期化は必ず上から順に行われることが
保証されているのかということについても少し不安があるのですが、
もし何か参考資料などをご存知なら教えていただけると嬉しく思います。
よろしくお願いいたします。
レスありがとうございます。
おっしゃるとおり、シングルトンを使えば問題は解決するだろうと考えて
作成したのが MyStaticClass3 なのですが、
MyStaticClass3 が MyStaticClass2 よりも
パフォーマンス的に優れていると考えられなくて
質問させていただきました。
> init( ) みたいな、特別な関数でしかnew できない。
> 通常の方法では、newできないように、エラーになるように作る
ここで説明していただいているお話と
MyStaticClass3 の中身の違いがよく理解できていないので
詳しく教えていただけないでしょうか。
よろしくお願いいたします。
>>860
レスありがとうございます。
HighCostMethod()の結果をキャッシュするための装置として
MyStaticClass3.Initializer を作ったつもりなのですが、
改良点などがあればご指摘いただけると幸いです。
よろしくお願いいたします。
>>861
なるほど!レスありがとうございます。
ただ、一時的に値を保持するためにフィールドを使うのは
少し抵抗があるきもするのですが、よく使われる手法なのでしょうか。
また、一つのクラスを複数ファイルに分けて記述できることを考えると、
フィールドの初期化は必ず上から順に行われることが
保証されているのかということについても少し不安があるのですが、
もし何か参考資料などをご存知なら教えていただけると嬉しく思います。
よろしくお願いいたします。
863デフォルトの名無しさん (ワッチョイ 1301-hZ32)
2019/11/23(土) 22:40:06.43ID:IdTl1qyV0 >>851
そう、そう言う風に純粋に見た目の話をしてるのにチェインメソッドにするしかない(まあ一旦変数に受けりゃいいんだけど流石にそれはねぇ)Linqを出されてもねぇ
Linqをバカにされたとでも思ったのかな?
それはさておき、たしかに同じ変数を何度も書かされるのはなんとなく冗長な感じがするからWith文みたいなのが欲しいのは理解できる
そのうちオブジェクト初期化子でメソッドが呼び出せるようになったりして
var a = new ClassA().Init1().Init2().Init3();
var b = new ClassB().Init(a);
↓
var b = new ClassB(){
Init(new ClassA(){ Init1(), Init2(), Init3() })
};
そう、そう言う風に純粋に見た目の話をしてるのにチェインメソッドにするしかない(まあ一旦変数に受けりゃいいんだけど流石にそれはねぇ)Linqを出されてもねぇ
Linqをバカにされたとでも思ったのかな?
それはさておき、たしかに同じ変数を何度も書かされるのはなんとなく冗長な感じがするからWith文みたいなのが欲しいのは理解できる
そのうちオブジェクト初期化子でメソッドが呼び出せるようになったりして
var a = new ClassA().Init1().Init2().Init3();
var b = new ClassB().Init(a);
↓
var b = new ClassB(){
Init(new ClassA(){ Init1(), Init2(), Init3() })
};
864デフォルトの名無しさん (アウアウウー Sa9d-927E)
2019/11/23(土) 22:41:20.33ID:TBCDcXkja VS2015だとCA1810 なんか出ないなw
出るとしても警告を抑止して問題ないケースだと思うけど
出るとしても警告を抑止して問題ないケースだと思うけど
865デフォルトの名無しさん (ワッチョイ 9301-wiXz)
2019/11/23(土) 22:43:26.64ID:8xX8HZu80 >>862
XやYをプロパティにしてキャッシュがあるかどうか確認してなければHighCostを呼ぶ
じゃなければLazy<T>使う
https://dotnetfiddle.net/0dQM8v
https://docs.microsoft.com/en-us/dotnet/framework/performance/lazy-initialization
XやYをプロパティにしてキャッシュがあるかどうか確認してなければHighCostを呼ぶ
じゃなければLazy<T>使う
https://dotnetfiddle.net/0dQM8v
https://docs.microsoft.com/en-us/dotnet/framework/performance/lazy-initialization
866デフォルトの名無しさん (ワッチョイ 13a7-Xt/m)
2019/11/23(土) 22:50:14.45ID:1OCMO4gt0 stringのreplaceとか別のインスタンスじゃん
こういうのと仕様が違うの作っちゃうの嫌だな
こういうのは多数派に合わせる感じで
こういうのと仕様が違うの作っちゃうの嫌だな
こういうのは多数派に合わせる感じで
867デフォルトの名無しさん (アウアウウー Sa9d-Q1nT)
2019/11/23(土) 22:50:15.57ID:IgdFxqh4a >>862
「一つのクラスを複数ファイルに分けて記述できること」はpartial classを指していると思うんだけど、その場合はちょっと分からん
ただpartialでない普通のクラスの場合は、初期化は記述順(上から順)に行われることが保証されている
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/classes#fields
> The static field variable initializers of a class correspond to a sequence of assignments that are executed in the textual order in which they appear in the class declaration
「一つのクラスを複数ファイルに分けて記述できること」はpartial classを指していると思うんだけど、その場合はちょっと分からん
ただpartialでない普通のクラスの場合は、初期化は記述順(上から順)に行われることが保証されている
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/classes#fields
> The static field variable initializers of a class correspond to a sequence of assignments that are executed in the textual order in which they appear in the class declaration
868デフォルトの名無しさん (アウアウウー Sa9d-927E)
2019/11/23(土) 23:07:33.85ID:TBCDcXkja これはOKみたい。
static double x;
static double y =
(
(Func<double>)
(
() =>
{
var v = HighCostMethod();
x = Math.Sign(v);
return Math.Abs(v);
}
)
)();
もちろん俺ならこんなことしないw
素直に警告無視or抑止するのが一番いい。
無駄なことして可読性落とすなんて愚の骨頂
static double x;
static double y =
(
(Func<double>)
(
() =>
{
var v = HighCostMethod();
x = Math.Sign(v);
return Math.Abs(v);
}
)
)();
もちろん俺ならこんなことしないw
素直に警告無視or抑止するのが一番いい。
無駄なことして可読性落とすなんて愚の骨頂
869デフォルトの名無しさん (ワッチョイ 13b9-0DuE)
2019/11/23(土) 23:15:13.03ID:6Id8VYs40 >>864
情報どうもありがとうございます。
Visual Studio のバージョンに依存する話だったのですね。
私は Visual Studio 2019 (Version 16.3.10) を使っています。
情報が後出しになってしまい失礼いたしました。
> 出るとしても警告を抑止して問題ないケースだと思うけど
ご意見ありがとうございます。 >>856 に貼り付けたリンクの先にも
「パフォーマンスが問題にならない場合は、このルールの警告を抑制しても安全です。」
と書いてありますし、やはり抑制が最善の方法であるような気もしてきました。
>>865
> プロパティ
アドバイスどうもありがとうございます。
string.Empty の様に、プロパティである必要がないものは
フィールドにしたほうがパフォーマンス的に有利かと思って
そのようにしていたのですが、確かにプロパティが一番真っ当ですね。
> Lazy<T>
ありがとうございます。ただ、私の考える限り以下のような方法しが思いつかず、
だったら >>861 に書いていただいたもので良いのではと思ってしまうのですが、
もし Lazy<T> を使った別の方法があれば詳しく教えていただけると嬉しく思います。
static Lazy<double> Cache = new Lazy<double>(HighCostMethod);
public static double X = Math.Sign(Cache.Value);
public static double Y = Math.Abs(Cache.Value);
情報どうもありがとうございます。
Visual Studio のバージョンに依存する話だったのですね。
私は Visual Studio 2019 (Version 16.3.10) を使っています。
情報が後出しになってしまい失礼いたしました。
> 出るとしても警告を抑止して問題ないケースだと思うけど
ご意見ありがとうございます。 >>856 に貼り付けたリンクの先にも
「パフォーマンスが問題にならない場合は、このルールの警告を抑制しても安全です。」
と書いてありますし、やはり抑制が最善の方法であるような気もしてきました。
>>865
> プロパティ
アドバイスどうもありがとうございます。
string.Empty の様に、プロパティである必要がないものは
フィールドにしたほうがパフォーマンス的に有利かと思って
そのようにしていたのですが、確かにプロパティが一番真っ当ですね。
> Lazy<T>
ありがとうございます。ただ、私の考える限り以下のような方法しが思いつかず、
だったら >>861 に書いていただいたもので良いのではと思ってしまうのですが、
もし Lazy<T> を使った別の方法があれば詳しく教えていただけると嬉しく思います。
static Lazy<double> Cache = new Lazy<double>(HighCostMethod);
public static double X = Math.Sign(Cache.Value);
public static double Y = Math.Abs(Cache.Value);
870デフォルトの名無しさん (ワッチョイ 13b9-0DuE)
2019/11/23(土) 23:15:35.51ID:6Id8VYs40871デフォルトの名無しさん (アウアウウー Sa9d-Q1nT)
2019/11/23(土) 23:20:13.08ID:IgdFxqh4a >>868
そのコードだとyにアクセスせずxにだけアクセスしたら初期値の0のままだぞ
そのコードだとyにアクセスせずxにだけアクセスしたら初期値の0のままだぞ
872デフォルトの名無しさん (ワッチョイ 9301-wiXz)
2019/11/23(土) 23:24:58.85ID:8xX8HZu80873デフォルトの名無しさん (アウアウウー Sa9d-927E)
2019/11/23(土) 23:25:48.76ID:TBCDcXkja874デフォルトの名無しさん (ワッチョイ 13b9-0DuE)
2019/11/23(土) 23:40:24.93ID:6Id8VYs40 >>872
サンプルを書いてくださっていたのですね。大変失礼いたしました。
ただ、やはり Lazy<T> を使うメリットが理解できずにいます。
MyStatic が初期化される時点で _highCost が初期化されて、
その後すぐに _highCost.Value が呼び出されるのであれば、
>>861 に書いていただいた方法で十分な気がするのです。
>>873
おっしゃるとおりだとおもいます。
ところで少し考えてみて、場合によっては冗談ではなく
public static double X, Y = InitializeYAndX();
static double InitializeYAndX()
{
var v = HighCostMethod();
X = Math.Sign(v);
return Math.Abs(v);
}
みたいな書き方が選択肢になり得ることもあるような気がしてきました。
もしくは、実際にはフィールドは readonly にしたい場合が多いと思うので
public static readonly double X, Y = InitializeYAndX(out X);
static double InitializeYAndX(out double x)
{
var v = HighCostMethod();
x = Math.Sign(v);
return Math.Abs(v);
}
のような感じとか。
サンプルを書いてくださっていたのですね。大変失礼いたしました。
ただ、やはり Lazy<T> を使うメリットが理解できずにいます。
MyStatic が初期化される時点で _highCost が初期化されて、
その後すぐに _highCost.Value が呼び出されるのであれば、
>>861 に書いていただいた方法で十分な気がするのです。
>>873
おっしゃるとおりだとおもいます。
ところで少し考えてみて、場合によっては冗談ではなく
public static double X, Y = InitializeYAndX();
static double InitializeYAndX()
{
var v = HighCostMethod();
X = Math.Sign(v);
return Math.Abs(v);
}
みたいな書き方が選択肢になり得ることもあるような気がしてきました。
もしくは、実際にはフィールドは readonly にしたい場合が多いと思うので
public static readonly double X, Y = InitializeYAndX(out X);
static double InitializeYAndX(out double x)
{
var v = HighCostMethod();
x = Math.Sign(v);
return Math.Abs(v);
}
のような感じとか。
875デフォルトの名無しさん (ワッチョイ 6963-+jxl)
2019/11/24(日) 00:02:41.75ID:kdnOmkRS0 >>874
個人的に警告を回避するために普段しない書き方をするのは違うと思う
警告の内容を理解し、それが今回のケースでは問題ないと判断できるなら遠慮なく警告を抑制していいと思う
プログラム起動時に自動的に初期化されるstaticとプログラマが初期化タイミングを制御できるsingleton
起動コストが問題なくてstaticが妥当なら警告抑制を選択するかな
個人的に警告を回避するために普段しない書き方をするのは違うと思う
警告の内容を理解し、それが今回のケースでは問題ないと判断できるなら遠慮なく警告を抑制していいと思う
プログラム起動時に自動的に初期化されるstaticとプログラマが初期化タイミングを制御できるsingleton
起動コストが問題なくてstaticが妥当なら警告抑制を選択するかな
876デフォルトの名無しさん (ワッチョイ 9301-wiXz)
2019/11/24(日) 00:02:47.40ID:ajYX9vGJ0 >>874
LowCostMethodも追加してみた
https://dotnetfiddle.net/Be6wMy
名前の通りLazy LoadingとかLazy Initializationとかいうのをするためのもので
必要になった時に初期化されてなければ初期化して、初期化済みなら初期化済みの値を使う
MyStaticクラスが初期化される時点で_highCostが初期化されるわけではない
getプロパティで
if ( cache == null ) { cache = HighCostMethod(); }
return cache;
するのと意味的には同じでdefaultでthread-safe
詳しくは>>862の2つ目のリンクに書いてある
あともし他人も使うコードなら潜在的に高コストな処理は
フィールドやプロパティじゃなくメソッドにしといたほうが無難
LowCostMethodも追加してみた
https://dotnetfiddle.net/Be6wMy
名前の通りLazy LoadingとかLazy Initializationとかいうのをするためのもので
必要になった時に初期化されてなければ初期化して、初期化済みなら初期化済みの値を使う
MyStaticクラスが初期化される時点で_highCostが初期化されるわけではない
getプロパティで
if ( cache == null ) { cache = HighCostMethod(); }
return cache;
するのと意味的には同じでdefaultでthread-safe
詳しくは>>862の2つ目のリンクに書いてある
あともし他人も使うコードなら潜在的に高コストな処理は
フィールドやプロパティじゃなくメソッドにしといたほうが無難
877デフォルトの名無しさん (ワッチョイ 13b9-0DuE)
2019/11/24(日) 00:26:34.20ID:ilfNxwrd0 >>875
> 個人的に警告を回避するために普段しない書き方をするのは違うと思う
> 警告の内容を理解し、それが今回のケースでは問題ないと判断できるなら遠慮なく警告を抑制していいと思う
アドバイスどうもありがとうございます。確かにおっしゃるとおりですね。
この考え方で、警告を抑制する方向で行こうと思います。
> プログラム起動時に自動的に初期化されるstaticとプログラマが初期化タイミングを制御できるsingleton
static はプログラム起動時に初期化されるんでしたっけ?
ただいずれにしても、コストが非常に高い場合は
明示的に初期化のタイミングを指定できるように気をつけたいと思います。
>>876
詳しいご説明ありがとうございます。
「MyStatic が初期化される時点で _highCost が初期化されて」
という表現は正しくありませんでした。失礼いたしました。
ただ、お書きいただいたコードでは
private static readonly Lazy<double> _highCost = new Lazy<double>(HighCostMethod);
の直後に
public static double X = Math.Sin(_highCost.Value);
public static double Y = Math.Abs(_highCost.Value);
が実行されるので、例えば
private static readonly double _highCost = HighCostMethod();
と
public static double X = Math.Sin(_highCost);
public static double Y = Math.Abs(_highCost);
に書き換えても同じではないでしょうか?
> あともし他人も使うコードなら潜在的に高コストな処理は
> フィールドやプロパティじゃなくメソッドにしといたほうが無難
アドバイスどうもありがとうございます。言われてみて、確かにそのとおりだと思いました。
コストの高さに応じて適切な書き方が選択できるように勉強したいと思います。
> 個人的に警告を回避するために普段しない書き方をするのは違うと思う
> 警告の内容を理解し、それが今回のケースでは問題ないと判断できるなら遠慮なく警告を抑制していいと思う
アドバイスどうもありがとうございます。確かにおっしゃるとおりですね。
この考え方で、警告を抑制する方向で行こうと思います。
> プログラム起動時に自動的に初期化されるstaticとプログラマが初期化タイミングを制御できるsingleton
static はプログラム起動時に初期化されるんでしたっけ?
ただいずれにしても、コストが非常に高い場合は
明示的に初期化のタイミングを指定できるように気をつけたいと思います。
>>876
詳しいご説明ありがとうございます。
「MyStatic が初期化される時点で _highCost が初期化されて」
という表現は正しくありませんでした。失礼いたしました。
ただ、お書きいただいたコードでは
private static readonly Lazy<double> _highCost = new Lazy<double>(HighCostMethod);
の直後に
public static double X = Math.Sin(_highCost.Value);
public static double Y = Math.Abs(_highCost.Value);
が実行されるので、例えば
private static readonly double _highCost = HighCostMethod();
と
public static double X = Math.Sin(_highCost);
public static double Y = Math.Abs(_highCost);
に書き換えても同じではないでしょうか?
> あともし他人も使うコードなら潜在的に高コストな処理は
> フィールドやプロパティじゃなくメソッドにしといたほうが無難
アドバイスどうもありがとうございます。言われてみて、確かにそのとおりだと思いました。
コストの高さに応じて適切な書き方が選択できるように勉強したいと思います。
878デフォルトの名無しさん (ワッチョイ 13a7-Xt/m)
2019/11/24(日) 00:53:53.43ID:/zc8WPZx0 ソースといっしょで中身がないのに文章なっげぇな
879デフォルトの名無しさん (アウアウウー Sa9d-927E)
2019/11/24(日) 02:24:11.12ID:8mt5PJRXa もう誰かとっくに書いてるだろうけど、やっぱり本来は重くなる可能性があるなら
フィールドやプロパティーじゃなくてメソッドにすべきなんだろうね。知らんけど
static double _x, _y;
static Action InitializeXY = () =>
{
var v = HighCostMethod();
_x = Math.Sign(v);
_y = Math.Abs(v); ;
InitializeXY = null;
};
public static double GetX()
{
InitializeXY?.Invoke();
return _x;
}
フィールドやプロパティーじゃなくてメソッドにすべきなんだろうね。知らんけど
static double _x, _y;
static Action InitializeXY = () =>
{
var v = HighCostMethod();
_x = Math.Sign(v);
_y = Math.Abs(v); ;
InitializeXY = null;
};
public static double GetX()
{
InitializeXY?.Invoke();
return _x;
}
880デフォルトの名無しさん (ワッチョイ 93bd-AvZR)
2019/11/24(日) 04:59:22.37ID:QxCNqVes0 なんかこう、せっかくの言語仕様を活かしきれてないような
もったいなさがあるよね
もったいなさがあるよね
881デフォルトの名無しさん (ワッチョイ 1379-QS5Z)
2019/11/24(日) 10:11:24.43ID:L7p7ghIU0 原則としてはgetterでは値の取得と通知しかしてはならない
これはC#に限った話ではなくオブジェクト指向の大原則の一つ
これはC#に限った話ではなくオブジェクト指向の大原則の一つ
882デフォルトの名無しさん (ブーイモ MMcb-gJGD)
2019/11/24(日) 10:18:03.91ID:eHhiG+n9M >オブジェクト指向の大原則
w
w
883デフォルトの名無しさん (アウアウウー Sa9d-5f43)
2019/11/24(日) 10:25:13.16ID:0nk530rxa 大原則?
オブジェクト指向の原理主義的にはそもそもgetterを作るべきではないんだよ
getterを使うのは上司がタバコを吸いたいときに不器用な部下にしびれを切らして「お前、もういいからお前のライター寄越せ」
と言っているようなもので、オブジェクトから本来担うべき責務を剥ぎ取ってしまっている
火をつけろと命令を投げっぱなしにしておけば勝手に火をつけてくれるのが本来のオブジェクト指向の姿
オブジェクト指向の原理主義的にはそもそもgetterを作るべきではないんだよ
getterを使うのは上司がタバコを吸いたいときに不器用な部下にしびれを切らして「お前、もういいからお前のライター寄越せ」
と言っているようなもので、オブジェクトから本来担うべき責務を剥ぎ取ってしまっている
火をつけろと命令を投げっぱなしにしておけば勝手に火をつけてくれるのが本来のオブジェクト指向の姿
884デフォルトの名無しさん (ブーイモ MMcb-gJGD)
2019/11/24(日) 10:27:30.29ID:eHhiG+n9M 昔の人は言いました「100人のプログラマーがいたら100通りのオブジェクト指向がある」
885デフォルトの名無しさん (ワッチョイ 13a7-Xt/m)
2019/11/24(日) 10:33:58.10ID:/zc8WPZx0 なるほど
博士が100人いる村につながる胸熱展開ですね
博士が100人いる村につながる胸熱展開ですね
886デフォルトの名無しさん (ワッチョイ 132f-4eZD)
2019/11/24(日) 11:55:35.11ID:bu3J19Ko0 ところでみんな、警告って全部消してるのか?
887デフォルトの名無しさん (ラクッペ MMe5-kgoK)
2019/11/24(日) 12:11:25.46ID:TAL5a3TmM 消すの意味次第
抑制も含むなら消してる
抑制は含まないなら消してない
抑制も含むなら消してる
抑制は含まないなら消してない
888デフォルトの名無しさん (ワッチョイ f9da-Ke7D)
2019/11/24(日) 19:27:53.50ID:btk/7EiO0 vs2019になって警告増えたよね
889デフォルトの名無しさん (ササクッテロル Spc5-5oM1)
2019/11/25(月) 12:55:19.06ID:xUq4VGI0p 警告を消してないと納品出来ないから渋々消してる。
890デフォルトの名無しさん (ワッチョイ f9da-Ke7D)
2019/11/25(月) 14:11:59.51ID:qmWi7Xp+0 vs 2019でenumをuintで作ったらint32にしろって警告された
win32api用なんだけど使用時にキャストしろという事か
win32api用なんだけど使用時にキャストしろという事か
891デフォルトの名無しさん (ワイーワ2 FF63-KqLj)
2019/11/25(月) 14:22:13.25ID:pjJuONFZF 負の数混ぜてないか
892デフォルトの名無しさん (ワッチョイ d901-QS5Z)
2019/11/26(火) 16:49:39.39ID:/t5k7Bse0 フォルダファイルの情報集めてデータベース作りたいんですけど
データベースの種類って何がいいのかな?
3万件ぐらいのレコード、外部に持っていくこともしない
よろちしおねがいします
データベースの種類って何がいいのかな?
3万件ぐらいのレコード、外部に持っていくこともしない
よろちしおねがいします
893デフォルトの名無しさん (ワッチョイ 11da-r6xQ)
2019/11/26(火) 16:59:08.05ID:3+G7L2kq0 redisは早いぞ〜
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- バリ島で男子生徒ら集団万引きか、防犯カメラ映像が拡散 京都の大谷中学・高校が「窃盗行為」謝罪★4 [七波羅探題★]
- 【地震速報】青森県で震度6強 沿岸部に津波警報 ★6 [ぐれ★]
- 「日の丸にバツ印」掲げた大学生 あいまいな国旗損壊罪に「怖い」 The Mainichi [少考さん★]
- 【テレビ】25年ぶり復活「炎のチャレンジャー」南原清隆&菊池風磨がMC 懐かし「電流イライラ棒」も [湛然★]
- 【音楽】BARBEE BOYS・KONTAが事故で四肢麻痺を公表、新体制で活動は継続 [少考さん★]
- 中国「捜索レーダー起動は各国の通常の手法」 火器管制用か回答せず [蚤の市★]
- 千葉県民だけどなんか地震あったらしいな
- ぺこーら、地震で同僚が次々配信を止めるなか強行し続けるので悪目立ちするwww [268244553]
- 高市総理、睡眠時間30分😢
- 秋田大学のホームページがつながらなくなって1日以上経つのだが
- 【速報】高市早苗、起床 [779938112]
- 共産党議員「日本は中国を侵略した歴史がある」→ネトウヨ「そんな歴史は無い!捏造するな!!国家侮辱罪で逮捕だ!!!」 [314039747]
