ふらっと C#,C♯,C#(初心者用) Part145
■ このスレッドは過去ログ倉庫に格納されています
!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 >>720
>>724の75:20というのは間違いで、正しくは75:25でした。失礼しました。
ところで、ランダムに50:50ではなくプラスとマイナスを交互にしたら
もっと遅くなるかと思いきや、むしろ75:25よりも少し早いくらいになりました。
(ランダムの場合も交互の場合もあらかじめ入力データを配列に格納してから
計測を開始しているので、入力データの作成コストは結果に影響していないはずです)
どんな仕組みで先読みをしてるのかさっぱり分かりませんが、
とにかく予測ができないのが遅くなる一番の原因のようです。 >>724
そうですね、データ依存なんでパイプラインと先読みが原因だと個人的には思います。
そういえば思い出しましたが、if else ブロックの片方に固定的に賭けると必要以上に大負けすることがあるため、条件分岐を何度か通ったところで学習し、勝てる見込みのより高い方へ賭けるアーキ設計だったような気がします。
true : false = 100 : 0 or 0 : 100 に片方が大負けせず、同じ性能になったのはこの学習効果ではないかと。
モダン言語の進化の方向の一つに高級化があるのは、仰るとおり。低レイヤーの最適化はコンパイラと進化したハードウェアに任せ、コードは人間にわかりやすくして開発生産性を高めようということです。
もう一つの進化方向は Rust とか Go とか、低レイヤー向け言語を C++ よりわかりやすく、より安全にしようというものだと思います。 >>725
失礼、例えばここにそんなことが書いてある
http://e-words.jp/w/%E6%8A%95%E6%A9%9F%E7%9A%84%E5%AE%9F%E8%A1%8C.html
でもこの通りだとしても>>723は的外れだねすんません。
「損はない」というのは並列ではなくシーケンシャルに実行した場合のコストを
上回ることはないって意味だと思う。
同じ100ステップでも素直に並列化できる部分が大きい100ステップの方が
低コストなのは当たり前の話でした >>728
ありがとう。
この説明は失敗時のリカバリーがノーコストでできる環境を前提にしていると思う。
投機的実行をした面とは別の面を持っていて、そちらにすぐスイッチしてロジックを実行しつつ、その裏で失敗した面を同時並行で捨てられるような感じ。それが一般的かどうかはわからない。
複数面を持たず、失敗ステータスを捨てて (= クリアして)、その後に分岐別側のロジックを走らせるというようにシーケンシャルにリカバリーするのが一般的なのではないかなと思ったんだけどね。
最近のは複数面持ってるのかもしれない。ただ、複数面持っていると分岐ない時にリソースが遊んで無駄だからねぇ、分岐なくても普段からその面で並列演算すればいいって話になるよね。 スレタイの初心者用とはいったいw
初めに回答したのが的外れとまでは行かなくてホッとしてるw こいつらウンチクごちゃごちゃ長くても作るもん電卓だから >>730
全てわかっている人なんていないのだし、それぞれ知っていることを持ち寄って可能性をいろいろ検討してみるのが健全なやりとりなんだと思いますよ。
IL をうんぬんは知らない観点だったし、CPU アーキの話するのも 25 年ぶりくらいだったし、高級言語と C とアセンブリの使い分けを簡潔に整理してくれた人がいたので、とても勉強になりました。
>>731
ま、C# からはかなり離れてしまったね。
でも、電卓をバカにするものは電卓に泣くよ。AI もゲームも業務アプリも全てそのマイクロ電卓の組み合わせなんだから。高級言語の時代でも低レイヤーの動作原理を知っているに越したことはない。 色々と教えていただきどうもありがとうございました。
とりあえず、下のような感じの結論でまとめたいと思います。
・UnitStep1が遅い原因はパイプライン処理における分岐先読みの失敗による制御ハザードだと思われる
・分岐の方向の入れ替わりが激しくてもそこに規則性があれば制御ハザードは起こりにくいようで、
分岐先読みにおいて高度な学習が行われていることが伺える
・高級言語の目的を考えれば、開発生産性を優先してUnitStep1を選択することも十分にあり得る
UnitStep1の入力データをランダムに決定した場合の、±の割合に応じた実行時間の計測結果
http://iup.2ch-library.com/i/i2026606-1573870091.png
何かおかしなところがあれば指摘していただけると嬉しいです。
親切にしていただきどうもありがとうございました。 >>733
733 さんは fact-base で真摯に検証・報告してくれる誠実な人ですね。
おかげで楽しかったし、とても勉強になりました。
感謝。 >>734
お褒めいただきありがとうございます。
パイプライン処理はとても奥が深いようで完全に理解するのはなかなか大変そうですが、
データの割合に関するご指摘のおかげでわかりやすい計測結果も得られて私もとても楽しかったです。
あまりにもわかりやすすぎる結果のせいで今後しばらく条件分岐恐怖症になりそうですがw >>710
C4LglgNgPgAgzAAhgJgQYQQbwLACgEFICMAbAmAHbAICqFYwAysAKYAORAFJdQB4CUCALwA+BLwQihCAAwIA/AiIIQsgNx5CxMj1r0mrNsm5Vxg0Qk4SRYuEUEBqJWoR4AvkA===
個人情報漏れてね? >>731
Windows10の電卓のソースコードがGithubに公開されてるけどかなり複雑なことやってるぞ >>739
そう言って最強の電卓を横に出して
自分が作ってるゴミまで光らせるのやめてもらえます?
ダッサイので >>740
電卓が簡単でないことを指摘されて逆ギレw ワッチョイ 2922-pwu9
スププ Sda2-pwu9
ワッチョイ 02a7-Bv1e
ワッチョイ d163-r7Uq
NG推奨 WPF開発に使われるMVVMパターンについてですが、Viewは良いとしてViewModelとModelの役割分担についての理解がイマイチです
ModelではOnPropertyChanged();などの記述はするべきではないという理解で良いんでしょうか? 雑な解釈
基本的に一画面ごとに最低一つViewModelつくる
なんも画面用にいじらなくてすべて共通部分しかないならModelオンリーで 基本的に変更も通知するモデルを作る
各画面ごとにそれをViewで使いやすい形に成形したVMを作る
深く考えない
困ったら考える 趣味でタッチパネル用のアプリ開発始めたのですが
IsMouseOverだとタッチイベントが認識されなくて辛い
なんかいい方法ご存知だったりしませんか? タッチパネルならUWPを使いましょう
WPFは終わった技術であり、過去の資産のために残されているだけです そもそもタッチ操作ではマウスオーバーを表現できないってのは明らかだけど
なんでIsMouseOverが出てくるの? C#でQUEUEクラスを利用した際、Dequeue()後にメモリは残るのでしょうか?
EnQueue()とDeQueue()を繰り返しているのですが、(Countは0になる)
Visual Studioでメモリ使用量をみるとサイズがとても大きくなってるのですがこれはどういうことでしょうか? GCされてないだけじゃね
適当なところでGC.Collect() してみなよ surfaceをペンとで使ってるけどペンを画面に近づけるだけでボタンの色が変わったりしてるな ペンはマウス扱いなんだろうけど
タッチはどうなんだろうな そりゃ対応ペンは少し浮いた状態でも座標検知できるけど指は無理っしょ APIによって色々
WM_POINTERなら全部別デバイスとして判別されてる
wpfにもタッチイベントあるんだからそれでやりゃいいやんと思うが あるんだ
最近WPF始めたから知らんかった
まだまだ使えそうだな >>761
ペンに特殊な仕掛けがあるわけじゃないと思うので、
ペンだろうが指だろうが同じだと思う
知らんけど
でも普通に静電容量式のタッチパネルでしょ? 一応Windows7からOSネイティブでタッチ操作に対応してるんだよね。
当時技術サンプルとして鯉が泳いでる池をタッチすると波紋が広がるスクリーンセーバーが
公開されてたけど、なぜかコードは非公開で意味ねえと思ったなw >>758
GCではだめでした
TrimExcess()呼び出せばいいんですって、奥様 >>764
surfaceのペンをスマホに当てても使えないから指とは仕組みが違うのでは? >>764
ペンは電池式で何らかの仕掛けがあります。
良く知りませんが、恐らく「交番電界(周波数が低い電磁波とも言える)」を
出している可能性が高いです。 >>769
もともとタッチパネルの方が交番電界を出しているので、それを相殺するような
逆位相の降板電界をタッチペンの方が出している、と考えられるようです。 >>769
へー
静電容量式の原理から普通に考えればペン側に仕掛けが必要とは思えんけど、
よく分からんね。
接触しているかどうかの識別はCの大きさで判定するだけのはずだと思うんだけど >>772
ペンは静電容量式に対応してないと反応しないよ
手袋とかでタッチしても反応しない 専用ペン使うのは電磁誘導方式でしょ。
静電容量とは根本的に違う。 >>773
対応って言ったって要するに導電性があるだけだよw
だから100均でも売ってる
>>774
surfaceってペン「も」使える設計だよね? 長い名前を持つクラスに、thisを返すメソッドがあるとします
// 超長いクラス名
class VeryLongLongClassName {
// thisを返すメソッド
VeryLongLongClassName Foo( ) {
return this;
}
}
このとき、Foo()の定義につけるクラス名を省略、
あるいは置き換える方法はありますか?
たとえば以下のような形が理想です
var Foo() { … } // 型推論っぽく書けるとか
__CLASS__ Foo() { … } //自身のクラスを表す予約語とか >>776
外部との境界に var 型推論はムリ。それやると型を差し替えたときに影響が甚大になるため、型推論はローカルでしか許されない。
using エイリアスディレクティブで短い別名付けるとよいのではないかな。 問題点や何がやりたいのかを言うと
違うアドバイスか得られることもあるぞ インタフェースとか継承を考えても、thisで型推論するのは無理じゃない? 戻り値が特に必要ないメソッドはreturn thisにして繋げれるようにしておこうかなあと
return thisにするか同じクラスをnewするかはさておき VisualStudio2017を使用
Form1にsplitContainer1を上下に分割して全面に貼ってあり、splitContainer1の下段側にリッチテキストボックス1をドッキングさせて貼ってあります。
このリッチテキストボックス1が、ScrollBarsプロパティ:Both、WardWrapプロパティ:false
このリッチテキストボックス1に縦と横幅を超えるテキスト表示をした時、
縦のスクロールバーは普通に表示されるけど、水平のほうのスクロールバーが表示されなくなったのだけど何が原因と考えられるでしょうか?
・右キー押して自分でカーソルを右端まで動かせば一応画面のスクロールはさせられる
・以前はちゃんとスクロールバーが表示されてたはずなんだけどいつの間にか表示されなくなった? >>782
クラス名が500文字とかあるならわかるけど100文字以内なら気にすることでもないと思う
気になるならそもそもクラスの命名が間違っているのでは? xamlの質問になってしまいますが、全コントールアイテムのBorderBrushやForegroundの色を統一することって出来ないのでしょうか?
<Style TargetType="Button">
<Setter Property="BorderBrush" Value="Black"/>...
と一つ一つのコントロールを定義して回るしか方法はないのでしょうか? >>785
この辺が参考になるかも
ttps://www.atmarkit.co.jp/ait/articles/1009/07/news096.html >>776
ファイルスコープの別名なら普通に可能。
グローバルに別名が欲しいと考えてるならそもそも何か考え方が根本的に間違ってる気がする >>784
そういう話ではない
それだと「変数をvarで定義するのは設計が間違っているからだ」と言ってるようなもん >>788
いや誰が考えてもそういう(>>784)話ですw
それ以外にありえない returnの型から推論できるんだからメソッドの戻り型にもvarを使わせろって話?
んじゃあ始め書き込みで予約語の例示が意味不明
というか長い名前という言葉から文章を開始しといて何が違うんだ?
変数でvarを使うのは名称が長いからではないぞ?
長いものも3文字で表現できるという副次的メリットはあれどそのために導入されたものではない メンバの型に型推論が使えないのは単純に技術的な問題だよ
コンパイラは先にメンバのシグネチャだけを見てリストアップしてから各メソッドの本体を処理することで依存関係を解決している
メソッドの中身を見ないとメンバの型が確定しないとなると、一度メソッドを処理しただけでは依存関係を解決しきれないから
メソッドを何度も繰り返し処理する必要がでてきてコンパイルが遅くなる >>785
できるよ〜
1つのxamlにスタイルを定義して、全てのxamlから参照したりとか なんか結論としては>99の質問と同じような感じになっちゃったけど
最初の質問が微妙に異なるので見落ちとしてた、すまん
>>787
単純に自身と同型のオブジェクトを返すときに、なんかスマートな方法あるのかな?と思っただけ
言語によってはそのへんの仕組みがあったりする
ファイルスコープでのエイリアスが可能なら>>778の言うように
分かりやすいところに ThisClass みたいな名前のエイリアスを用意しておいて
クラス内部では基本的にそっちを使うのもアリかなと思っている
予約語ではないのでエディタとの相性はそこまで良くないけのが欠点か 戻りの型名を普通に書くのがスマート
くだらないアイデアでコードを汚さないで >>791
なるほど、確かにそうだな
動的な言語だとまた違うんだろうけど比較できるようなもんでもないしな >>794
んだね
アリかナシかで言えばアリだと思ったけど
言語仕様として存在しないなら自分個人ではなるべく避けたいな >>791
今どきのコンパイラでワンパスなんてないだろw な?名称が長いかどうかなんて関係ない質問なのに余計な単語から質問を始めるから周りが混乱する。
コメントで超長いクラス名とかまで書いてんじゃん
そんで指摘したらそーじゃねぇよ!ってあほかとwどんだけ説明下手くそなのw >>793
なるほど失礼w
長い名前云々書いたのははミスリードだったねw
戻り値を型推論で省略できないか?とシンプルに書いて欲しかった >>797
誰がワンパスだなんて言ったんだ?
現在何パス使っているにせよメンバの型推論を許せば間違いなくパスは増えるし、
791で書いた内容は俺の想像じゃなくてMS公式のコメントだぞ >>801
多少パスが増えることぐらいでガタガタ騒ぐなよ
って話な
あとMSの見解がどうかしたのか?w >>800
そうなの?w
// VLLCNじゃ何だかわからないので必要な場面で説明的な名前を与えるためだけのクラス
// 空っぽの継承のまま維持せよ。メンバ追加禁止!!!
class VeryLongLongClassName : VLLCN { private VeryLongLongClassName(){} }
// VeryLongLongClassNameの実体はこっち。
class VLLCN
{
....
}
まさかこんなのがお好みなのかなw 自身のクラス返すときだけ利用したいんでしょ
tweenerみたいな設定が多いものをチェインメソッドで必要な設定を好きな順番で書くとか
他にはfactoryみたいなのをわかりやすくするとか
気持ちはわからんでもないけど局所的すぎると思う .Net CoreからBitFlyerの認証が必要なWebAPIを使いたいんだけどさあ
業者は暗号化キーをソースコードやファイル等に保存しないよう求めてるんだけど、.Net Coreでキーを守る手段ってどういうのがあるの?
WindowsやmacOS付属の機能も使えなさそうだし、最終的に動かしたいLinuxなんかそもそもそんな機能がないし・・・・
ランタイムにもそんな機能なさそうだし、どうすればいいんだろ ソースはともかくファイルに保存は普通にやるよ
リポジトリに機密情報をコミットしない、と勘違いしてないか? >>804
> tweenerみたいな設定が多いものをチェインメソッドで必要な設定を好きな順番で書くとか
チェインメソッドってよく見かけるようになったけど見易いのかなぁ…
X.A( ).B( ).C( );
より
X.A( );
X.B( );
X.C( );
の方が見易いと思う俺は老害なんだろうか >>807
linqでつなげるのに慣れてれば違和感なくならない?
linqとは意味合いが違うけども
まぁ可読性なんて人それぞれだとは思うよ >>808
linqはパイプみたいに順次処理して行くからまだ理解できるんだけど>>804が言う
> 設定が多いものをチェインメソッドで必要な設定を好きな順番で書く
とかは普通に分けて書けばいいのにって思うんだよね
まあ人それぞれと言うのには同意するけど Groovy などでやる、フォームビルダーみたいに、
各コントロールのサイズ・色など、設定項目が多いものは、メソッドチェーンでは見にくい >>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にするってのがなんか受け付けないんだよな―。 DSLとしてどの程度価値があるのか次第だと思う
https://martinfowler.com/bliki/FluentInterface.html
LINQのように関数型ライクな関数合成をOOで表現する場合と
FluentなBuilderパターンは見た目は似てても中身と目的は違うよね だから意味合いは違うって書いてんでしょうが
this返して繋げる前提ライブラリなんてよくあるし好き嫌いの範疇
君が嫌いならしなきゃ良いだけじゃん
俺だってC#のライブラリ作るとき設定するだけのメソッドでthisなんて返さないよ
それは俺が作るものが小さいものだからできるだけ標準に近いものが良いだろうってだけ
大きめのものでそれが全体を通して同じようにthis返す設計で、それを使うならなるべくその思想には従うかもしれん程度 this返すお作法は昔のjava方面の文化じゃない?
C#は1.xの時代にMSか何かのガイドラインで「やるな」って書いてあったのを読んだ記憶がある。
個人的にそもそもそんなキモいことやらないよと思ったので禁止の理由までは覚えてないが。 >>813
> だから意味合いは違うって書いてんでしょうが
何にキレてるのか知らんけど、意味合いの違うものを引き合いに出すこと自体がおかしいって指摘されてることぐらいは理解しようよ とは言え
X.A()?.B()?.C();
ならどうだろう? 意味合い違うものを出すのがおかしいなら807のレスがおかしいんだよ?
見やすいとか関係なくて776がこんな機能ないの?→無いよ→なんで欲しいの?→こういうのしたいんでしょ→見にくくね?気持ち悪くね?
って知るかよw
機能の話してんのになんで見易さの話にシフトすんだよ
見易さの話に変えられたので同じ表記の例示だしただけだし、そもそもlinqではないが採用してるライブラリも例示してんのになんでそこにこだわんの?w おおもとの>>776や>>793の疑問についてはusingでエイリアスをつけて
『using [別名] = [VeryLongLongClassNameとか別名をつけたいクラス名];』と宣言して、
『[別名] Foo() { return this; }』みたいなメソッドの書き方することはできるし、
その別名に「This」を使ってるようなソースもたまに見かける
なんだけど・・・そもそも戻り値が特にないからとりあえず安易にthisを返すみたいな考え方は間違ってる
戻り値がないならvoidにして無駄な戻り値を返さない
そのクラスがBuilder的な使い方をするクラスである場合に限って、
そういうクラスであることをクラス名ほかで明示したうえで首尾一貫して全voidメソッドでthisを返す
>>782みたいな考え方で戻り値がthisなのか新しいインスタンスなのかブレるかもしれないのは論外
戻り値が後者なメソッドが混ざってると>>807の2種類の書き方で結果が同一にならなくなる Fluent apiってthisを返すことが目的じゃないからな
メソッドチェインで宣言的っぽくプログラミングするためのアイデアであってthisを返すメソッドはそのサブセットでしかない
世に出てるライブラリを見ればわかるがthis以外もバンバン返してる
だから作法としてとりあえずthisを返すなんてのは何もわかってない全く馬鹿げたことだ
先にFluent apiの設計をしなければならない
その設計に必要ならthisを返すメソッドを加えるだけだ >>817
話題を変えること
と
違うものを引き合いに出して同じでしょ
って言うことの違いも理解できてないのかよ… >>820
話題を変えたから見た目の話してんのに機能面に難癖つけてるの分かってる?
見た目はこれと一緒、機能はちがうけどね
ってレスしたらそれは機能が違う!って戻してんじゃんw
見た目も機能も同じtweenerという例示
見た目の話に切り替えたので見た目は同じだが機能は異なるlinqという例示
念の為機能は異なることも明記した上での提示に対して機能面についてあーだこーだ言われてもねぇ 喧嘩すんなよ。
いろいろな観点から指摘が入って、設計やスタイルに関する考察が深まるのはいいことだ。
揚げ足取りとか噛み付きとか不毛だからやめような。 コードレビューするなら
本質的な機能では無いのに戻り値返すのは利用者の理解を妨げる上に、バグの元にもなるので、余計な事すんなと言うな
あとから戻り値欲しくなった途端に困るやろ 今までレスしてる中でthis返す設計に肯定的な姿勢なのは元の質問者である782だけ
C#標準にそういう設計は無いからその利用者の多くは否定的になる、俺も含めて
世の中いろんな設計指針があるし他言語の流儀を真似することもある
同じチームで開発することになるならその辺りはできるだけ同じ方向を向きたいけれど、そういうのじゃなければ最終的にはお好きなようにとなるよね >>821
バカなの?
> linqはパイプみたいに順次処理して行くからまだ理解できるんだけど
って書いてあるだろ
そういう必然性のない
> 設定が多いものをチェインメソッドで必要な設定を好きな順番で書く
を同一視してるのがおかしいの
わかった? >>825
それは機能の話ね
で、機能は初めから違うよ、って言ってるよね?
誰も同一視してないのになんで同一視してんじゃねーよ!って絡んでくるの? ■ このスレッドは過去ログ倉庫に格納されています