TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼
ネットワークプログラミング雑談
Android Studio Part3
【マウスだけで】Scratch【プログラミング】その1
Kotlin 6
ねねっちと一緒にプログラムを勉強するスレ第3話
Subversion r15
monazilla Part 6
【SICP】計算機プログラムの構造と解釈 Part3
C言語なら俺に聞け 152
【分散型バージョン管理】 Mercurial 2【hg】
ふらっと C#,C♯,C#(初心者用) Part145
- 1 :2019/10/07 〜 最終レス :2019/12/11
- !extend:checked:vvvvv:1000:512
次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為)
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください
>>980を踏んだ人は新スレを建てて下さい。>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。
■前スレ
ふらっと C#,C♯,C#(初心者用) Part144
https://mevius.2ch.sc/test/read.cgi/tech/1563258983/
■関連スレ
C#, C♯, C#相談室 Part95
https://mevius.2ch.sc/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
- 2 :
- 乙
- 3 :
- c# windowsフォームにファイルをドラッグ&ドロップしたらファイルのパスを取得みたいなコードはネットにありますし、そのままビルドしたら正常に動作しましたので良いのですが、
ファイルをドラッグした瞬間にパスを取得することは出来ますか?
- 4 :
- はい
- 5 :
- うん
- 6 :
- >>3
普通にやると一番早く取得できるのはDragEnterやDragOverイベントかな
もしドラッグを始めた瞬間に取得したいのなら
全プロセスに対してOle32.dllのDoDragDrop呼び出しをフックして
プロセス間通信でパスを通知、とすれば出来るのかもしれないけど初心者がすることではなさそう
- 7 :
- 質問失礼します
textboxに入力を終えて確定したことを知り自動的に
フォーカスをtextboxから別の決まったコントロール(buttonとか)に移動したいのですが
フォーカス移動のコードをどこにどう書いたらいいのか分かりません
- 8 :
- >>7
ケースバイケースでは?
同じ機能のTextBoxが一つしかなく、他で使いまわす予定もないなら
Formに書けば十分。
複数使いたかったり汎用的で他で使いまわしたいなら
(a) TextBoxを継承してそこに書く
(b) UseControlにTextBoxとButtonをペアで配置してUseControlにフォーカス移動のコードを書く
このいずれか。
- 9 :
- >>8
ありがとうございます
なるほど、(a)かなあ
ところでtextboxの入力が確定したことをどうやって取得すればいいのかも分からないんです
それも教えてください、すみません!
- 10 :
- あ、それはTextプロパティが変化したかどうかを見ればいいのか?
でもそれじゃイベントハンドラがどうしたらいいのか分からない
Textの変更を始めたというイベントハンドラって取得できるんですかね?
- 11 :
- それも駄目か
やっぱり何らかの方法で変更が終了して
リターンを押して確定したことを取得しないといけないよね?
- 12 :
- わかった _TextChangedか!
ありがとうございました
- 13 :
- 昔だったらkillforcusなんだけど
c#はなんだろう?
- 14 :
- あった多分これで検索すれば
c# textbox validated event
- 15 :
- WPFアプリにてタスクバープレビューの右上の閉じるボタンから閉じた時のイベントを取得することは出来ないのでしょうか?
上記の方法で閉じると一見終了されたように見えてもプロセスは残ってしまうため、メインウィンドウの閉じるボタンを押したときに呼ばれる後処理メソッドを呼ばせたいのですが
- 16 :
- こっちの環境では普通にClosedイベント発生してるし特殊な終わり方はしてないようだが…
- 17 :
- どういう方法で閉じようと、ClosingやClosedは経由するよな
- 18 :
- C# + Oracleで自社内向け業務アプリ作ることになったんだけど、..net coreでなく、net frameworkのWinFormsでいいよね?
ユーザーはせいぜい1200人程度なんだけど、.net coreランタイム入れる手間を考えたくない。
WinFormsって結構大きなデメリットになったりする?
- 19 :
- Formで複数のNumericUpDownを使ってます
値の変化はValueChangedイベントを使用してます
あるNumericUpDownを変化すると別のも連動します
値を変える場合一時的にイベントハンドラを無効にしてます
今は-=で無効にしてますが他にイベントハンドラを無効にする方法はありますか?
- 20 :
- 勘違いしてるみたいだけど.NET coreはインストール不要(自己完結型)でビルドできるよ
- 21 :
- CoreってGUI作れるようになったん?
- 22 :
- core調べてみたら便利そうだな
調べるうちにだんだんUWPとWPFの違いが分からんようになった
WPFでUWPのコントロール使えるなら、UWPは制限きついだけか?
- 23 :
- Win限定なら作れる
でも現実にはある程度のユーザー数のある業務アプリなら.NET Framework の方が遥かに配布は楽だよ
ClickOnceが使えるからね
.NET CoreはSCDができるのはいいけど、配布や更新に関して良くも悪くも単なるexeができる以上のサポートは何もない
ヘタにzipで配っちゃったら後で地獄を見ることになる
- 24 :
- あと、今から業務アプリを新規に作るんならそもそもクライアントアプリではなくWebにすべきだ
Webなら配布の心配なんか最初から要らないし、.NET開発におけるメインストリームだから情報も豊富だし将来性もある
- 25 :
- >>23
MSIX
- 26 :
- >>19
フラグ使ってイベントハンドラの入り口でreturn
- 27 :
- 質問なんですが
DataGridViewでテーブルを表示させてるんですが、中のデータを変更してもDataGridViewが更新できません
class Person
{
public int ID;
public string Name;
}
class PersonList
{
public List<Person> Data { get; }
public PersonList()
{
new Person { ID = 1, Name = "tanaka" };
new Person { ID = 2, Name = "kimura" };
}
}
PersonList personList = new PersonList();
DataGridView1.DataSource = personList.Data;
今は無理やりデータソースを一度Nullにして消して再読み込みしていまうs
private void Button1_Click(object sender, EventArgs e)
{
DataGridView1.DataSource = null;
DataGridView1.DataSource = personList.Data;
}
これでは画面が一度消えてちらついたり、セル幅がリセットされたり、いまいちです
DataGridViewの再読み込み再描画でうまい方法あるでしょうか?
- 28 :
- PersonにはINotifyPropertyChangedを実装して
各プロパティのsetでPropertyChangedイベントを発生させる
要素の追加削除に対応するならList<T>の代わりにBindingList<T>を使う
- 29 :
- >>28
さんくすです
何やらうまくいきそうな感じですが、実際に書くのは難しそうです
少し調べてみます
- 30 :
- ASP.NET(VS2013) でWebアプリを作っています。
データベースから取得したデータをGridViewにBindしています。
特定のカラムを編集したくて OnDataBound イベントにて以下のようにしてTextBoxを追加しました。
foreach (GridViewRow rw in GridView1.Rows)
{
TextBox txt = new TextBox();
txt.Text = rw.Cells[2].Text;
rw.Cells[2].Controls.Add(txt);
}
この後、TextBoxの値を取得したいのですが、
foreach (GridViewRow rw in GridView1.Rows)
{
TextBox txt = (TextBox)rw.Cells[2].Controls[0];
xx = txt.Text;
}
ではうまくいきません。Controlsがないようです。
どうすればTextBoxの値を取得できるでしょうか。
- 31 :
- ・extBox txt = (TextBox)(rw.Cells[2]).Controls[0];
- 32 :
- >>31
>>30です。
ダメです。〜.Controls.Countが0なので、インデックスの範囲外になってしまいます。
- 33 :
- ProcessクラスにはDispose()があるようですが、
var processes = Process.GetProcesses();
とした時点で上記のProcess[]内のProcessたちを全てDispose()しないとメモリリークなどしてしまうのでしょうか?
それとも実際にハンドルなどを参照したものだけDispose()すれば良いのでしょうか?
- 34 :
- >>33
https://referencesource.microsoft.com/#System/services/monitoring/system/diagnosticts/Process.cs,1554
ReferenceSourceを見ると
GetProcessesByName()が内部でGetProcesses()を使っていて、それの戻り値配列に使わない場合はDispose()しているから
GetProcesses()を直接呼び出している場合でも戻り値配列の各ProcessをDispose()したほうが良さそう
GC管理下にあるからDisposeを呼び忘れていても、ファイナライザが呼び出されて少なくともメモリーは回収されるとは思う
- 35 :
- >>34
ありがとうございます
一応全く使わないProcessもDisposeしておくことにします
- 36 :
- クラスA内にインスタンスメソッドBがあったとして、長くなってしまったから一部をメソッドCとして外に出すとします
このCはBから呼び出される以外どこからも参照されません。本当にちょっと分離するためだけに分けているのです
このときCの修飾子はどうするのがいいのでしょうか。publicは論外として、ただ単にprivateでいいんですかね
staticとかつけた方がいいですか?クラス内で変な使われ方するのを防いだ方がいいかなとか思ったのですが
- 37 :
- そのソースを自分しか触らないのであればprivateでいいと思う
自分で作っているんだから変な使われ方をされることもないだろ?
もし他の開発者が触る可能性があるんならローカル関数を使えばOK
- 38 :
- privateにしてコメントに注意書きしておけばいいと思うが
メソッド名の頭にアンダースコアつけるとか
DoSomethingFromBOnly()みたいな名前にしておくとか
- 39 :
- 全部public
クラスAを継承したクラスA2で
メソッドBをちょっと変えた
メソッドB2を作りたいときに
メソッドCを呼べない欠陥クラス
- 40 :
- >>36
普通にprivateにすればOK。
誤用されるリスクは分割したメソッドに固有の問題じゃない。
それは命名と抽象化が不適切ならどのメソッドにも起こりうる。
だから分割したら誤用されるんじゃないか、って発想はかなり変だ。
staticはインスタンスメンバーを使わないなら付けるべきだが、付けたからって
誤用されるリスクが減るわけじゃない。
ローカル関数は、
(1) 分割したメソッドを何度も呼び出す。
(2) その時に必ず同じ変数を引数として渡す(それが冗長に感じる)
こういうケースじゃなきゃ積極的に使う理由はない気がする。
- 41 :
- メソッドBからしか正常に動作しないメソッドCという構図ならそもそも設計が怪しい
メソッドB以外から使われることがないだろうくらいの感じなら
万一使われても別に困らないしprivateで問題ない
- 42 :
- ローカル関数を使いたがる奴は総じてレベルが低いね
- 43 :
- グローバルおじさんが来たな
- 44 :
- >>41
は?
>>39のケースで普通に困るだろ
ボケてんかよ
- 45 :
- >>44
でもまあ拡張性に優れてないのは元からっぽいから、分けて書くことに始まった問題じゃないじゃん?
- 46 :
- 全部publicおじさんなんかどう見ても荒らしなんだからNGに放り込んどけ
- 47 :
- >>39のケースを解決しようととりあえずprotectedにすればいいと思うだろ?
ところがメソッドB2の処理の途中に
クラスXの処理を絡ませなければならないことになった
しかし、クラスA2はクラスXを呼び出すと循環参照になってしまうためそれができない
なのでクラスEにメソッドB3を作成することになった
ときにメソッドCはprivateでは呼び出すことができない
ここまで解決しようとするとメソッドCはpublicにしておくしかない
そしてこれはよくあることだ
- 48 :
- 全部virtualだろ普通
- 49 :
- 皆さんは、Windowsノートパソコンで開発されてるのでしょうか?
それともsurface?MacBook Pro?iPad Pro?
プログラミング用にMacBookをすすめるサイトをよく見ますがC#ではやはりWindows機?
個人的にはThinkPadかなと思ってますが
皆さんはどんなもんですか
- 50 :
- デスクトップだけど
- 51 :
- >>47
> そしてこれはよくあることだ
ねーよ
よくあるとしたらお前の設計力が無さすぎ
そもそも
> メソッドBをちょっと変えた
> メソッドB2を作りたいときに
の時にBからB2をコピペして改変する時点でアホ丸出し
- 52 :
- >>51
え?じゃあどうするん?
話の主旨とそれるけど
virtualにしてもやっぱりメソッドCは呼べんやろ
それで?
どうしたいって?
- 53 :
- >>52
アホすぎる…
クラスAをベースクラスにして変更部分をvirtualで差し替えてA1(これが今までのA)とA2を作る
変更部分にCを呼ぶコードがあるならCはクラスA1にだけあればいい
変更部分にCを呼ぶコードがないならCはクラスAに置いとけばいい
- 54 :
- >>53
え?なんかよくわからない
>>39みたいにかけない?
継承先でメソッドCを呼ぶ必要があるときどうだって?
- 55 :
- >>50
うぅ・・
- 56 :
- 今開発中のもので初めて例外を補足しない強制終了が起こったのですが、原因としては唯一のunsafeであるstackallocだと思われます
var stack = count <= 20 ? stackalloc ulong[count] : new ulong[count];
動的なサイズですが上記のように一応サイズ制限はしていたのですが、ulong[20](160byte)程度でもスタックオーバーフローは起こり得るんでしょうか?
- 57 :
- >>54
ちょっとは勉強しろよ...
両方の継承先で呼ぶ必要があるならベースに置けばいい
どっちか片方だけでいいなら必要とする継承先に置けばいいだけ
まともにコード書いたことないのか?
- 58 :
- >>30です。
何かヒント頂けないでしょうか。
- 59 :
- >>56
残りスタックが少なければ起こりうると思うけど例外吐いてないなら別の要因じゃないかと思う
- 60 :
- >>56
イベントログを見てStackOverflowExceptionであることは確認した?
- 61 :
- >>56
それコンパイル通るのか?
?の第2オペランドと第3オペランドの型があってないように見えるが
- 62 :
- >>61
https://ufcpp.net/study/csharp/resource/span/#safe-stackalloc
C#7.2から出来るようになった
stackallocもnewも暗黙的にSpan<T>へ変換される
- 63 :
- >>57
え?
意味不明
- 64 :
- >>63
勉強不足すぎw
てか多態の基本だぞ
- 65 :
- >>64
え?継承元のprivateって呼べないよね?
- 66 :
- 古いコードを見ているのですが
if (false) {// なにか処理}
がたっくさんあるんです。
到達できないコードが検出されましたって大量に出て当たり前だよ!って
仮に何か意味があるとしたらどんな理由が考えられるでしょうか
全部消せと思うのですが何かわたしの知らないテクニックだったらまずいですし
- 67 :
- C#なら出来るでしょう
- 68 :
- テスト用なんじゃね
必要なくなったからfalseにしているだけでは
- 69 :
- テストとかデバッグ用の処理じゃないかな
#if falseにすれば警告は除去できると思う
- 70 :
- >>65
継承元のprivateを呼ぶ話なんてしてないだろ
>>53をちゃんと読めよ
- 71 :
- >>70
じゃあ、お前、一連の流れを理解しないでレス付けたな
もうようないわ
- 72 :
- Properties.Settings.Defaultについて教えてください
DataGridViewのセル幅の設定を保存したいのですが、いい方法はあるでしょうか?
セルが20個ほど並んでるのですが、Settings.SettingsにはInt[]の配列が選べないし
プロパティバインディングも項目がありません、たくさんのIntを保存するにはどうしたらよいでしょか?
- 73 :
- >>66
謎だねw
#ifディレクティブやコメントアウトを選択しなかった理由は
IDEでシンボル検索した時に引っかかるようにしたかったから、とかも考えられるけど、
まあ多分単純に書いた人がアホなだけだろうw
仮にそうう理由があるとしてもfalseなんてリテラルをそのまま書くのは意味が分からん
- 74 :
- Java屋に呪いをかけられた。
- 75 :
- >>72
カンマ区切りの文字列にでもするとか
- 76 :
- json.netで文字列にして保存とか・・・そこまでやるならってのはナシで
- 77 :
- >>71
バカの逆ギレかよ
念の為に言っておくけど元々>>47程度の要件では派生クラスからCを呼ぶなんて必要ないってことな
まあ君には一生理解できないかもしれないけどw
- 78 :
- 質問した人はもはや興味なくなってそう
- 79 :
- >>75
レスサンクス
カンマで区切って、文字列を数値にして
今それっぽい事をやってみたんですが、なにやら挙動があやしい
>>76
れすさんくす
やはり文字列になってしまうのでしょか、int[]あれば便利なのに
- 80 :
- splitで配列化出来るでしょ?
- 81 :
- 挙動が怪しいって言われてもコメントしようがない
- 82 :
- カンマが全角半角交じりなのかもね
- 83 :
- >>80
さんくす
数字カンマで区切ってsplitですか、簡単にできそうですね
>>81
保存する種類をsystem.collections.specialized.stringcollectionとゆう文字列のコレクションを使って
.addと.clearでいろいろやってるうちにwidthが0になったりと
Properties.Settings.Default.cellwidth = new System.Collections.Specialized.StringCollection();
for (int i = 0; i < DataGridView1.ColumnCount; i++)
{
Properties.Settings.Default.cellwidth.Add(DataGridView1.Columns[i].Width.ToString());
}
こんなんです、これは捨てます
- 84 :
- string.Join(",", array)で保存
array=text.Split(",").ToArray()で復元
スマホで書いたからミスってたらごめん
- 85 :
- >>49
非光沢液晶のパソコンでプログラミングすることをすすめます。
- 86 :
- >>84
さんくすです
それは答えですね、やってみます
- 87 :
- これと違うの?
http://dobon.net/vb/dotnet/programing/mysettings.html#section5
- 88 :
- >>47
本来クラスA2に置くべきメソッドB2を
循環参照になってしまうからという理由で別クラスに作るというアプローチに問題がある
- 89 :
- 不要な循環参照は避けるに越したことはないが
絶対に回避しないといけないものではないしな
設計的に妥当かどうか
- 90 :
- >>87
さんくすです
型を増やすのは難しそうで、ちょっと敬遠してたのですが
いちどやってみます
- 91 :
- 遅くなりましたがありがとうございました。とりあえずprivateでやってみようと思います。
しかし恥ずかしながらローカル関数って初めて知りました……こんなんあったのか
- 92 :
- なんとローカルクラスもあったりするぞ
- 93 :
- ローカルクラスとか初めて聞いたんだが
Javaか何かと間違えてないか?
- 94 :
- 内部クラスつまりクラス内クラスのことかもな
ローカルクラスとは言わないけどな
- 95 :
- 匿名クラスのことだろ
LinQの関数の戻りとかでたまに使う
- 96 :
- var hoge = new { Name = "Masashi", Hage = true };
こんな感じで宣言出來ると思う
- 97 :
- class hoge {
class fuga {}
class moge {}
}
こういうやつ
呼び方は知らん
- 98 :
- ローカルクラスwww
- 99 :
- Java 用語だったのか。 < ローカルクラス
クラス内だけじゃなくてメソッド内でも作れるみたいだけど。
匿名クラスは無名クラスだと思ってた自分。
この流れでしょうもないことを聞いてみる。
static なメンバ変数の修飾子というか、
static でないメンバ変数の this.[変数名] の this に当たるようなのってなにかないですか。
[クラス名].[変数名] で ok なのだけど、[クラス名] の部分を固定でやる方法ないかなと。
- 100 :
- >>99
エイリアスとかこういう話?
using ディレクティブ
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/using-directive
- 101 :
- >>100
横からだけど初めて知った
サンクス
- 102 :
- for(int i = 0; DataGridView1.Columns.Count > i; i++)
{
DataGridView1.Columns[i].MinimumWidth = 20;
}
これってもっと簡単に書けませんか?
- 103 :
- 重複するコードを削っていくのがコツ
- 104 :
- コード変えていいならLINQとかもあり
- 105 :
- 全回しするときは基本的にforeachを使う
ただlinqのforeachを使ってよいのかはよくわからん。パフォーマンス悪いと聞くし
- 106 :
- LinqにForEachはない
あれはリストのメソッドだよ
- 107 :
- >>103>>104
さんくすです、LINQってことはSelectをつかうんでしょうか
>>105
さんくすです、パフォーマンスは落ちてもかまわないんで
最初foreachで書こうと思ったんですが、わからなく
- 108 :
- ん?
for (var c in DataGridView1.Columns) { c.MinimumWidth=20; }
よりも短く描きたいってこと?
- 109 :
- そんなんどうでもいいから動くモノ作れよ初心者
- 110 :
- >>108
さんくす、面白い書き方ですね、ただMimimumWidthが出てきませんでした
少し変えればよさそうだけど、どこをどうかえれば
- 111 :
- >>108
foreach
- 112 :
- >>110
var をDataGridColumn に変えれば出る
- 113 :
- えーそんなわけないでしょと思って確認したら
ColumnsのDataGridViewColumnCollectionは非ジェネリクスのIListしか実装してないのか・・・
DataGridViewってVS2005以前の書き方で実装されてるのね
となると、かっこ悪いけどキャストをかませて
for (var c in DataGridView1.Columns) { (c as DataGridViewColumn).MinimumWidth=20; }
と書くくらいしかないか、>>103のとおりDataGridView.Columnsを変数にするくらいしかなさそう
- 114 :
- あ、forじゃなくてforeachか
ちゃんとIDEなりVSCodeなり立ち上げて書かなきゃだめね、失礼
- 115 :
- 抽象クラスとインターフェースの使い分けのコツを具体例で教えて下さい!
- 116 :
- 昔の人は言いました「習うより慣れろ」
- 117 :
- そんなんどうでもいいから動くモノ作れよ初心者
- 118 :
- >>116
使い分ける必要はない
常にインターフェイスを使う、でいいよ
抽象クラスはインターフェイスを使った上で、どうしても実装の大部分が重複してしまうような場合に稀に使うことがある、という程度のもの
全く使わなくても問題はない
- 119 :
- >>100
所属クラスを示す汎用のエイリアスのようなものがないかなーと。
でも using static ディレクティブ自体を知らなかったので勉強になりました。これを定義すれば結果として同じ事出来るし。
ありがとう。
- 120 :
- 昔の人は言いました「100人のプログラマーがいたら100通りのオブジェクト指向がある」
- 121 :
- >>112
さんくすです出ました
foreach(DataGridViewColumn c in DataGridView1.Columns) { c.MinimumWidth = 20; }
>>113
さんくすですキャストのほうでもいけました
- 122 :
- 8からデフォルト実装も入るからますます使いどころが
- 123 :
- WinFormsで、フォーカスが当たってない時でもキー入力を取る方法ってありますか?
- 124 :
- >>123
https://qiita.com/sawasaka/items/b3d5285b4198c0e46628
- 125 :
- >>123
key入力をグローバルHook
- 126 :
- アプリ自体にフォーカス当たって無くてもいいの?
- 127 :
- イインダヨ
- 128 :
- ああ、パスワードスキミングするならむしろそうじゃないと都合悪いかw
- 129 :
- 必死でない頭絞って
やっと浮かんだ用途がそれなのか?
残念な人だこと…
- 130 :
- この手の質問に対する定番の回答やぞ
- 131 :
- 1ヶ月位VBAを触って今日Visual Studio Express 2017をインストールしました
せっかくならVBAの癖が着く前に…と思ったのですが、VBAで書いたプログラムに互換性は無いでしょうか?
- 132 :
- >>131
ここ、C#のスレだよw
VBAは20年前に死亡宣告されたVB6の親戚。
今のVisual Studioに入ってるVisual Basicとは似てるけど別物。
もちろんC#とは似ても似つかない
- 133 :
- >>131
VBAとC#/VB.NETは別物
あとなんでVS2017のExpressをインストールしたのさ
わざわざ機能制限版のExpressを使うとかマゾプレイヤーかな?
- 134 :
- >>132
1から勉強しなおしになるでしょうか?
Visual StudioでもC#を使えると思っていました
>>133
社内のライセンスとセキュリティの関係でExpressしかダメと言われてしまいました
- 135 :
- SharpDevelop入れて、C#→vbかな
- 136 :
- >>134
質問の内容が変わっているよね
VBAで作ったものはVB.Netに手直し程度で動かせるようになるものができる場合もあるけどC#は書き方も完全に別物
ここで聞くより自分のPCで動かしてみたほうが早い
- 137 :
- >>135
そこはVisual Studio Codeやろ…
- 138 :
- >>134
C#を使えないなんて言ってないよw
VBAとC#は完全に別の言語だと言ってるだけ
VBAの知識はC#を覚える上でほとんど役に立たないよと
- 139 :
- 用語と名付けルールについていくつか教えてください
まず、class Asdf{}の入れた物(Asdf asdf; でいうasdf)は、何と呼べばいいんですか?変数でいいのでしょうか?
また、Asdfの入ったものを自動プロパティで宣言したい場合、一文字めを大文字にすべきなのでしょうか?
Asdf Asdf{get; set;}なのか、Asdf asdf{get; set;}なのかどちらが正しいのでしょうか
- 140 :
- >>139
Asdf asdf; のasdfは変数名でいい
プロパティ名はCamelCase(先頭大文字)にするのが慣習、自動実装プロパティかどうかは無関係
- 141 :
- >>136
失礼しました
まずは色々と触ってみます
>>138
早とちりしてしまいました
基本から勉強してみます
ありがとうございます
- 142 :
- >>140
ありがとうございます
大文字かどうかは、クラス名とプロパティ名が一緒になってしまっていいのか結構疑問に思っていたのでスッキリしました
- 143 :
- Pythonでは文字列をコマンドとして実行するのにevalとexecの2つあるみたいですが
C#で文字列をコマンドとして実行するには、eval以外の関数はありますか?
- 144 :
- あるよ
- 145 :
- subprocess.popen
subprocess.call
subprocess.call_hogehoge
もっとあるぞ
- 146 :
- フォーム間でのデータの受け渡しを行うクールな方法を教えて下さい。
今は以下の2通りの方法ででやっています。
?互いの公開プロパティ(public get / private set)を参照しあう。
(互いに相手フォームへの参照を通じて取得するので疎結合になり切れていない)
?データ保持用クラスを作って、そのインスタンスを参照する。
(データ保持用クラスが増えまくって、だんだん管理困難になりそう)
- 147 :
- MQで結合
- 148 :
- MVCのM
- 149 :
- WpfやUWPなどではDIコンテナってものを使うのが流行りだが、WindowsFormsでも存在するそうだ
こっちは使ったことがないからお薦めはわからんがググって探してみるといい
まあクールってことならWindowsForms捨てるのも一つだね
- 150 :
- >>146
DB
- 151 :
- >>149
WPFやUWP自体がほぼ全くと言っていいほど使われていないのに流行りも何も
DIコンテナは主にWebで利用されるもので、デスクトップアプリではあまり使われないよ
アプリの起動を遅くする原因になりやすいし、エンドユーザーにバイナリを直接配布するタイプのアプリではそもそも実装を差し替えたいというニーズ自体が稀だからね
- 152 :
- DIコンテナはこの場合関係ないのでは?
結局素直に?でやるのがいいと思う
- 153 :
- >>146
クールな方法というか堅実・定石な方法
フォーム間のデータのやり取りなら?
相手のフォームに依存するとテスト時や改修時に困るでしょ
原則として相手の画面やクラスの事は知らないに越したことは無い
その設計でもデータ保持用クラスの管理が大変になることは無い
管理が大変になる場合は設計がおかしい
画面遷移の組合せ数分クラス作るとかアホなことすれば大変だろうけど
- 154 :
- wpfのCheckBoxについてですが、Contentに文字を設定するとその文字の表示範囲もチェックオンオフの感知範囲になってしまいます
これを無効にして純粋にチェックボックスの□のみをクリック範囲にすることはできないのでしょうか?
CheckBoxのContentに文字を設定するのではなく、横にTextBlockを置くなどしないと無理でしょうか?
- 155 :
- うん
- 156 :
- >>154
手段としてはその通りだと思う。
しかし、あのちっさいチェックボックスに正確にマウスを当てないと反応しないってのは、
使い勝手からするとどうかと思う。誤クリックが多いというなら、そもそもの配置場所が悪い
- 157 :
- >>154
PreviewMouseDownイベントを追加して
e.OriginalSourceからVisualTreeHelper.GetParent()でVisualTreeを親方向にたどっていき
途中に"checkBoxBorder"というNameのBorderがあればe.Handled=true;で無効化出来るかもしれない
出来るかもしれないが一般的にCheckBoxはテキスト部分をクリックしてもオンオフ出来るものだから
その一般的な挙動を逸脱するよっぽどの理由がなければ止めておいたほうがいい
- 158 :
- >>156>157
ありがとうございます
具体的にはListBox内にCheckBoxを配置しており、チェックとは別にListBoxから選択時に多少のインフォメーションを表示するといった形にしたいためContentも含めると誤クリックが発生してしまいます
とりあえずは文字とCheckBoxは分離する方向でやってみたいと思います
- 159 :
- 先日C#を始めたものです
Hello Worldを記述出来ました
エクセル等のオフィスソフトに対応している初心者向けのサイトは無いでしょうか?
よろしくお願いします
- 160 :
- C#てオフィスを使って処理したいってこと?
- 161 :
- C#を使ってエクセル等を操作したいと思っています
- 162 :
- >>161
Microsoft Visual C# .NET から Microsoft Excel を自動化する方法
https://docs.microsoft.com/ja-jp/office/troubleshoot/office-developer/automate-excel-from-visual-c
こういう意図でC#を使う人は少ないと思うからそういうサイトもあまりないのでは
- 163 :
- >>161
epplusが手軽だと個人的には思う
サイトはいくつかあるからググって
- 164 :
- VSTO
https://docs.microsoft.com/ja-jp/visualstudio/vsto/create-vsto-add-ins-for-office-by-using-visual-studio
https://docs.microsoft.com/ja-jp/visualstudio/vsto/walkthroughs-using-excel
https://blogs.msdn.microsoft.com/office_client_development_support_blog/tag/vsto/
COMとVSTOの違いはググって
- 165 :
- ClosedXML
https://www.atmarkit.co.jp/ait/articles/1810/24/news016.html
- 166 :
- Closed便利よね
バグ踏んだら面倒だけど
- 167 :
- プロパティで、StringをDateTimeのようにnull許容できるようにしたいのですが、可能でしょうか?
public DateTime? test1 { get; set; } ← 可
public String? test2 { get; set; } ← 不可
DapperでDB操作してるのですが、DBゆえにnullがあるのでどうしたものかと
- 168 :
- C#8.0の新しい文法を使う意図だったら「#nullable enable」のディレクティブをつけないとnull許容参照型にならないよ
そうでなければ、stringは参照型だから?をつけずとも普通にnull許容
- 169 :
- >>162
>>163
ありがとうございます
- 170 :
- >>164
>>165
ありがとうございます
- 171 :
- >>162
帳票作成でC#使うなんてよくある話だろ
- 172 :
- >>168
Stringはそもそもnull許容なのですね
Dapperでデータ取れないのは別の事情がありそうなので調査してみます
ありがとうございます
- 173 :
- >>171
帳票作成でC#を使うこととC#でExcelを操作することはかなり違うけどな
- 174 :
- >>173
>>162が正にそれだろ
- 175 :
- >>174
日本語が理解できないのか?
> こういう意図でC#を使う人は少ないと思うからそういうサイトもあまりないのでは
>>162はその少ないサイトって話だろ…
- 176 :
- データを取得したんですが
第三正規系までできません。
こちらのデータを第三正規系にお願いします。
第一正規系はやりました。
https://i.imgur.com/RruyoYQ.png
おすし名,おすしID,店舗ID,価格,データ取得日時,店舗名,おすし説明,色,分類,大きさ
まぐろ赤身,MGR-0000,KRA,120,2019/10/18,くら寿司,さっぱりうまい。上出来,鮮やか,赤身,小さい
まぐろ赤身,MGR-0001,SSR,110,2019/10/18,スシロー,こってりうまい。おすすめ,濃い,赤身,大きい
まぐろ赤身,MGR-0002,HMZ,90,2019/10/18,はま寿司,まずい。食えたもんじゃない,汚い,赤身,小さい
まぐろ赤身(漬け),MGRZ-0000,KRA,140,2019/10/18,くら寿司,漬け。さっぱりうまい。上出来,鮮やか,漬け,大きい
まぐろ赤身(漬け),MGRZ-0001,SSR,130,2019/10/18,スシロー,漬け。こってりうまい。おすすめ,濃い,漬け,大きい
まぐろ赤身(漬け),MGRZ-0001,HMZ,100,2019/10/18,はま寿司,漬け。まずい。食えたもんじゃない,汚い,漬け,小さい
- 177 :
- >>175
日本語理解できてないのはそっちやろ…
>>174は「帳票作成でC#を使うこととC#でExcelを操作することはかなり違う」に対する反論
- 178 :
- >>176
このスレのタイトルを3回声に出して読んでみようか
- 179 :
- >>177
頭大丈夫?
それとも
> 帳票作成でC#使うなんてよくある話だろ
をごまかしたくて必死なの?w
- 180 :
- 心底くだらない喧嘩だな
- 181 :
- 禿同
- 182 :
- >>179
頭大丈夫?
- 183 :
- >>182
鸚鵡返ししかできないならROMってりゃいいのに…w
- 184 :
- >>183
しつこい
- 185 :
- >>184
夜中までレスしてる>>182に言ってやれよw
- 186 :
- >>183
まだいたのかw
- 187 :
- どこもかしこもマウントレスバトルばかり
なぜひとはあらそってしまうのか…sigh…
- 188 :
- しかも、内容が思いっきりくだらない
マウントを取るためだけにレスをしたとしか思えないくだらなさ
- 189 :
- >>186
>>184w
- 190 :
- C#は見かけ上は一見C++に似たような顔で欺いたVBだな。
- 191 :
- すまんが、インターフェイスとオートプロパティーとがよくわから人だけどさあ
interface IPerson{string Name();}
class Person : IPerson {public string Name{get=>"Taro";}}
これじゃなんでIPerson.Name();を実装したことにならないの?正しくはどうすればよかんべえ?
- 192 :
- 自分で気づいて今インターフェイスをstring Name{get;}にしてみたらできた
すまん、191のは無視してくれ・・・・
- 193 :
- インターフェイスがメソッドで実装がクラスだからダメ
- 194 :
- ×実装がクラス
○実装がプロパティ
- 195 :
- ListViewをLargeImageListとして使って、かつ画像は非同期的に読み込んで反映させていきたいんだけど、
ImageListを変更しても画像が差し変わらない。アイテムを選択したりすると変わる。
差し替え後に強制的に反映させるにはListViewをRefleshするしかない?
- 196 :
- ListViewItemのVMにINotifyPropertyChanged実装しとらんのか?
- 197 :
- RichTextBox.Textプロパティに数MBの文字列をセットすると
5秒くらいフォームがフリーズするので
Task/async/await的なコードを試したのですが
別スレッドからコントロールにはアクセスできないと怒られ
それではとInvokeメソッドを使ってみるも
今度はアクセスで怒られない代わりにまたフリーズ。
上手いこと非同期でTextプロパティにセットする
方法はありますかね。
- 198 :
- >>197
数MBの文字列程度でフリーズした経験はないけど、その環境でフリーズするのなら非同期にしても解決はしないよ
Invoke使おうがその文字列の処理にそれだけかかるのだからどうしようもない
非同期にするのは処理中にキャンセルするとか他のGUIからの入力処理をする目的じゃないと
- 199 :
- ありがとうございます
そういう回答がいただけただけでも助かります
違った角度からの解決策を考えます
- 200 :
- >>197
やったことないけどこれかね
https://stackoverflow.com/questions/47438631/c-sharp-open-form-in-a-new-thread-or-task
- 201 :
- >>197
WPF?
- 202 :
- 事情が許されるなら、俺ならRTFをHTML変換してブラウザコントロールで表示させるけどね
- 203 :
- 試してなくて妄想だけけど、SuspendLayout/ResumeLayoutとか?
- 204 :
- UIスレッド自体が輻輳してるんだからそんなことしても無意味w
別のプロセスか別のUIスレッドで動作させるか、
あるいは小分けにしてちょっとずつ更新するしかないと思うよ。
- 205 :
- クラス継承の意義がイマイチ分かりません
継承したいクラスをフィールドに持たせ、共通して呼び出したいものはインターフェースとして定義するではダメなのでしょうか?
単にその両者をいっぺんにやるためにあるという理解で良いんでしょうか?
- 206 :
- >>205
それで正しいよ
現代のオブジェクト指向においては継承は基本的に悪であって、極力使うべきではない
- 207 :
- 継承が悪ってww
- 208 :
- アポロ13って映画に「何のために作られたかではなく、何に使えるかが重要」って台詞が出てくるけど、
意義とか考えるのは(重要だとは思うけど)後回しにして、どういう使い方ができるかに
注視した方がいいよw
あと、オブジェクト指向関係で教条主義的なことを言う奴の話は眉に唾して聞いた方がいいw
これほんと
- 209 :
- .NET Framework は悪の塊だったのか
- 210 :
- >>206
継承が悪ワロタ
- 211 :
- >>209
悪の帝国Microsoft製だししょうがないなw
- 212 :
- あ〜熊の力〜身に付けた〜
正義のヒーロー
- 213 :
- 毛深いヒーローだな
- 214 :
- Windows上でVisual Studioを立ち上げて.Netアプリ開発をする以上
お前も悪の帝国の軍門に下って生きるしかないのだ
- 215 :
- >>205
例えばフレームワークが用意してるControllerクラスを継承して20個くらい個別のコントローラーを作る場合と
個別のコントローラーにControllerクラスを持たせて呼び出しを委譲できるようにする場合
前者はカスタマイズしたい部分だけ書けばいいけど
後者はControllerの機能を呼び出すためにはすべてのクラスに委譲メソッドを用意する必要がある
Controllerのメソッドを20個呼び出したいなら20x20で400個委譲メソッド定義をしないといけないしテストもしないといけない
自動生成することも可能だけどそれを考慮しても必要になる労力とコンポジションで得られる柔軟性が見合わない
それぞれメリット・デメリットあるからそれを判断して使い分けるのが良いと思う
- 216 :
- 正しいと思うけど、継承のメリットを論じている段階でその例はたぶん通じない。ちんぷんかんぷんだと思うよ
- 217 :
- そういえばc#になってから継承なんて使った覚えがないな
- 218 :
- 継承を使うとしても、KeyedCollectionみたいな用意されたabstractクラスの具象を書くくらいかな
クラシックなWinForms/WebFormsと格闘するなら継承ありきなんだろうけど
- 219 :
- >>217
Formクラスの継承しないの?
- 220 :
- List型からカンマ区切りの文字列にしたいのですが、先頭や最後にカンマがくっついて欲しくありません
こう言う場合ってどう書くのですか?
string s = "";
int i = 0;
foreach(var l in data){
if(i == 0) i = 1;
else s += ",";
s += l.ToString();
}
自分なりにも書いてみたのですがなんか素人感が半端ないです
どうか正しいかっこいい書き方を教えてください、お願いします
- 221 :
- var s = string.Join(",", data);
- 222 :
- Goは>>205のような考えで継承廃止したんじゃなかったっけ?
コーディングコスト削減メリットよりも階層複雑化によるデメリットの方が大きいから、やるならインターフェースでやれって考え方だったと思う
天下のグーグルがそう言ってるからには継承が悪という考えもあながち全否定は出来ない
- 223 :
- var s = (data.FirstOrDefault() ?? "").ToString()
foreach(var l in data.Skip(1))
s += "," + l
var s = ""
foreach(var l in data)
s += "," + l
s = s.SubString(1)
- 224 :
- >>222
Rustもそうだね
MSやAWSが最近推してる
- 225 :
- null許容型に属性のrangeが有効か否かを調べたいんだけど、msdnを見ても書かれてない
こういうときってどうやって調べるの??
- 226 :
- Rangeということは「最小値と最大値」の範囲内かどうかなわけで
nullが範囲外なのは自明だからそもそも意味がなくね?
nullは特別に範囲内ってのなら「最小値と最大値」であるRangeじゃなくて他の方法で表現せざるを得ないよね
- 227 :
- >>226
単純にnull許容型にrangeの属性を付与できるか否かってだけが知りたい
それを調べようとしてもmsdnに記載が見つからないって話
これはtestが0-100になるように有効だろうけど
[range(0,100)]
int test
このrangeは有効なのか?って話
int?にはrangeは無効で101とか入れれますよーとかはないよねって調べたい
[range(0,100)]
int? test
- 228 :
- >>227
range属性自体はstringに対してだろうが付与出来るし、変数への代入を阻止するものじゃない
それが有効かどうかはrange属性を使って検証する側の問題
- 229 :
- ASPについて質問です
MVCにできてWebFormsじゃできないことってどんなのがありますか?
- 230 :
- >>229
できる出来ないの基準は?
既存コントロール使わないで全部時前で処理するなら、出来ないことが重い浮かばない
- 231 :
- おまえには出来ないって基準だと思うよ。
- 232 :
- 原理的に出来ないことは無いが大変さが違う
それこそMVCで組みづらいとか
EFとの相性とか
WebAPI作りたいとか
他言語や環境と混ぜづらいとか
つぶしが効かないとか
まあ新規でWebFormsはやめとけと
- 233 :
- >>229
WebFormsは.NET Coreおよび.NET 5以降ではサポートされない
今から新規に使ってはいけない
- 234 :
- >>227
Required属性とnon-nullable型の関係を確認すればいいと思う
https://docs.microsoft.com/ja-jp/aspnet/core/mvc/models/validation#required-attribute
- 235 :
- >>221
>>223
ありがとう
こんなの全然知らなかったよ
- 236 :
- >>233
あざます
- 237 :
- System.Collections.ConcurrentにConcurrentListはないようですが、スレッドセーフなListはSyncronizedCollectionを使っておけということなんでしょうか?
- 238 :
- >>237
ConcurrentListが無いのは、Listは外部ロックを使わない並行処理との相性が悪いからだろう
追加と参照のみならいいが、削除や途中への挿入があるとインデックスがほとんど意味を持たなくなってしまう
インデックスが指してる要素が他のスレッドによる変更の影響で突然コロコロ変わったら使い物にならないのは容易に想像できるだろ?
SynchronizedCollectionを使うとかそういう話じゃなくて、Listインターフェイスの設計が本質的に並行処理と相容れないんだよ
- 239 :
- あるソフト使ってて、これ使いたいなって機能があるんだけど、なんて検索かけたらいいのか分からないので知っている人いたら教えてください。
WindowsフォームアプリでVisualStudio2015で開発しています。
[欲しい機能]
例えばWindow内が横3段に分かれいるとすると
------------△---------------
みたいに境界が表示されててそこをクリックすると部分的に隠したり、表示させたりできる機能
今作ってるアプリが監視系で画面上に常駐するので、出来るだけWindow内の邪魔なボタンとかは隠しておきたいのでこの機能が欲しいです。
知ってる方いたらよろしくお願いします。
- 240 :
- >>238
> 追加と参照のみならいいが、削除や途中への挿入があるとインデックスがほとんど意味を持たなくなってしまう
それマルチスレッドじゃなくても起きるだろ
- 241 :
- >>239
折りたたみできるpanel とかそんな感じ?
- 242 :
- >>240
程度問題だよ
マルチスレッドなら尚更問題になるのは明らかだろ
結局、インデックスに依存する一連の操作の単位で外部ロックを取る必要があるから、concurrentである意味がない
- 243 :
- >>242
バカなの?
インデックス使って途中挿入削除されたら問題なるのはマルチスレッドには関係ない
そもそも挿入削除してるのにインデックスで処理するのがおかしいと気づけ
- 244 :
- >>243
シングルスレッドでの同期処理ならプログラマが意図しないタイミングで変更が加えられる可能性は少ないだろう
そもそも途中挿入しないならConcurrentBagでいいよね
自分で答え出てるじゃん
- 245 :
- 本質を理解できない馬鹿に説明しても無駄なことがよくわかるなw
- 246 :
- 同意するわw
- 247 :
- >>239
SplitContainer
- 248 :
- >>239
XPの時代のエクスプローラーのタスクパネルみたいなUIだと思うけど
たぶん標準では存在しない
折り畳みできるコンテナを自分で作れば、それを別のPanelの中に入れ子にして
AnchorとDockをうまく設定すれば似たようなことは一応できると思う。
PanelじゃなくてFlowLayoutPanelを使ってもいいかもしれないが、
たぶんかえって使いづらくなりそう
- 249 :
- >>241
そうそう折りたたみって言葉がしっくりきます。
試しに「折りたたみ panel」あたりで検索したらやりたい事が出来そうなサイトが見つけられました。
SplitContainerとクリックイベントを使ってどうにか出来そうです。
また、境界部分にも三角形△などの目印を付けるやり方が載ってるサイトも見つかりました。
いいヒントになりました、ありがとうございます^^
- 250 :
- >>247
>>248
ありがとうございます!
- 251 :
- >>239
Collapse
Accordion
- 252 :
- 頭に0個の参照って表示されてる関数が無数にあるんですが、これ要するに全く使われてないってことですよね
全部消してしまいたい……と思ったのですが実行する中でその関数が呼び出されるような可能性ってあったりするんでしょうか
- 253 :
- リフレクションとかで呼べば参照カウントされないんじゃない
- 254 :
- なんかのライブラリとかで、publicで公開してるやつとかか?
- 255 :
- 複数のパネルをドラッグドロップできるようにしたんだけど
マウスが別のパネルに重なったときにパネルがいれかわってしまうんだけど
これを防ぐにはどうしたらいい?
- 256 :
- >>255
「パネル」をドラッグドロップしている?
一番上または必要なパネル以外のドラッグドロップを受け付けないようにしたら
- 257 :
- >>255
マウスダウンで「掴む」じゃん
マウスドラッグで「移動」するじゃん
マウスアップで「置く」じゃん
ドラッグ中の処理は移動なのにどうしてマウスダウンで掴んだやつ
以外が動いちゃうん?
- 258 :
- マウスがパネルに触れた時点でフォーカス変わったりしているとかだろ
最低限の動きするミニマムコード使って検証する方がここで聞くより解決しやすいと思うがね
そこでわからなかったらそのミニマムコード出してまた質問したらここの人も答えやすい
- 259 :
- >>253
あーなるほどでもそんな上等な書き方出来る人が作ったわけじゃないからなさそうですね
>>254
他の似たようなソフト作る時に使ったソースコードそのまま組み込んだっぽいですね見た感じ
- 260 :
- >>252
まあ普通はコメントにするよね
- 261 :
- List<(string, int)> list;があった場合、listの中からlist.item2が最大の要素(string, int)を得るにはどうすればいいのですか?
var l = list.Max(x=>x.Item2);みたいにしたいのですが、int型が帰ってきてしまいます
- 262 :
- OrderByDescending.FirstOrDefault
- 263 :
- >>262だと計算量のオーダーが増える
先に Max で最大のItem2 (maxItem2)を求めておいて list.First(x => x.Item2 == maxItem2) のほうがマシ
- 264 :
- 何度も呼ぶときウゼーから関数にしろよ
- 265 :
- 経験上、こういう汎用的すぎるユーティリティ関数を自作して多用するのはお勧めしない
個人開発ならいいけど、多人数での開発になると新しいメンバーとの間で記述方法に差異を有む原因になり、結果的に負債化していくんだよ
ダサくてもこういうのは毎回ベタに書いたほうがいい
- 266 :
- 最大値持ってるタプルが複数あったら?
- 267 :
- >>266
逆にどうして欲しいの?
- 268 :
- >>267
知らんがな
- 269 :
- >>262-265
どの方法も一見正攻法ではないように見えるため、人に教えてもらわないことには勇気を出して書けませんでした
ありがとうございます
- 270 :
- >>265
計算量のオーダー気にしてんだろ?
他の奴が違う書き方して増えたら大変じゃん
あ、どうでもよかった?
- 271 :
- 素直に
int max = list.Max(tuple => tuple.Item2);
var maxValueItems = list.Where(tuple => tuple.Item2 == max);
でいいじゃん
int に重複がない前提なら Dictionary 化した方が捗る
- 272 :
- なんかいいロガー知らない?
3つのテキストに警告・注意・情報がそれぞれ安全に吐けるロガー
- 273 :
- nlog
- 274 :
- >>272
最近は ASP.NET Core の Microsoft.Extensions.Logging を使うのがMS推奨の最先端
公式に拘らないならSerilogなんかも流行り
- 275 :
- >>261
list.Aggregate( (result, next) => result.Item2 > next.Item2 ? result : next );
O(n) で一度しか走査しない。
ただし、複数該当しても 1 つしか返さないし、Aggregate メソッドは LINQ to Entities 非対応。
- 276 :
- 質問はこっちでいいんかな?
webviewってWebBrowserのGetElementのような事ってできないんですかね?
テキストに入力したりボタン押したりしたいんですけど、検索してもなかなか見つからないんです
誰か教えてください!
- 277 :
- c# web 自動ログイン当たりでいっぱい記事が出てくるんじゃないの?
- 278 :
- >>276
できるよ
前にtwitterにログインする処理作ったわ
- 279 :
- WebBrowserのHtmlElementみたいなオブジェクトは用意されてない
webView.InvokeScriptAsync("実行したい処理をすべてJavaScriptで記述")
みたいな書き方で地道にやるしかないんんじゃ
- 280 :
- GUIに組み込む必要が無いんならSelenium使えば
- 281 :
- >>276 >>279
https://www.atmarkit.co.jp/ait/articles/0904/02/news116.html
コレじゃダメか?
- 282 :
- なるほど、JavaScript書けば操作できるわけですね
やってみます!
ありがとうございます
>>281
WebBrowserだと、なぜかjQuery使ってるサイトでエラー出るんですよね
レジストリ加えてie11で動くようにはしてるんですけどjQueryで引っかかるんです
でWebViewでと思って質問した次第なんです
- 283 :
- ああごめん、webviewか
webbrowserと勘違いしてたわスマン
- 284 :
- >>275
ありがとう
これ、SQLの感覚とはえらい違うのね・・・・
- 285 :
- RDBは集合論を基にしてるから違う部分も多いよね
- 286 :
- >>284
これよりクエリ式のLINQはもっと酷いと思う
- 287 :
- ASP初心者だけど
がっつり学べるオススメの本とかありますか?
- 288 :
- ASP.NET Coreのことなら日本語のまともな本はない
Classic ASP.NETやMVCのことなら.NET5で廃止されるから今から始めるのはお勧めできない
- 289 :
- coreなら「プログラミングASP.NET Core」一択でしょ。
- 290 :
- >>288
Classic ASP.NETってこの下のこと?
https://i.imgur.com/91aU39j.png
- 291 :
- そもそもがASP.NET Coreなんか学んでどうすんの?と思うおじさんであった…
- 292 :
- >>291
それを使ってるプロジェクトにアサインされたら仕方ないだろ
- 293 :
- ASP.NET Coreは.NET縛りでWebアプリケーション作れ言われたら一番マシな選択肢じゃないのか
- 294 :
- linux+nginx+ケストレル+asp.net coe+ef+postgresql
もはやデフォルトスタンダード()だろ
最安でシステムができる
- 295 :
- >>294 + Visual Code が一番安定
- 296 :
- デフォルトスタンダード
なんだろう?
- 297 :
- ぶっちゃけC#の未来ってどうなの?
来年の.NET 5でクロスプラットフォーム化が加速するようだが
- 298 :
- VSありきの言語ってイメージしかない
- 299 :
- クロスプラットフォーム化だのcoreだのは将来投資あるいは保険みたいなものじゃないの?
本気でそっちの方にいく将来像を持っているわけではないと思う。
UWPもぜんぜん普及しないし、
建前はともかく実態的には.NET Frameworkと一心同体という状態が
今後も続くんじゃないのかな
知らんけど
- 300 :
- 最早coreのほうがmsにとっては主軸だよ
microsoftはwindowsよりazureの方に重きをおいてるし
- 301 :
- 仕事でiPhoneやAndroid開発するときはC#使うことが多くなってきた
- 302 :
- 人脈が出来たのかね?
- 303 :
- ,net coreを主軸にしたばかりにMSの製品が沈没していく未来しか見えない
- 304 :
- 米国国防省の案件、Azureに決定したね
- 305 :
- 米国だと内製が主流だから、受託じゃ怖くて使えないようなものも自己責任で比較的カジュアルに使える開発現場が多いんだよ
.NETの先端は、もはやOSS利用にいちいち申請が必要だったりするようなジャップ企業には縁のないものになってしまった
- 306 :
- >>304
Azureねえ
仕事で2年使い込んだけど、二度と使いたくないわ
C#に魂を捧げる覚悟ならいいけど、それ以外も使う予定があるのなら絶対に選んではいけない
- 307 :
- 魂をささげてはないけどほぼC#しか使ってない
異常に効率が悪いが仕方ない
どうしても必要ならpythonやTS(JS)使うけど
- 308 :
- >>306
俺はAWSよりAzureを選択した国防省の判断の方が信用できると思うわ
- 309 :
- >>308
MSはちゃんとアメリカに税金払ってるし、クラウドプロバイダによるOSSタダ乗り問題に対する姿勢などについてもMSは比較的真摯であり、そういう意味では確かに信用できる
しかしAWS, Azure両方を実業務において一年以上使った上で、サービスとしてはあらゆる面においてAWSの方が遥かに上だ
- 310 :
- サービスとして新しいものが作られてるのはAWSという感じがする
ポリシーが一貫してる気もする
- 311 :
- >>310
AWSは一貫性が高いし、一度作ったサービスは責任を持って継続的に統合し続けるよね
Azureは思いつきのように低品質で他サービスともロクに統合されていないサービスを出してすぐに廃止したり「v2」が出てリプレースされるケースが多い
本当に馬鹿らしくなる
- 312 :
- >>301
ザマリンですよね?
あれってJavaと比べて速度どうです?
あんまり変わらないです?
- 313 :
- 俺もXamarin使ってるけど、起動時だけちょっとモタつく印象かな。
Android。
- 314 :
- C#ってTwitterでの検索が困難だな
#が無視されてしまう
- 315 :
- yahooのリアルタイム検索ならC#でも検索可能
- 316 :
- デザインパターンって何見て知ればいいんですか?
おすすめの本とかありますか
- 317 :
- formをスクロールバーでちょっと下にスクロールしてから
パネルを追加するとLocationのポイントが下にずれてしまいます
panel.Location = new Point(30, 60)
これがスクロールした画面を基準にしたポイントになるので
yの60がずれてしまいます
これを防ぐにはどうすればいいでしょうか
- 318 :
- >>316
GOF
- 319 :
- 自己解決しました
一旦this.Autoscroll=false;
にしてから描写がおわってからtrueにすればいけました
もし他にいい方法あったら教えて下さい
- 320 :
- ワイPG、ASP案件にアサインされ無事WebFormsで強行することに成功する
いきなりCSHTMLとか言われてもわからん
- 321 :
- view engineは選べるやろ
つっても1日もあれば理解できる内容だから
既存のviewを使い回すわけじゃなければ素直にRazor使ったほうが楽
- 322 :
- >>321
RazorってMVCとセットってイメージだが違うのか
Razorの判断は今週末にどれほど理解できるかで判断してみます
- 323 :
- Razor自体は何も難しくないがHTMLやJavaScriptの経験が必須だぞ
- 324 :
- >>323
やっぱりか
昨日コレ買ってRazorが一切出てこないから残念です
https://i.imgur.com/3TrHnT5.jpg
- 325 :
- >>322
MVCならWeb Form用のview engineでもRazorでも簡単に変更可能って話
ASP.NET Web Formsの場合はたぶん無理、できたとしてもハードル高いと思う
- 326 :
- >>85
じゃあマックはダメですね
- 327 :
- 質問なんですが
ゴミ箱に送る方法で簡単な方法ないの?VisualBasicを参照するしかないの?
C#使ってる人はゴミ箱に移動するって使わないのだろうか?
- 328 :
- 使わないね
利用したいケースも思い浮かばない
そもそもファイル削除は極力しない
- 329 :
- OSが勝手にやるもんだろ
- 330 :
- そもそもC#の用途として、今時デスクトップアプリを作ってる人自体が絶滅危惧種だろう
WebアプリやUnityゲームでゴミ箱が必要だと思う?
- 331 :
- >>327
shell32.dll
- 332 :
- winformなんだけど
ひたすら流れてくるログを表示してくれる
フォームに埋め込めるコンソールウインドウみたいな
コントロールってないだろうか
折り返しとか最大保持行数とか設定できるやつ
- 333 :
- >>327
そのVBのアセンブリは.NET Frameworkに標準で入ってるもんなんだから十分簡単な方法では
- 334 :
- ファイラー作ってる人は
ゴミ箱に入ってもらわないと困るかもな
エクスプローラーのゴミ箱からもとに戻す
その一点だな
- 335 :
- >>332
ないと思うけど、そんなのTextBoxでもRichTextBoxでも
新しい行を追加する時に既に「行数 ≧ 最大値」だったら
先に先頭行削除してから追加するだけと違うの?
何も難しくない気が
- 336 :
- >>332
ConsoleControlってのでできそうだけど
ListView使って自分でやったほうが早そう
>>335
先頭行削除するときに先頭行以外の部分をコピーする必要があるから
ログの量とか速度が速いと困るかもしれない
- 337 :
- リスト系はリスト系で1行目の途中から2行目の途中まで選択してコピーとかできなくなったり
- 338 :
- >>335
行数が増えると速度的に破綻する
- 339 :
- >>338
行数は上限があるんだから増えないのでは?w
それに速度が問題になるようなケースならリアルタイムで逐次的に表示更新する
意味ないのでは?
だーれも目で追えないと思うよw
- 340 :
- queueでどうにかならんの?
- 341 :
- 中入れ中出し法
- 342 :
- >>340
お前は問題を履き違えている
Stringのコピーなんか人間の体感スケールで見ればそれ自体は大したコストではない
問題は、Stringの再作成時にテキストボックスの内容全体を更新しなければならないこと
- 343 :
- いや、速度がどうとか言う人がいたんで、
逐次的な表示更新が間に合わないなら
最新n件をキューにためておいてUIの都合でおっとり更新したらいいんじゃないか、
って言いたかったのでは?
- 344 :
- なんかいろいろすいません
テキスト系のコントロールだと全書き換えになって遅いし
List系だと折り返しがしづらいしで
表示だけに特化したコントロールはないかなと思ってました
表示と同時にログはファイルにも記録しているので
ドバッと来て追いきれない時はファイルでじっくり見ます
画面はあくまで気になるログが出ていないか
確認する程度のものです
- 345 :
- 「c# log viewer」とかでググって出てきた奴を片っ端から試す
もし満足できるものが無かったら自分でコントロール作った方が手っ取り早いと思う
ログのパースが不要なら簡単にできるでしょ
- 346 :
- >>344
テキストボックス使ってログを流すときは最新のログを数十行とかだけ表示するようにしたら遅くなることはない
必要なら全体表示に切り替えできるようにしとけばいい
- 347 :
- いやテキストは遅いしチラつくし…
コンソール見たいなログ表示ってやっぱり
作るしかないのかな
- 348 :
- >>347
RichTextBoxでチラついた経験は無いけどダブルバッファリングを有効にしてみたら?
https://ideone.com/SlZEBm
表示が遅いとは思わない
- 349 :
- テキスト折り返したいならDataGirdView
ConsoleControlってのはコレ
https://github.com/dwmkerr/consolecontrol
- 350 :
- >>348
試してみたよ、速度はそこまで悪くなかった
ただ最新のログを表示してくれないので、以下のコードをtextrollに追加してみたんだけど
スクロールバーが激しく上下に移動して
バグったようにちらついてダメだった
log.SelectionStart = log.Text.Length;
log.Focus();
log.ScrollToCaret();
>>349
ありがとう試してみる
- 351 :
- >>330
さいきんはデスクトップアプリつくらないのか、よもまつだな
>>328
削除は危険だからなあ
>>331
さんくす、でもなにやらむずそう
>>333
さんくすね、十分簡単なんだけど、ゴミ箱に移すという基本的なことが標準でできないのかなと
>>334
そうそうそんなかんじで、ファイルを整理するのにゴミ箱ほしいなと
- 352 :
- >>350
ログ表示って何も考えず表示したら勝手になんねっけ?
textBox1.AppendText(s);
これだけじゃねっけ?
- 353 :
- クロスプラットフォームというお題目に従えば
ゴミ箱はOS依存な機能であって基本的なことというわけでもないし…
- 354 :
- ちなみにループの中なんかでラベルの表示を変えたいときは
label1.Update();
みたいにやらんと表示してくんないよ
そういうのはおk?
- 355 :
- >>352
何日も回しているとパンクしてしまう
- 356 :
- >>349
試してみたよ
ログを追加したときに最新行を表示してくれる機能がなかった
中身は結局RitchTextBoxみたいだね
ログはどんどん溜まっていく一方で、古いログを消す機能は実装されてないみたいだった
なかなかこれってものはないもんだなぁ…
- 357 :
- >>350
ScrollToCaret使わなくても組み替えて最新の行をAppendTextで出力するだけでいい
そもそもスクロールしない行数にしたらいい。80行にしてあるのは「この程度では遅くならない」例のためだけ
>スクロールバーが激しく上下に移動して
表示が早いからだよねそれ
- 358 :
- >>355
パンクの原因は?
- 359 :
- 何を既に試して、その上でどういう要件が満たせないから困ってるのか、
最初から書いて欲しいよね
後出しで「それだとこういう不満がある」とか言われてもみんな気分悪くなるだけじゃないの
- 360 :
- 結局、ログがどうあったらいいかよくわかってないんだろ
そもそも「誰が」「どう使う」ためのログなのか?わかってなきゃ
この世に存在しない無敵のログ表示を求めて彷徨い歩くだけだ
- 361 :
- WinTailでええやん
- 362 :
- 最初に言った通りコンソールウインドウみたいなのが欲しいんだよね
最新のログが一番下に表示されて、勝手にスクロールしていくような
ログが延々と流れてくるので保持行数は200行程度として
できるだけ軽いのが欲しいんだ
- 363 :
- 200行程度ただのtextboxで十分では?
200万行の打ち間違い?それか1行数万文字あるの?
- 364 :
- TextBoxに1行100文字のn行の文字列を設定し、最下行を表示させるのにかかった時間
(@Ryzen 3700X)
2行:2[msec]
20行:4[msec]
200行:8[msec]
2,000行:60[msec]
20,000行:563[msec]
200,000行:5,624[msec]
2000,000行:測定不能(OutOfMemoryException)
備考
TextBoxに1万行設定した場合、設定にかかる時間はそんなでもないが、TextBoxを変形させる(ウィンドウサイズ変更に追従させる等)のに時間がかかる
5万行になるとまともに変形しない
- 365 :
- 視認するデバッグコンソール程度で重いも軽いもないと思うが
骨董品レベルのPC使ってるのか?
リアルタイムで見るログならログレベルで絞ればいいのでは?
- 366 :
- 直近200行のリングバッファを表示するだけではダメなのか
2000,000行保持してまさか目視するわけじゃないよな
200行以前はファイルにでも吐いておけば
- 367 :
- 200行程度List<string>で保持して更新あるたびにaddとremoveして都度Textboxを更新でなんの問題も無いと思う
気になるならListをQueueにでもすればいい
ごちゃごちゃさせる程でもない単純な要件なんだから実装もそれに倣えばいい
- 368 :
- >>350
Double Bufferingでもチラつきが激しいなら
再描画を一旦停止してTextBox更新してから再開
https://dobon.net/vb/dotnet/control/beginupdate.html
>>358
AppendText使いつつ最大行数を超えた古いログ削除できる?
- 369 :
- >>332の件、ちょっと気になったのでTextBoxで試してみた
(a) SelectedTextを空文字で上書きして先頭の行を削除、
その後AppendTextで新しいログを追記
(b) Linesを一旦List<string>にコピーして先頭行の削除と
新しいログの追加を行った後、Linesに書き戻しキャレットを末尾に
移動しScrollToCaret
(a)の方法でやると確かにスクロールバーがプルプルするw
(b)の方法ならそれはほとんど起こらない(完全ではないみたいだが)
(a)の方法でも、先頭行を削る時に一気に10行とか削れば
そこまで気にならない印象
- 370 :
- そもそも高速でログを流すのでなければ表示の切り替えはそんな目立たないと思うんだけど
>>369
(a) を参考に空文字で上書きするときにTextBoxからFocusを外してスクロールバーが動かないようにできないかと思ったけどうまくできなかったw
削除時にスクロール位置動かなければうまくいきそうだけど手段が他にすぐ思いつかない
他に思い付いたやり方は3つ
・AllocConsole()使ってコンソール画面を表示してそこにログを流す
コンソール画面閉じるとプロセスも閉じるのでその対策が必要
・348にRichTextBoxを2つ用意して交互にバックグラウンドでスクロールさせた後に表示する
・348で最新のログを一番上に追加していく
- 371 :
- そうなんだよ
意外と難しいんだよね
- 372 :
- いや、難しくしてるのは意味のない要件だって
細部まで詳細に思惑通りに動くコントロールが要求されるなら1から全部作るしか無い
TextBox等のすでに提供されてるコントロールを使うならそれに則った要件に変えればいいだけ
内部の動作ログを画面上に出してほしい要件はちょいちょいあるけど、俺個人はいつも上部を最新にするかスクロールさせないかの仕様を取る
何なら画面のチラツキなんて目を瞑ることもあるし最新行への追従をさせないこともある
楽に実装したいからそういうコントロール使ってるんだもん
どうしても要件変えられないなら低レベルAPI使って描画制御からやりゃほとんど対応できる
対応しただけのコストに見合うメリットがあるかは知らん
クライアントの強い要望とか言われたらするしか無いだろうけど
- 373 :
- >>372
俺もDataGridViewにして上部を最新にしちゃうな
大体タイムスタンプの列あるし
- 374 :
- そういえば昔、グリッドだかリストコントロール+それとは別のコントロールとして縦スクロールバーをつけて
擬似的にスクロール可能な全行表示コントロールを作ったことあった。
実際としてはグリッド・リストに一部のデータを表示しているだけってヤツね。
経験としては割に合わないからやめといた方がいいと思う。
- 375 :
- zedgraph以外で使いやすいグラフ描画ライブラリをご存知ないでしょうか。
- 376 :
- 何が良くて何が悪いのか、それがわからないと提案できないぞ
- 377 :
- >>350
>>348の試してみたけど
新しいTextを設定する時に描画を停止してやれば普通に使える
描画を一旦停止させる方法は>>368のリンク
private void texroll(string st)
{
roll.Add(st);
if (roll.Count > 300) roll.RemoveRange(0, 100);
using (new SuspendRedraw<RichTextBox>(log))
{
log.Text = string.Join("\n", roll.ToArray());
}
log.SelectionStart = log.Text.Length;
log.Focus();
log.ScrollToCaret();
Application.DoEvents();
}
- 378 :
- もうimage上じゃなくpictureboxに直接描画したほうがよくないかなw
- 379 :
- 開発終了してるからかな
- 380 :
- >>379
imageが?
- 381 :
- >>375
使いやすいかどうか知らないけど
最近使い始めたLivechart
- 382 :
- >>377
DoEventsは無くしたいな
- 383 :
- 関数ポインタの配列的なことをマネージコードでやるにはどうすればいいの?
- 384 :
- FuncやらActionを配列で持つとかとか
- 385 :
- 普通に足せない?
- 386 :
- イベントハンドラ以外にマルチキャストを使うのはお勧めしない
古臭い黴の生えた機能だよ
- 387 :
- >>383,384,385
arrayから取り出して実行するところのコーディングが分かりません
void(*ptf[n])(void);
ptf[0] = func1;
ptf[1] = func2;
ptf[2] = func3;
...
(*ptf[i])();
こういうのをメゾットでやるには、マネージコードではどうすればいいんだろう?
- 388 :
- >>387
デリゲート
https://ufcpp.net/study/csharp/sp_delegate.html
- 389 :
- >>387
var funcs = new Action[] { Func1, Func2, Func3 };
funcs[ 0 ]();
とか
var func = funcs[ 1 ];
func();
- 390 :
- C#で関数を値として受け渡すためにはデリゲートっていう型を使う
- 391 :
- マネージコードってなんや?
- 392 :
- >>391
「マネージコード」は「馬鹿でもわかる」と読み替えればだいたい間違いない
- 393 :
- palallelで同じbyte[]を読み書きしてみたら
思ったより処理が早くないんだけど
排他処理とかで重くなっていたりとかある?
- 394 :
- 何でも非同期にしたら速くなるわけではない
理由は排他制御とかTaskの生成コストとか色々
高速化するにはうまくやる必要がある
- 395 :
- スレッドプール使うといっても生成コストは結構高いので一瞬で終わる処理だと逆効果
- 396 :
- Parallelは処理の分割とかスレッドプールの管理はしてくれるけど
排他制御はしてくれんやろ?
- 397 :
- やっぱそうか…単純に単純に処理が重いんだね
見直してみますありがとう
- 398 :
- structをpublicにしても各メンバーは一括でpublic扱いにならないのなんでなん?親分がpublicなら子分も暗黙的にpublicやろがいと思いまして。
- 399 :
- せやな
- 400 :
- >>398
誰に対するpublicなのか勘違いしてね?
- 401 :
- >>398
全部publicつけるように習慣づけとけばいいよ。
- 402 :
- >>398
お前の親が知人にお前のことを紹介するとき、お前の机の中のエロ本やパソコン内のエロ画像フォルダを勝手に公開されたら困るだろ
- 403 :
- >>396
lookするだけちゃうの?
- 404 :
- 見て!
- 405 :
- >>402
この説明したことあるわw
- 406 :
- WPF始めたばかりでThumbを使ってドラッグでコントロールを移動をしたかったんだけど
これってそもそも中にラベルやボタンを置けない仕様なのかな…?
とりあえずtemplateを使って無理矢理borderとbuttonを置いてみたけど
今度はborderからはDragStartedもDragDeltaもThumbに届くのに、buttonからは届かない
Thumbってどういう風に使うものなんですかね…
ウインドウのタイトルバー的な感じに置くものなのでしょうか
- 407 :
- 他のUI要素の部品として使われることを想定してるもんだからね
- 408 :
- 例えばラベルにThumbの機能を持たせようとするとどうしたらいいんだろう?
thumbのテンプレートにラベルを置いたとして、ラベルのテキストやbackgroundプロパティを
tumbのプロパティとして定義することはできるのかな…?
- 409 :
- Thumbの機能ってのはよく分からんが、「ラベルにThumbの機能を持たせる」のに
Thumbにラベルの機能持たせるとか主客転倒してるように思える
- 410 :
- 基本的にThumbってのは「マウスのドラッグで操作する」ことを表すもので
そのドラッグにどう意味づけするかはThumbではなくてThumbを持っている要素が決めるもの
スクロールバーならドラッグをスクロールとして扱うし
スライダーなら値の増減を表す
- 411 :
- もしかして俺の理解がおかしいのかな
普通のウインドウみたいにタイトルバーをドラッグしてコントロールを動かしたい場合って
<dockpanel>
<thumb>
<label>
みたいにするものなのかな、それとも
<dockpanel>
<label>
<thumb>
が正しい?
本当は
<thumb>
<dockpanel>
<label>
みたいにしてdockpanelのボタンとか以外の場所は
ドラッグ移動可能にしたいのだけど…
- 412 :
- DTD見ろ
- 413 :
- 正直全然説明が理解できんが
DockPanelをルートとしたウィンドウ内ウィンドウ的なのが存在してて
それのタイトルバー的なのをマウスで掴んで動かしたいってことでいいのか
まあThumbの出番は無いだろうな
- 414 :
- >>413
そういうこと!
なんだけど出番ないのか…どうしたらいいんだ…?
- 415 :
- ドラッグできる部分をBorderとかで定義して
そいつのMouseLeftButtonDown/MouseMove/MouseLeftButtonUpイベントでDockPanelを動かすコードを書く
- 416 :
- public class Person
{
string name;
int age;
public read()
{
// ファイルを読み込んでnameとageに入れる
}}
こんなクラスがあるとします。1クラスに1役割ということでここからPersonクラスとPersonReaderクラスに分けることを考えます。
そのときPersonReaderは以下の2種類ってどちらがベターでしょうか
public class PersonReader
{
private Person person;
public PersonReader(Person person)
{
this.person = person;
}
public read()
{
// ファイルを読み込む処理
person = 〜
}}
Public class PersonReader
{
public Read(Person person)
{
// ファイルを読み込む処理
person = 〜
}}
readに引数無いほうがきれいな気がするんですけど、readerにもオブジェクトの参照持たせるのは不味いような気もします。
よろしくおねがいします
- 417 :
- >>416
あんまり教条主義的に考えない方がいいのでは?
特に事情がない限り
// ○○ファイを読み込んでこのインスタンスのフィールドとプロパティーを更新する
public void Load(string path)
{
....
}
とか、
// 〇〇ファイルから新しいインスタンスを作成
public static Person FromFile(string path)
{
....
}
こんなの方が使いやすいのでは?
- 418 :
- win32apiをc#から呼ぶのは色々大変です
少し調べたらVanara.PInvokeのnugetがありました
日本語の記事が余り無いようですがどんなもんなんでしょうか?
- 419 :
- >>416
C#を使用している限りでは、このコードでメモリリークの問題は起きないはずです
それでもどうしても心配だというなら弱参照にしてください
- 420 :
- >>417
あーまぁ今回の例だとそうかもしれないですね。
ただ実際の開発だとxmlを読み込むんですけどちょっと処理が膨大で。読み込む先、今回で言うところのPersonクラスも相当でかいので分けないといかんだろと
- 421 :
- >>416
正直どっちも勘弁してって感じ
インスタンス生成の責務をファクトリに割り当てる頻出パターンなので
ファクトリやファクトリメソッドのキーワードでググればいいと思う
ファクトリクラスはusing Personしても参照を持つ必要はない
- 422 :
- >>420
personは分解できないの?
そんな巨大ならpersonを分解して
xml読み込んでパースした情報を保持するやつ
パースした情報からpersonの部品を作るやつ
personの部品からpersonを作るやつ
みたいに段階踏むかなぁ
- 423 :
- nugetなんて誰でもリリースできるんだから著名じゃないライブラリの良し悪しは中々情報は得にくいだろうね。
頑張って元言語の記事読むしかないんじゃない?
- 424 :
- まじかよ
nugetはどっかの技術検査受けて
認められたのだけがnugetにリリースされてるんだと勝手に思ってた
- 425 :
- >>420
どうしても分ける前提なわけね。
まあPersonReader がPersonのインスタンスを持つのは普通に変だよねやっぱり。
どこにも必然性がない。
PersonReader が状態を持つ必要がなければstaticクラスのstaticメソッドでいいはず
どうでもいいけど、
// ファイルを読み込む処理
person = 〜
じゃなくて、例えば
// ファイルを読み込む処理
person.Hoge = 〜;
person.Hage = 〜;
person.Piyo = 〜;
...
だよね多分?
- 426 :
- 最近のVisualStudioなら暮らすライブラリのプロジェクトで[ビルド(B)]-[パッケージ(P)]をクリックするだけで
nuget登録用のnupkgが出来上がるよ
あとはnugetにログインしてWeb上から適当に情報入力して登録すればすぐ反映される
悪意のあるパッケージとかどうやって識別してrejectしてるのか正直不思議
それとも表沙汰になってないだけでnpmみたいな汚染が日常的に起こってるのか
さすがにストアアプリよりははるかにマシだけどNuGetも玉石混合、というかゴミパッケージのほうが多いと思うよ
- 427 :
- 「玉石混交」な
- 428 :
- attributeって結構使うもん?
- 429 :
- >>428
自分で作ることは滅多にないけど、標準で用意されてるのは時々使う
FlagsAttributeやDllImportAttributeなんかは比較的良く使われているのではないだろうか
使わない人は全然使わないだろうけど
- 430 :
- >>429
初学でASP.NET Coreのソースおっかけたりしても意味わからんくて困っている
- 431 :
- 調べてないけどxmlからデータクラス生成するくらいなんかのライブラリに投げちゃいかんの?
- 432 :
- と思ったら言語標準の機能で十分行けるな
- 433 :
- >>430
Attribute自体はプロパティやメソッドに付与して、コンパイラやライブラリに対して追加の情報を与えるだけ
Attributeが具体的に何を意味をするのかは、それぞれのAttributeによる
ASP.NET Coreのソースだったら、Validation関係かな
- 434 :
- >>428
自作はenumにラベルつけるのに作るくらいかなぁ
enumの定義値とメニュー上の表示文字列対応させるみたいな感じ
多言語対応とかあるような案件じゃ使えないけど
すでにあるのはちょいちょい使う
TestとかBenchmarkとかは属性ありきだったりするし
- 435 :
- >>434
enumにラベル付けるのは自分も作ったよ
多言語対応は第2引数にロケール指定出来るようにして多重定義するようにした
- 436 :
- >>435
そのやり方だと対応言語増やすときに再ビルド必要になっちゃうよね
enum以外にも定義が必要な語句は多そうだからそういうのは外に出す方を取るかなぁ
まぁケースバイケースだろうけどね
- 437 :
- >>436
属性ではリソースキーを指定して、文字列リソースを引っ張って来るようにした方が
文字列リソースが分散しなくて良いね
- 438 :
- 属性をキーにするぐらいにあらenumを直接キーにすりゃいいじゃんw
素直に拡張メソッドてToString定義した方が早いよw
- 439 :
- >>434
それ自作しなくてもDescriptionAttributeが標準であるよ
- 440 :
- 拡張メソッドが使える以前はenumと相互に暗黙変換できるクラスを作って
そこに変換メソッドを書いてたけど、あれは実にあほらしい作業だったなあ
- 441 :
- >>439
実際にはenumとラベルを相互に変換したり複数対応させたり等々ケースに応じて細かな要件が出てくるからそういう拡張をするときのベースとして使ってる
あとキャッシュしないと遅いから自作側でキャッシュ処理も含めて作ることが多い
descriptionだとその属性自身を機能拡張したいときにしづらくない?
- 442 :
- BindでEnumToStringConverter作るからそこでやるだろ。そこでリソース文字列を引っ張るようにする
- 443 :
- チャートエリアとか図解したサイトないですか?
シリーズだかなんやら意味分からん
- 444 :
- C++のライブラリのちょっとした機能使いたくて現状C++でexe作ってそれをprocessで呼び出してる構造なんですけどなんかデメリットあります?
一応ラッパーもあってC#に一元化も出来るんですけどまぁ遅い。それに実行ファイル配るときに一緒にdllわさっと渡さないといけなくて。今はC#とC++のexe2つ渡すだけです
ソースコード別になっちゃって管理がめんどいくらいしか思いつかなかったんですけど、なんかトラブルの種になりそうなことありますか?
- 445 :
- >>421->>422 >>425
参考になりました。ファクトリ周り全然分からなかったので勉強します。
- 446 :
- フォーム上に左1/4が欠けた円を表示させたいです。
FillEllipseで円を書いてFillRectangle背景色で1/4を塗りつぶせばいいや
と思ったら、FillRectangleが隣り合った塗りつぶしたくない図形も塗りつぶしてしまう。
なにかいい方法は無いでしょうか?
- 447 :
- >>444
別に現状で不満ないなら良いのでは?
配布するものならexeが複数あるとC++の方のexe起動してうごかねーっていうのがくるかも
あと動かす環境が変わったときに両方のexeの再ビルドが必要になる可能性があるとか
環境まで言い出したらexeかどうかなん些細な話かもしれんが
- 448 :
- >>446
FillPieでできない?
- 449 :
- >>446
DrawPie、FillPieがあるわけだが
- 450 :
- dllにでもしたほうがいい気はする
- 451 :
- すいません。
扇形ではなくて、左1/4のところでまっすぐカットしているという意味です。
図形の説明難しいな・・・。
- 452 :
- よくわからんが、SetClipで描画範囲を指定すればいいんじゃないの
- 453 :
- 円弧の端と円の中心、もう片方の端と円の中心でそれぞれ線分を引いた形じゃなくて
円弧の端と端を1本の線分でつないだ形?
まあGraphicsPath作ってFillPathすればいいんじゃない
- 454 :
- 私なら直線分解してポリゴン描画かな😅
- 455 :
- >>446
境界線が不要でただ塗りつぶすだけならこれが一番簡単だね
public void FillSlicedEllipseL(Graphics g,Brush brush, RectangleF rect, double ratio)
{
var clip = g.Clip;
var sliceRect = rect; sliceRect.Width *= (float)ratio;
g.SetClip(sliceRect, CombineMode.Exclude);
g.FillEllipse(brush, rect);
g.Clip = clip;
}
必用ならパス作るしかないか
- 456 :
- >>444
Process経由の場合はDLL使ったAPI呼び出しに比べると
マーシャリング/アンマーシャリング、エラーハンドリングが面倒になりがち
現状そこに不満がないなら無理してDLLに変更する必要はないと思う
あと一応バイナリリソースとしてdllやexeをC#のアセンブリに埋め込んで1ファイルにすることも可能
(リソースからexeを取り出して起動したりDLLをロードしたりするための追加コードが必要)
- 457 :
- >>443
NGワードに引っかかってリンク張れない…
「mschart series chartarea」でグーグル画像検索すると沢山表示されるうち2件位は希望の情報だと思うよ
- 458 :
- EXEもLoadLibrary出来るのよ。
なので関数をexport出来れば、どちらでも使える
- 459 :
- いろいろありがとうございます。
説明ヘタですいません。
https://ja.wikipedia.org/wiki/%E5%BC%A7_(%E5%B9%BE%E4%BD%95%E5%AD%A6)
の上から2番めの図のABで円の端を切り落とした形状です。
任意の半径をしていするとこの形状が表示できるようにしたいのです。
隅っこがAB直線で欠けた円ですね。
- 460 :
- https://ja.wikipedia.org/wiki/%E5%BC%A7_(%E5%B9%BE%E4%BD%95%E5%AD%A6)
貼り付けたら後ろがハイパーリンクじゃなくなってますが、コピペしていただくとwikiのページが開きます。
- 461 :
- やっかいなのは
欠けた円の半径を任意に変更したいのでGraphicPathで円に接する直線を引くのが難しいこと
欠けた円をたくさん描くので、rectangleやgclipでやると隣の欠けた円にも影響を及ぼすこと
なんですよね。
clipならできるのかなぁ。
- 462 :
- 単純に描画順で回避すればいいじゃん
- 463 :
- >>461
>>455で何がダメなの?
- 464 :
- それもできないなら一度
どっかのピクチャーボックス(wpf?winforms?)に貼り付けて
欠けた円を作ったあとで
それを必要な領域だけくり抜いて持って来ればええよ
- 465 :
- vs2019でc#フォームアプリを作ろうとするとデフォが.net coreなのね
.net frameworkはやたら下の方に出てくるしこっちもデフォはユーザコントロール用だ
- 466 :
- >>457
おおーこれです!
ありがとうございます
- 467 :
- Properties.Settings.Default を変数dに入れて
クラス内のpublic変数にしたいんだけど
何かうまい方法はないだろうか
記述が長すぎるから短縮したいんだよね
- 468 :
- >>467
>>100
- 469 :
- usingは無理でした
名前空間はPropertiesだけで
Properties.Setting.Default のエイリアスや参照は作れないようです
privateだと参照が作れるんですが
publicにするとDefaultが internal sealedで定義されているため
エラーになっちゃうんですよね…
- 470 :
- そりゃそうだろ
internalでいいじゃん
using static hoge.Properties.Settings;
で Default.fuga なんて書き方もできるけど
- 471 :
- publicなgetter setterもったラッパーでも作っちゃえば?
- 472 :
- >>461
これじゃいかんのか
http://20100718seko.blog130.fc弐.com/blog-えんとり-43.html
https://どぼん.net/vb/dotnet/graphics/drawrectangle.html#section7
https://docs.microsoft.com/ja-jp/dotnet/api/system.drawing.graphics.fillellipse
- 473 :
- 以下のプログラムについて質問お願いいたします。
--- 以下プログラム ---
public static int TwoAdicValuation(ulong x)
=> TwoAdicValuationTable[(x & ~x + 1) % 67];
static readonly int[] TwoAdicValuationTable
= InitializeTwoAdicValuationTable();
static int[] InitializeTwoAdicValuationTable() {
var table = new int[67];
table[0] = -1;
for (var i = 0; i < 64; i++) {
table[(1UL << i) % 67] = i;
}
return table;
}
--- 以上プログラム ---
上記の TwoAdicValuation メソッドは、
・引数 x がゼロのときは -1 を返す
・それ以外の場合、引数 x が 2 で割れる回数を返す
という動作をするようです。
例えば TwoAdicValuation(2*3*5) は 1,
TwoAdicValuation(2*2*2*17) は 3,
TwoAdicValuation(19) は 0,
TwoAdicValuation(0) は -1 を返します。
しかしプログラムを読んでみても、
何がどうなってそのような動作になっているのかどうしても理解できません。
何かお分かりになることがあれば
どんなことでも構いませんので教えていただけないでしょうか。
どうぞよろしくお願いいたします。
- 474 :
- Ruby で説明すると、
2進数で、右から連続する、0の数が、2の累乗を表す。
0b は、2進数
0b0101(5) → 奇数
0b0110(6), 0b1010(10) → 2^1
0b0100(4) → 2^2
0b1000(8) → 2^3
- 475 :
- >>473
なんか1年ぐらい前にも同じネタがあった気がするんだけど...
コードよく読んでないけど、要するに2進数で見た時に
「値が1の最下位ビットの位置」を求めてるだけだと思うよ。
2進数で2で割ることは右に算術シフトするのと同じなのは分かるよね?
あと、奇数とはbit0が1の数なのも分かるよね?
だから「x が 2 で割れる回数」と「値が1の最下位ビットの位置」は同じになる
- 476 :
- >>475
× 算術シフト
〇 シフト
要するにLSBが1になるまで右シフトを繰り返した、その回数を求めてるんだと思う
知らんけど
- 477 :
- なるほど因数分解して2がいくつあるか数えるのね
- 478 :
- >>474-477
ありがとうございます。
色々と実験してみた結果、
x & ~x + 1 が、x と 2で割れる回数が同じ、
1UL << i の形の値になることがわかりました。
ただ、どうして x & ~x + 1 と 1UL << i が
結びつくのかまだ理解できておらず、
67 で割った余りを計算する理由も分かっていないので
引き続き考えてみようと思います。
もし他にもヒントがあれば教えていただけると嬉しいです。
よろしくお願いいたします。
- 479 :
- Ruby で作った!
そんな、67 とか、訳の分からないロジックを解析しても、仕方ないだろ。無視すべしw
def func( num )
return -1 if num == 0
# 2進数の文字列にして、逆転して、左から探す
num.to_s( 2 ).reverse.index( "1" )
end
nums = %w(0 5 10 4 8).map!( &:to_i ) # 数値の配列
p nums.map { |num| func( num ) }
#=> [-1, 0, 1, 2, 3]
- 480 :
- なぜC#スレにruby厨が?
- 481 :
- >>473
tableの中身を理解するにはi, table[i], 1UL <<1, (1UL<<1 %67)を0~64の範囲で逐次出力してみる
xとx&(~x +1)の関係を理解するには一旦byteで考えてビット演算を図にして考えてみる
x=1, ~x=254, x&(~x+1)=1
x=2, ~x=253, x&(~x+1)=2
x=3, ~x=252, x&(~x+1)=1
x=4, ~x=251, x&(~x+1)=4
x=5, ~x=250, x&(~x+1)=1
x=6, ~x=249, x&(~x+1)=2
x=7, ~x=248, x&(~x+1)=1
x=8, ~x=247, x&(~x+1)=8
64と67の関係は、16と19, 32と37でも同じ結果が得られそう
ぶっちゃけbrainfuck系のコードなのでビット演算を理解すればあとは忘れていい類だと思う
- 482 :
- >>478
わかったわ
x & ~x + 1 は、最下位の1のビットだけ残す計算
ビット反転して1を足すことで、最下位の1まで繰り上がり
他のビットは必ずどちらかが0になるのでandで消える
で、67で割った余りを求める理由は、2^t を67で割った場合
tが0〜63の範囲ならユニークな値になるから
最小サイズの配列のインデックスを返す値として
最も適していたということだな
なかなか面白いプログラムだった
- 483 :
- 文字列にするとかいう高コストの処理をしないためのアルゴリズムなのに無視すべきとか何言ってんだw
競技プログラムとか触ったこと無いの?
- 484 :
- >>480
そいつはいろんな所に湧いて出てくる有名人だ。スルー推奨。
- 485 :
- >>482を修正
>で、67で割った余りを求める理由は、2^t を67で割った場合
割った余りを求めれば
>tが0〜63の範囲ならユニークな値になるから
tが1〜64の場合だな
かなり洗練されているが読みやすさとしては
仕事で扱うには勘弁してほしいw
ところでまさかこれ課題じゃねーよな?
- 486 :
- >>479
ありがとうございます。
Ruby を扱う技術が私には無いので
アイディアだけお借りして C# に翻訳してみたところ、
期待通りに動作いたしました。
ちなみに、他の方から実行速度に関するご指摘があったので
オリジナルと比較してみたところ、私の書いたコードでは
オリジナルよりも 250 倍程度時間がかかってしまうようでした。
とはいえ読みやすさは良いプログラムの重要な条件なので、
場面に応じて使い分けるのが良さそうですね。
- 487 :
- >>481-482
大変わかりやすいご説明どうもありがとうございます。
>>481
> xとx&(~x +1)の関係を理解するには一旦byteで考えてビット演算を図にして考えてみる
>>482
> x & ~x + 1 は、最下位の1のビットだけ残す計算
いただいたアドバイスを元に↓のような実験をしてみて理解できたと思います。
00101100 (44)
11010011 (~44)
11010100 (~44 + 1)
00000100 (44 & ~44 + 1)
>>481
tableの中身を理解するにはi, table[i], 1UL <<1, (1UL<<1 %67)を0~64の範囲で逐次出力してみる
>>482
> 67で割った余りを求める理由は、2^t を67で割った場合
> tが0〜63の範囲ならユニークな値になる
なるほど!実験してみて、確かにそうなっていることがわかりました。
40 人のクラスの中で同じ誕生日のペアがいる確率は 90% 近いと
聞いたことがあるので、なんだか不思議な感じがします。
>>481
> 64と67の関係は、16と19, 32と37でも同じ結果が得られそう
すごく興味深いです。私も実験してみたところ、
1 と 2、2 と 3、4 と 5、8 と 11 という感じになったのですがあってますか?
また、「16と19, 32と37」というのをさらっと書いてくださっていますが、
これは実際に調べてくださったのですか?
それとも、きちんと数学を勉強していればすぐに分かることなのでしょうか。。。
- 488 :
- >>485
> ところでまさかこれ課題じゃねーよな?
学校の課題というわけではないのですが、
本来は自力で解くべきものだと思います(汗)
ごめんなさい。。。。
- 489 :
- >>487
限定された範囲で、規則性があるものは、理論的に説明できないだろ。
ちょっとしたトリビア
355 / 113 = 3.141592 92035
円周率と、小数点以下6桁まで一致するとか
- 490 :
- コレクションの初期化子で複数を同じ値でまとめて指定する方法はないでしょうか?
Pythonの、l=[False]*100みたいなことをやりたいのですが、
var l = new List<bool> { False, False・・(100個分)}ぐらいしか思いつかず・・
- 491 :
- >>490
Enumerable.Repeatでググろう
- 492 :
- >>487
16、32、64はビット数
ついになる数はそのビット数の次の素数
- 493 :
- ruby君はほんとひどいな
自分が軽く触れそうな話題にだけ飛びついてわからない部分は謎理論で適当な回答しかしない
- 494 :
- >>492
> ついになる数はそのビット数の次の素数
レスありがとうございます。
私も最初そのように考えたのですが、
16 の対が 17 ではなく 19 なので
そういうわけではないようなのです。
ちなみに 16 の対が 19 になるというのは
>>481 さんが書いてくださっており、
私のほうでも改めて確認しているので、
間違いではないと思います。
- 495 :
- >>494
ほんまやね、すまん
ここらへんは整数論の話だから得意な人に聞けば話は早いんじゃないかな?
フェルマーの小定理から決まるのかな?って思うけど俺自身は整数論詳しくないんで解説できないわ
- 496 :
- >>495
レスありがとうございます。
フェルマーの小定理について調べてみました。
フェルマーの小定理から分かることとして、p が奇数の素数のとき、
(2^0)%p と (2^(p-1))%p はともに 1 になるようです。
つまり >>482 さんの言葉をお借りするなら、
奇数の素数 p がビット数 n 以下のとき
t が 0〜(n-1) の範囲で変化すると (2^t)%p がユニークにならないため、
ビット数 n の対としてn 以下の奇数の素数は不適切ということになります。
ただ、フェルマーの小定理は p > n のときに (2^t)%p がユニークになることを
保証するものではありませんし、そもそも奇数の素数じゃなくても
ビット数 n の対としてn 以下の数が適切でないのは当たり前な気がするので、
フェルマーの小定理から直ちに欲しい情報が得られるというわけではないようです。
とはいえ、関連しそうな分野が分かっただけでも大きな前進ですので、
もう少し詳しく調べてみようと思います。どうもありがとうございました。
- 497 :
- ついでにガロア体も調べると、
QRのコード化で楽になるよ:-p
- 498 :
- >>491
ありがとうございます。下記でうまくいきました。
var l = Enumerable.Repeat(false, 100).ToList();
- 499 :
- >>498
もしfalse限定ならC#のbool変数の初期値はfalseに決まってるからbool配列100個を作るだけで目的のものは作れるよ
trueの場合はRepeatすることになるけど、falseなら配列宣言で済ませたほうがパフォーマンスは良い
100個程度なら微々たる差ではあるけど
- 500 :
- >>498のは値型だからいいけど参照型でやると楽しいことになる
- 501 :
- 値型でしか使ったことなかったけど調べたら参照型は複製してくれないのかよ!
やっぱforループしか信じられねえわ
- 502 :
- >>500
Pythonで[[0, 1]]*10とかやって、恐ろしいことになったのを思い出しました
今はちゃんと[[0,1] for _ in range(10)]としてますが、C#でも同じですね
それにしてもPythonから移ってくると、C#は難しいですね・・
- 503 :
- >>497
レスありがとうございます。
いろいろなビット数 n の対になる数を調べてみると、
必ずしも素数になるとは限らないものの、
調べた範囲では全て p^k(p は素数、k は自然数)の形になっていました。
で、教えていただいたガロア体というのは要素の個数 p^k の集合ということで
ビンゴかと思ったのですが、
どうやら私が考えているのは p^k を法とする剰余環というものらしく、
k = 1 で無い限りガロア体とは本質的に異なるもののようです。
しかし色々と調べれば調べるほどこのあたりの分野から答えが見つかりそうだと
思えてきたので、もう少し頑張ってみようと思います。どうもありがとうございます。
- 504 :
- >>501
newするRepeatをGenericで作ればいいよ
whereで値型と参照型分けるようにして作ってそっち呼ぶようにすれば気にする必要もなくなる
インスタンス生成が多くなるようなプロジェクトではよく使う
ゲーム系なんかだと結構使われること多いんじゃないかな?
- 505 :
- >>501
LINQ の速度が許容できるなら、こんな感じでやろうぜ。
Enumerable.Range(0, 100)
.Select( i => new CertainClass { ... } )
.ToList();
for 文ダサい。
- 506 :
- LINQ覚えたてで使いたくてしょうがなくてイキって書いたコードに見えるわ
- 507 :
- Visual Studio2019で新プロジェクトを作ろうとしたらWindows Forms App(.NET Core)がさも推奨かのように上の方に出てきますが、
Windowsで使う想定のWinFormsアプリを作る場合も.NET Coreで作ったほうがいいんでしょうか?
- 508 :
- >>507
言わせんなよ
というMSの気持ちを察しろ
- 509 :
- ロードマップではこれからcore主流になるんでしょ
- 510 :
- CoreってWindowsに標準でインストールされてるの?
ユーザーに別途インストールさせるようなことない?
- 511 :
- されてないし今のところWUで配るような予定も無いとさ
逆にインストール不要なcoreのランタイムそのものを同梱して配布はできる
- 512 :
- >>506
手続型は可読性と保守性が低い。使うなら局所的に、隠蔽して使うのが吉。
どんな場合でも LINQ とは言わないが、データ変換が主な場面ではメソッドチェーンや遅延評価できる LINQ 推奨。
- 513 :
- ちょっと条件変わったときに途中で引っ掛けにくいよね
あ、ここ、フラグでcontinueいるわ
あ、i%10==0毎に処理いるわ
あ、i±Nまで見る必要あるわ
とか、for文のが圧倒的に拡張性が高い
- 514 :
- foreachがインデックスも定義できれば
もっと活用の幅が広がるのだけど
- 515 :
- インデックス付きSelect/Whereとかでええんちゃうの
- 516 :
- 別に i は LINQ でも出来るような気が。
- 517 :
- ループ内を雑に拡張して後で困るのが嫌だからLinqとLinq拡張ライブラリを使う
n件ごと、前後n件なんて頻出処理だしなおさらね
- 518 :
- >>515
そんなのあるの?
- 519 :
- >>501-502
Ruby でも、ブロック無しで、Array.new すると、同じ参照を使ってしまうが、
ブロックを渡せば、ブロック内で個々のインスタンスを作れる
p ary = Array.new( 2, [ 0, 0 ] ) #=> [[0, 0], [0, 0]]
ary[ 0 ][ 1 ] = 2
p ary #=> [[0, 2], [0, 2]]
ary_2 = Array.new( 2 ) { [ 0, 0 ] }
ary_2[ 0 ][ 1 ] = 2
p ary_2 #=> [[0, 2], [0, 0]]
- 520 :
- >>513
設計せずに書き出すダメプログラマー丸出しの発言だな。そうやってできるのは、いちおう動くけどバグが埋れてて、変数ダンプしながらフローを追わないと挙動がわからない可読性の低いコードになるんだよ。
君のいうことは、インデックス付き Select や GroupBy & SelectMany や TakeWhile なんかを組み合わせれば簡単にできるよ。
もともとは System.Linq の Enumerable.Repeat が参照型では Shallow Copy になるってことから始まったのだから Select 使って Deep Copy にすることでいいんでないの。
- 521 :
- >>520
敗北宣言長いな
- 522 :
- >>519
グロ
- 523 :
- >>521
根拠なく脳内勝利かよ。
- 524 :
- >>522
グロって書くと画像のサムネイルをモザイク化できるけど、 Ruby君の発言もモザイクにならないかな。見たくない。
- 525 :
- >>524
[Rr][Uu][Bb][Yy]でNGしとけ
- 526 :
- どこまで本気なのかネタなのかよくわからないけど個人的には>>505は選択しないなあ。
普通にforで回して埋めると思う。
理由は、そのコードを<読む時>に思考力の消費量がより少なくて済むと思うから
(a)
var list = Enumerable.Range(0, 100).Select(i => new Label()).ToList();
(b)
var list = new List<Label>(100);
for (int i = 0; i < list.Count; i++) list[i] = new Label();
一瞬で何やってるか理解できるのは(b)の方。
これは構造化(= パターン認識)の威力。
(a)も十分読みやすいけど、(b)に比べると若干高コスト。
(a)を好むのは多分巨大なコードを書いてメンテナンスしたことがない人だと思う。
- 527 :
- >>526
慣れだ慣れ
普段使ってる方がしっくり来るだけだ
- 528 :
- 普段から書いてりゃ慣れるしLinqの遅延評価が役立つ場面なら積極的にlinqの方を選択する
可読性なんてその人そのプロジェクトで変わる
難読可したコードとかまでいくなら気にするのはわかるけど、この程度の差ならどっちでも良い
他言語から入ってきた人ならlinqが馴染みやすいこともあるだろうし、Cからやってる人ならforが馴染みやすいかもしれない
ただそれだけ
- 529 :
- そのコレクションが固定長だったら、だけど
自分だったら
var array = new Label[100];
と配列で宣言したうえで>>526の(b)だな
listをわざわざforループで添字アクセスするのはちぐはぐだし
配列を明示的に使って固定長であることを明示的に表すべきだと考えるロートル人間なので
- 530 :
- >>526
aのほうが遥かに読みやすい
ある範囲に対してそれぞれ新規インスタンスを選択
してリストにした物
って言葉として読んだまま理解できる
- 531 :
- 突然
i=>new Label
は厳しい
「i」ってなんやねんってまず思う
- 532 :
- そのへんは _ にしちゃうなー
匿名の引数では言語仕様としての破棄パターンとみなされる文脈ではないけれど
- 533 :
- C#というかアルゴリズムの質問になっちゃうかもしれないんですけど
aというテキストファイルがあってそこにはb cという2つのファイル名が書いてある bを見るとdと書いてあって cにはファイル名書いてない
このときaを読み込んで最終的に手元にa b c dの4つのファイル名を取得したい。まぁList<string>に格納される感じでしょうか
再帰で書くんだろうなぁとは思いつくんですが、再帰が大の苦手でどういう終了条件でどういう戻り値の関数を作ればいいのか考えつきません
手助けいただけないでしょうか
- 534 :
- IEnumerable<string> ReadFilePaths(string filePath) { /* 再起なしでファイルパスをすべて読み取る */ }
IEnumerable<string> ReadFilePathsRecursive(string filePath) =>
ReadFilePaths(filePath)
.SelectMany(i => ReadFilePathsRecursive(i))
.Append(filePath)
;
はい
- 535 :
- >>510
ランタイム同梱でexeを配布できるから問題ない
- 536 :
- 不要な引数は_だね
破棄パターンはまだ言語仕様になってないけど要望も多いし議論も進んでるからそう遠くない未来には入るだろう
すでに導入されてる言語もあるし
俺個人的には526のbみたいなlistなのかarrayなのかよくわからん制御のほうが混乱する
- 537 :
- >>526
>(b)
>var list = new List<Label>(100);
>for (int i = 0; i < list.Count; i++) list[i] = new Label();
list.Countは0なのでループの中身は実行されない
一瞬で何やってるか理解できてる・・・?
- 538 :
- >>526
LINQ が万能ではないことは認める。使う人を選ぶ技術でもあるし。
だが、Enumeration の操作にいちいちカウンタ使って境界テストしなければならなかったり、if, break, continue でフローを追わなければならなかったりするのは、レビュアーや運用・保守者を泣かせるコードになることが多い。
モダンな言語がここ10年のあいだに参照透過性や関数型を追求する方向に進化しているのは、そういう可読性、保守性、開発効率性を意識しているから。
ちっちゃいコードなら手続型で好きなように書けばいいんだよ。大規模開発やビジネスロジックが重要な場面では関数型で書くのが適してる。
まあ、LINQ もあまりやりすぎると読みにくくなるのだが。
- 539 :
- >>533
aをrootノードとしたツリーとして対象をとらえれば
習ったことを生かせるんじゃないの?
- 540 :
- >>537
ほんとだ引数capacityじゃん
Linq使っててよかった
- 541 :
- >>537
ぐぬぬw
- 542 :
- 良いコントだったよ
- 543 :
- わろたwww
- 544 :
- MSのDocs(?)の日本語版ってマウスオーバーでオリジナルの英語版が読めなかったっけ?
対応してるページと対応してないページが混在してるのか?
Docsって何やねんw
- 545 :
- >>534
凄い……いや理解するのに10分以上かかったけど確かにこれで出来てる……
ありがとうございました勉強になりました
- 546 :
- おまえら天才か
- 547 :
- LINQは慣れると意図が読めるけど
forは何のためにループ回してるのかは解りづらくなりがち
数学的な問題や複雑な処理を書く場合LINQの表現力はすごいけど、慣れてない人が理解できるようになるのは大変
LINQやRxなしで同等のコード書くのはもはや考えられない
- 548 :
- プログラマなら普通は逆だよね?
linqというかSQLはただの集合論のはずなのになぜかforの代替で使われたりする
linqはループを隠ぺいしているだけで実際はループしてる
- 549 :
- Linqが本当に集合論を表してるなら途中でエラーがでてもデフォルトで残りの処理を終えるはず
そしてエラー含んだ集合が手元に残るはず
- 550 :
- >>547
> forは何のためにループ回してるのかは解りづらくなりがち
流石に
> for (int i = 0; i < list.Count; i++) list[i] = new Label();
の意図がわからないならプログラマーやめるべきだと思うわ
- 551 :
- やりたいことは何かを書いてそれを実現する具体的な方法をライブラリにお任せするのがLinq(宣言的)
やりたいことは何か全くわからないけどそれを実現する具体的な手続きだけは知りたくないことまで細かく書くのがループ(手続き的)
何をしたいのかわからないコードよりしたいことが書いてあるコードのほうが親切
- 552 :
- >>549
例外で全部ぶった切ってもいいじゃん
決め事の話だからどっちも筋は通ってる
- 553 :
- 基本LINQでいいかなってなる
List.ForEachは使わんが
- 554 :
- >>550
そらそうだな
こんなコード書いて仕事になるやつおらんやろ
>>551
そうそう それが言いたかった
- 555 :
- >>554
そりゃこんなコード「だけ」じゃ仕事にならんけど、仕事でその手のコードを書くことはあるだろ
- 556 :
- 大体の場合においてやりたいことだけをlinqで書けはしない
普通の処理をすべてLinqに置き換えられるならそれだけでいいが
そんな世界どこにもない
実現不可能な話でlinqがいいなんて現実的じゃない
- 557 :
- 標準で書けたところでそれって本当に効率的なのか疑問な場合がある
ループなら一回でmax min両方とれる
linqで標準で書いたとしてMAX MIN二回ループが回る
- 558 :
- 基準はシンプル
状態の更新を伴うものはループで書く
- 559 :
- プログラマがヘボでクエリとコマンドの分割がうまくできてないとLinqが綺麗に適用できないことがある
しかしLinqはクエリであることを忘れてはいけない
コマンドで汚染されたループをLinqでは書きにくいと主張するより先にリファクタリングすることをおすすめする
速度最適化が必要な場面はあるが常に速度最適化が求められるわけではない
速度よりメンテナンス性が重視されることの方が多い
- 560 :
- 本当に集合論ならループの順番などという概念がない
が実際にはある
MS自体はシーケンス(連続、並び)と言ってるが一部のオタが勝手にSQLと同じ集合論だと言ってるだけ
- 561 :
- どちらとも使えるのが正しい姿で必要に応じて使い分けるのが筋
所がlinq信者は全部lnqでいいforは使わなくていいと言う
- 562 :
- Linqでももともとやりたいことをそのまま表現できるパターンは少ない
それでどちらにしてもコードに落とし込みをする段階がある
処理に応じて手順を分解してコードにする
実際にそれをやるのがプログラムである
手順が分解できない、他人の書いた手順を理解する気がないならプログラムする気がないと言うこと
- 563 :
- 信者うんぬんの前に正しいスペル・大文字小文字でLINQと書けない人がテクニカルなことを主張しても説得力ががが
- 564 :
- 説得力などなくていいよ
酒飲んでごろ寝してスマホでかいてるんだから適当だよ
- 565 :
- ああこれwintabだわ
つかいにくなこれw
- 566 :
- >>534
これもイテレーター使った方が読みやすい気がする
IEnumerable<string> ReadFilePathsRecursive(string path)
{
yield return path;
foreach (var path2 in ReadFilePaths(path))
foreach (var path3 in ReadFilePathsRecursive(path2))
yield return path3;
}
}
- 567 :
- 循環する可能性を考慮しないのって普通にヤバイと思う
- 568 :
- 俺社環で{}省略していると糞扱いされるので迷わずLinq選ぶわ
- 569 :
- >>561
LINQ をまともに使っている人は LINQ の得手不得手を知っているから LINQ が万能だとは言っていない。
データ処理の多くの場面ではカウンタ使ってプリミティブに手続書くのは非効率だと言っているだけ。
逆に手続型信者 (老害ともいう) は不必要な場面でもカウンタ使ってイテレーションを書き、コードをいたずらに冗長化するねっていうこと。それに対する有効な反論がない。自分にとっては読みにくいっていう個人的感想ばかりじゃないか。
誰かが言ったとおりこれは慣れだよ。初めは確かにとっつきにくいが慣れる。そして戻れなくなる。
>>562
趣味グラマーならそれでいいよ。だが、ビッグデータやデータサイエンティストの時代になって業務ユーザもコード読むようになったこのご時世。
運用が止まって、下手くそなコード読んでトラブルシュートしなければならない身にもなってみて欲しい。センスない奴が書いたプリミティブな手続をダンプしながらフロー追っかけて修正し、リグレッションテストして、一定時間内に通常運用に戻すのは地獄。
無意味な宗教戦争にしないために、みなさんが前提や目的や利用場面をもう少し明確にすることを提案する。
下請けで隠蔽工程のコーディング担っているプログラマは LINQ のありがたみなんてわからなくても当然。レビュアーや PM や使う人のことを考えず、自分のスキルでとりあえず動くものを行数書いて月給もらえればいいんだから。
- 570 :
- LINQでDB通信タイミングコントロールできなくなって
泣きを見る話は聞いたが
- 571 :
- >>570
LINQ to Entities のことかな?
LINQ to Entities は残念ながらまだ発展途上だね。(もう 10 年にもなるのに。)
業務ロジックも書けなくはないが、.NET プラットホームや DB 実装などへの依存性が強すぎて、かなり工夫する必要があり、汎用性がなくなってしまう。
Select, Where (, OrderBy, Take, FirstOrDefault, Join)くらいしかまともに使えないと思っていた方が無難だと思う。となると DB アクセス回数と無駄なデータ取得が増えることになり、性能が出ない。
また C# 9 あたりで予定されている Records がないとデータ変換ロジックが非常に書きにくい。
.NET 5 になれば期待できるのではないかと思うけど。
- 572 :
- >>557
おっしゃる通り、LINQ は Reduce 系処理の効率性がよくない。そこは工夫する必要あり。
ただ、Aggregate を使えば、一回の走査で Max, Min 両方同時に取れると思うよ。
- 573 :
- >>550
やめた方がいいよ
- 574 :
- いいからアプリ作れよ初心者
- 575 :
- 標準のLINQでは効率的に処理できないなら
効率的に処理できる拡張メソッドを定義してそれを使うべき
流れの中でforやらforeachを使われると可読性が落ちるしテストもしにくくなる
- 576 :
- そういうオナニーされるとそれこそ読みづらい
フレームワーク作ってるんでない限り、チーム開発で拡張メソッドを自作するのは本当にやめてくれ
- 577 :
- 開発組織のコード管理能力やチームメンバーのリテラシーに合わせて判断することだとは思うが
拡張メソッド作れないって縛りプレイはできれば勘弁して欲しいな
- 578 :
- 拡張メソッド無しはさすがにしんどい
そら上位のnamespaceにstringやらintのextension大量に作るとかやられるのは勘弁してほしいがちゃんと整理されてるなら問題ないじゃん
- 579 :
- 拡張メソッドを使わないというオナニーではないのだろうか。
- 580 :
- Linqの構文を本家のSQLに逆輸入すれば良いのに
- 581 :
- そういや、Max、Min句が対象とした個別要素を返すってのは酷い気がするな
IEnumerable<T>に対して使った時にT型で返すように何故しなかったのか全く理解できん
- 582 :
- 多少非効率でもなるべくもともと用意されてる機能や関数を使うのが分かりやすい派です
- 583 :
- MoreLINQ使えばMinBy/MaxByがある
(複数返すからTじゃなくIEnumerable<T>的なのが返される)
リスト埋めるやつもMoreLINQ使えば比較的読みやすい
var labels = new List<Label>().Pad(10, _ => new Label());
- 584 :
- >>581
そりゃ欲しいのは最大値や最小値なのに複数の要素が返ってきても面倒なだけだし
- 585 :
- >>584
ま、その通りなんだけど、581 が言いたかったのは、該当要素 T を返す拡張があってもいいよね、インデックス付き Select とかあるんだからさ、ってことでは?
>>583
有益な情報ありがとう。
- 586 :
- >>585
そういう拡張があってもいいなと言うならわかるが
> Max、Min句が対象とした個別要素を返すってのは酷い気がするな
と言うのは思慮が浅すぎ
- 587 :
- generics, trait だろ。
has-a, interface, duck typing など、継承じゃなくて包含
Ruby では、<=> 宇宙船演算子があれば比較できる。Comparable
- 588 :
- どうかな
個人的にはどちらか一つだけしか選べないとしたら>>581の実装の方が合理的だと思うけど
単純にそっちの方が需要多いと思うし、二度手間にはなるが現状の実装は
>>581的実装で代替できる(変換結果の最大値は変換関数から求められる)のに対して
逆はどうやっても不可能だから
- 589 :
- >>588
上位互換の方がいいっていうのはわかる。でもそれは LINQ to Object だけを考えた場合ね。
LINQ は LINQ to Entities という OR マッパーも強く意識しているから、標準 SQL 互換の機能も大事であり、どちらか一つという選択を強いるなら現状になる。
- 590 :
- 別に難しいもんじゃないんだし作りゃいいんだよ
どういうのがベストかが状況によってたやすく変化する処理だと思う
値が欲しいのか要素が欲しいのか、一つで良いのか全部列挙するのか
だから標準としては1回走査で済んでsum等の算術系と同じような入出力になる現仕様を選んだんじゃない?
- 591 :
- なんかよくわからないけど、SQLとの互換性ならTが返ってきた方が遥かにSQLに近いでしょ
- 592 :
- ??SQLで集計関数使ったら元のレコードはわからんめえ
- 593 :
- >>591
わからないなら無理に噛み付かなくていいから。
LINQ to Entities の設計思想と実際の実装がどうなってるのかある程度理解できるようになってから出直して。
- 594 :
- Tを返すと戻り値がIEnumerable<T>になる
流石にそれをMax関数と呼ぶのは抵抗がある
- 595 :
- まず最大値を取る
その値を持つ要素の集合をselectする
確かに無駄だな
SQLはどこかで最適化してるのかな?
- 596 :
- MAXはMAXだけどそういう用途の関数?があってもいいかもね
というかすでにあるんだろうか?
- 597 :
- >>596
標準ではない
使ったこと無いけど583が紹介してるものか自作するか
自作しても数行だしググればコードは転がってるよ
個人的にはこういうやつは上げだすとキリがないんで現状で十分かなと思ってる
標準で山ほど用意されても何があって何を自作しなきゃならんかがわからなくなるんで本当に基本的なものだけあればいいかなと思う
- 598 :
- LINQじゃなかったら作るのは簡単
- 599 :
- SQLで書けるものはだいたい書けるようなってないと使いづらいよやっぱ
- 600 :
- SQLだとストアドあるけど、LINQで書けるの?
インラインビューとかも
- 601 :
- それは流石にLinqのせいじゃなく、例の変な人が言ってるフレームワーク等で吸収する部分じゃないか?
- 602 :
- >>595
SQLの場合はインデックスがあるから一般的にO(log n)で最大値のキーが取得できる
LINQ標準でMaxByと同じことをやる場合はちょっと効率悪いけどOrderBy使う
O(n)にするためだけにAggregate使った拡張メソッド作るよりも
走査する件数を減らすことを考えたほうがよかったりする
- 603 :
- LinqとSqlは根本的に別物なので使い分けろ
当たり前のことだな
- 604 :
- >>600
DDLもLINQで書けるようにしろとか言いそうな勢いだなw
- 605 :
- 出来ればやってくる欲しいけどw
- 606 :
- >>602
LINQ to Object vs LINQ to Entities でインデックスの有無は大きいよね。テーブルごとに特性とサイズを考えて、AsEnumerable でやるか AsQueryable でやるか機能配置の決め手になることがある。
OrderBy 使っていいなら、こんな感じかな?
public static IEnumerable<T> MaxBy<T>(this IEnumerable<T> src, Func<T, IComparable> selector) =>
src.GroupBy( selector ).OrderByDescending( x => x.Key ).Take(1).SelectMany( x => x );
>>600, 601
ストアドは DB の機能だから、フレームワークでは実現できないよ。
フレームワーク側でエミュレートできたとしても DB との間で通信が頻繁に発生することになるから、性能が出ないと思われる。
DB のストアドを呼ぶことはできるはず。
- 607 :
- >>604,605
つEFのCodeFirst
- 608 :
- >>607
LINQじゃねーしw
- 609 :
- >>608
横からすまん。
Code First で DDL 相当のことが「かなり便利に」できるわけだが、DDL やるのに LINQ でなければならない理由を教えてほしい。
- 610 :
- >>609
初めからLINQの話してて、何がベストかなんて話してない
- 611 :
- LINQって便利なんだけど今一歩物足りないよな
何が足りないのかと言われても難しいが
- 612 :
- 十分もの足りるよ
- 613 :
- 前処理はストアドで定義してアプリはストアド叩くのが定石やろ
- 614 :
- LANが10Mだったころの定石だな
- 615 :
- 今は前処理クライアントでやるもんなん?
- 616 :
- >>610
LINQ にこだわるなら、こだわるだけの理由が必要。
スレに貢献している人を茶化すなら、茶化すだけの知識なり、思想なり、技術的裏付けが必要。
>>611,612
どちらの意見もわかる。
LINQ to Object に閉じるなら十分。足りない部分はライブラリ自作すればいいし、そのパズルが楽しかったりする。
でも、LINQ to Entities に踏み込むと足りないことだらけ。本質的ではないところで相当な工夫が必要だし、工夫しすぎると汎用性がなくなって使い物にならなくなる。
LINQ to Object で組み始めたロジックを LINQ to Entities 互換に拡張することを考えている時間が結局ムダになることも多い。
両者、似ているようでギャップがかなり大きいところに物足りなさを感じる。
- 617 :
- 最初から全くの別物なのに似ているというだけで変な期待をかけて勝手に裏切られた気持ちになる人が少なからず居る
別物と割り切って名前もインターフェースも変えれば初学者が迷わずに済んだだろうな
- 618 :
- >>617
そうだね。裏切られたとは思わないけど、当初の期待はかなり高かった。
でも、LINQ to Entities の情報が少なすぎて別物だって理解するまでに相当な時間がかかってしまう。
誰も頼れる人がいない中、ネット情報のみの独学でみっちり3週間かかったよ、まともに使えるようになるまでに。
- 619 :
- EntityFrameworkなのかEntityFramework Coreなのかはっきりさせとけよ…
- 620 :
- >>619
わからなかったからどちらも試したよ。
Framework のバージョンによって作法が大きく異なるのに、ネットはバージョンを示さず情報が混在しているのも混乱する大きな要因だった。
- 621 :
- あ、ID 変わっちゃった。
618=620
- 622 :
- >>620
一次リソース見なよ
- 623 :
- >>622
当然見てるよ。原文で。
- 624 :
- まともに使えないものがまともに使えるようになったと言ってる時点でまともな人間でないのは明白
- 625 :
- >>623
なら混乱しないはず
- 626 :
- >>624
君は読解力ないのかな?
局面によっては使えるかもしれないけど、業務ロジックを完結させるには役者不足、LINQ to Entities はまだまだ発展途上だね、今後に期待、と一貫して言っているのだが。
一次ソースも二次ソースも充実してないのは発展途上でこれからもまだまだ移りゆくものだからだとも思ってる。それがわかるのにけっこうコストがかかったよ、そのあたりが個人的に物足りなさを感じるところかな。
- 627 :
- あぁなるほど
データアクセスに業務ロジックをバリバリ書いてしまうタイプの人か
- 628 :
- >>625
一次ソースはバージョンに関しては混乱しない。それは二次ソースの話。一次ソースが混乱させるのは、LINQ to Object から Entities へ移行するにあたって、重要かつ基礎的なコンセプトをまともに解説していないこと。
たとえば、IEnumerable の派生である IQueryable はアップキャストするだけで AsEnumerable で評価されてしまうとか、引数となるラムダ式が全く同じ記法なのに IEnumerable では Func で IQueryable では Expression だとか。
これらは分かってしまえば当たり前だし、うまく設計したものだなと感心するけれど、初学者にはトラップでしかない。
君はこれら暗黙の前提を一次ソースで知ったのか?
だとしたらどこにガイドがあるか教えてほしい。
一次ソースに当たれというのは一般的なお約束だけれども、LINQ to Entities に関しては、コンセプトや実装の難しさに比して一次ソースがかなり脆弱で不親切だと思うよ。
617 の言うとおり Object と Entities でインターフェースを変えて設計するか、あるいは、移行に十分な情報を一次ソースが用意するか、どちらかだと思う。そのどちらでもないことがアンチを生んでいる原因ではないかと。
- 629 :
- >>627
もちろんレイヤー化はするし、機能配置はしっかり設計するよ。
ユーザーはコード見なくていいって時代じゃないんでね。
- 630 :
- 真っ赤なガイジ一歩手前
- 631 :
- ごめんガイジに触っちゃっま
- 632 :
- >>630,631
業務ユーザが LINQ to Entities に手を突っ込むの、ガイジだよなぁ、わかるぞ。
だがね、人のやらないことを先鞭をつけてやらねばならない場合もあるのだよ。
ひととおり技術評価した結果、本格的に導入するのは時期尚早という判断で別の技術つかうことにした。.NET 5 以降に期待してる。
- 633 :
- え、業務アプリで普通にLINQ to Entities使ってるけどなんかマズい問題でもあるの?
単純に手軽で使いやすいと思ったから使ってるんだけど・・・・
- 634 :
- >>633
問題ない。Dapper開発元のStackOverflowでさえEntityFramework Coreを併用してる。
- 635 :
- LINQのmaxやminで最大最小が求められるけど
最大、最小の値を持つオブジェクトを取得する方法はないのかな?
- 636 :
- MaxBy、MinByでググれ
- 637 :
- 散々上で話題に出てたやんw
- 638 :
- >>635
new {
Max = src.Max(),
Min = src.Min()
}
- 639 :
- >>628
それらを区別することがはたしてLINQの目指すべき理想なのかね
- 640 :
- >>639
それらってどれのことだろう?
LINQ to Object と Entities のことかな?
両者の設計はよく考えられたシームレスで美しいデザインだと個人的には思うよ、違いをしっかり理解できた後ならね。違いが分かりにくいというのは言語設計の問題ではなく、MS Docs などガイドの問題だと思う。
何が理想的な設計かは人によって感じ方が違うのではないかな。
あ、EF4, 5, 6, Core と進化する間に名前空間や正規関数などがコロコロ変わっているあたりは、場当たり的で汚いと思う。何か制約があって実装をやり直した、その苦労の跡が垣間見える。Core から後方互換を捨てて綺麗に作り直そう感があるから、.NET 5 に期待している。
- 641 :
- ごめんちょっと話が横に反れちゃうけど、このスレ見たり書き込んだりしてる人って
MicrosoftDocsって日本語/英語どっちを見てるの?
当たり前のように原文ですらすらと読んで理解してるものなの?
MSDNが廃止されてDocsになったはいいけど特にAPIリファレンスとか日本語訳の品質が酷すぎて辛い
自分は英語ほとんど読めないんで、Chromeで日本語版、FireFoxで英語版+Google翻訳をそれぞれ表示して
3タブ切り替えながら読み進めてくなんて効率の悪いことをやってるんだけど、みんなはどうしてるのか気になった
MSの一次ソースに当たるのも↑の理由でしんどいんだよね・・・
もう潤沢な日本語訳が提供されるような時代じゃなくなったんで英語のできないPGは退場せざるをえないのか
- 642 :
- docsは辞書的に使うことがほとんどだしそれぐらいなら英語で十分
- 643 :
- >>641
もちろん英語
- 644 :
- >>641
調べる目的によるかな。
引数の順番とかオーバーロードとかうろ覚えの確認程度なら、検索して最初に出てきた方。
初出のロジックを書くためにコンセプトや基礎設計からじっくり考えつつ API を調査するなら、まず日本語でざっくり理解、重要なポイントが和訳で怪しいなら英語で精緻化。
LINQ なんかは集合論や数学に近く、これらは概念が同じなら分野跨いで英単語が同一だったりして英語の方が理解が早いから英語のみ、とか。
LINQ to Entities の場合、一次二次併せてそもそもの情報量が少ないから、英語日本語関係なくとにかく漁る。(そして英語の Q&A でほのめかされているヒントに辿り着き、一次ソース原文を当たったりする。)
- 645 :
- 俺も英語は苦手だけどdocsは基本英語
どういうメソッドあったっけ?で見ることが多いから多少の単語がわかればほぼ理解できる
動作が知りたいときでよくわからん英語の言い回しがあったときは日本語にして読んでみる
けど、そういうときは日本語にしても大抵理解できない
デフォを英語にするようにしとけばプログラムで頻出する英単語が徐々に覚えられるようになるから英語をオススメする
- 646 :
- >>641
日本語が読めたもんじゃないから英語に切り替えることが多い
機械翻訳かける時は、最近のグーグル翻訳は使い物にならないから、みらい翻訳のお試し翻訳使ってる
- 647 :
- ありがと、自分もdocs英語派に転向するよう頑張ってみる
比較的翻訳が整ってる基礎説明みたいなページでもいちいち
「角度」⇒「Angular.js」、「反応」⇒「React.js」みたいな脳内逆翻訳をかますよりは
苦手でも最初っから英語版を読み解くほうがやっぱりマシなんだよな・・・
自分はFirefoxのアドオンで
・Simple Translate (右クリックでGoogle翻訳結果をポップアップ表示)
・MouseDictionary (マウスを乗せた英単語の日本語意味をリアルタイム表示)
を入れてる
みらい翻訳はいちいち英文をCopy&Pasteするのが面倒で常用断念
- 648 :
- とりあえず日本語でぱっと見て意味が取れるならそれで良し
んん?ってなったときに原文に当たる
これが一番効率良いと思うよ
- 649 :
- >>648
意味が取れたと思って試してみたら挙動がおかしくて、原文見たら真反対の意味でショック受けた記憶がある。
- 650 :
- アホやなあ
- 651 :
- まあジャパニーズITドカタの世界じゃ専門卒の英語アレルギーな連中に扱えないようなものが普及することは決してないから、
業界から脱出するつもりがないんなら英語はハナから捨てたほうが賢明だよ
だって業務では永遠に使えないんだから
- 652 :
- どこの底辺業界の業務だよ
- 653 :
- いや英語棄てるとか絶対無理。
日本語訳がアテにならないのが分かってから原文しか読んでない。
- 654 :
- 自分は英語が苦手
でもMSの自動翻訳はイマイチなのでgoogle翻訳の自動翻訳を使う
それでもよく分からない時はgoogle 翻訳のサイトにコピペして翻訳する
- 655 :
- >>654
コピペする労力を惜しまないなら
みらい翻訳の方がましな日本語になるからお勧め
- 656 :
- 翻訳ソフトを多用するから英語読む力が身につかないんやで
まともな辞書を使って単語帳をつけて定期的に復習するのが大事
翻訳ソフトは最後の手段
マウスオーバーで引ける辞書も便利だけど
便利すぎて辞書ナシで文やパラグラフを読む努力をしなくなると英語力は向上しない
- 657 :
- 英語力向上が目的じゃないから。
あくまで目的は正しい情報を入手すること。
もう数年後にはかなりの精度の自動翻訳ができるようになってると予想する。
- 658 :
- 翻訳精度の向上ってもう10年以上言われ続けてるよねw
こないだgoogleだかどっかが文脈を考慮した翻訳どうのこうのってリリース出してたけどどこまで伸びるかねぇ
- 659 :
- >>656
目的をはき違えてる
- 660 :
- 既に英語-日本語は十分な翻訳精度になってない?
MSDNのようなオフィシャルな場はもうほぼ完璧だし、そこら辺の外人フォーラムなんかでも一応意は汲める
中学英語程度の基礎があれば読みに関してはもう不自由しない
- 661 :
- >>657
超短期的な目的でしょそれ
翻訳ソフト使わないと読めないままで良いと思ってるんなら別にいいんだけどさ
技術的な調査能力だったり新しい技術を身につける速度に顕著に差が出るよ
- 662 :
- 現状で完璧なんて口が裂けても言えないと思うけど…
msdnみたいな同じ言い回しが頻出するようなところは個別の対応もしやすいし、そもそも単調な事実だけを述べるだけの文章なんで誤訳は少ない
そんな環境でも真逆の意味に訳されてしまっているケースすら存在する
こないだdoとdo notが逆に翻訳されててちょっと燃えたよね
補助として使う分には十分なレベルではあると思うが翻訳能力自体はまだまだ伸びて欲しいと思うよ
- 663 :
- >>661
俺たちは英語のマスターが目的じゃないの
しつこいよ
- 664 :
- まともな大学出てるエンジニアなら英語さえ話せれば外資に転職して軽く一千万以上貰える
必死こいてEFCoreとか覚えるより本気で英語を勉強した方が遥かに効率的だぞ
- 665 :
- 時々機械翻訳が真逆の時あったけどどこをどう解釈したのか痕跡も判らない
- 666 :
- 質問です
ジェネリッククラスにおいて型Tがクラスのときとstructのときで全く挙動を変えたいのですが、
同名の2つのジェネリッククラスに異なる型制約をつけることは可能でしょうか
- 667 :
- できないんじゃないかな
別のクラス名にして
インターフェースを被せてやるんじゃダメなの?
- 668 :
- ん?where T classでの制約の話じゃないの?
- 669 :
- >>667
ありがとうございます 試してみます
- 670 :
- >>664
EFCore使うのに必死になる必要なんてない
- 671 :
- >>668
class A<T> where T class と
class A<T> where T struct とを同時に作れないか、という疑問でした
- 672 :
- こんばんは
質問させてください
LINQのGroupByでデータテーブルの複数のカラムを指定しvar変数に格納後、
格納したデータをCopyToDataTableメソッドでデータテーブルに変換しようとしても、
CopyToメソッドしか候補に表示されないのですがVisual Studioのバグですか?
- 673 :
- フォームアプリ作っていてデバッグ中です。
フォームのクラスから呼び出したクラスにブレークポイントを設定しているのですが、
止まってくれません。
フォームのクラス上に設定したブレークポイントでは止まってくれます。
これって仕様なのでしょうか?
- 674 :
- なんかプロジェクト内でブレークポイントで止まるクラスと止まらないクラスがある。
前はどこに設定しても止まっていたのに・・・。
一体何が原因なんでしょうか?
- 675 :
- ブレークポイントを通ってないから止まらないだけだろう
- 676 :
- >>674
設定のチェックを外したらOKになりました。
自己解決しました。
おさがわせしてすいません。
- 677 :
- >>672
変数名の上にマウス持ってったら型が表示される
その型は想定しているものになっていますか?
- 678 :
- >>672
変数の型を確認すべし
- 679 :
- やべ、超かぶった
- 680 :
- >>672
IGroupingはキーを列挙するものだよ?
キーは通常DataRowじゃないからそりゃ出ないよ
グループごとにChildrenをDataTableにしたいのか、Childrenをキー順に並んだ1つのDataTableにしたいのかによって書き方は変わる
- 681 :
- >>663
マスターww
辞書使う前にとにかく翻訳ソフト使うやつは
リファレンス見ずにQiita見てコピペしようとするやつと同じ思考回路なんだよね
いつまでもスキルが身につかない原因を自分が作り出してることに気が付かないとすぐに淘汰されるよ
- 682 :
- >>677-678>>680
助言をいただきありがとうございます!
もう一度よく確認してみます
- 683 :
- 前にも居たけどなんですぐにVSのバグを疑うんだろうね?
- 684 :
- まあ最近のVSの最新版はガチでバグだらけだけどな
- 685 :
- 複数のスレッドから1つのコンソールにLOGを吐きつづけられますか?
Parallel.Forで
- 686 :
- できるよ
- 687 :
- >>686
Invokeとかlockとかしなくても大丈夫ですか?
- 688 :
- >>685
コンソールに出力するためのスレッド作ってそこにみんな投げればいいがParallel.Forの意味がわからん
- 689 :
- 昔はよく非同期処理の理解のためにコンソールに出力したんだけど今は市内の?
- 690 :
- >>685
https://docs.microsoft.com/en-us/dotnet/api/system.console の一番下に
「Thread Safety This type is thread safe.」と保証されているので複数スレッドから吐いても全く問題ない
- 691 :
- 複数あるスレッドが分割して1行の文字列を作ってると間に別スレッドの文字列が割り込むけどな。
- 692 :
- >>671
実験してないんで動かなかったらごめんなんだけど
default(T) == null
ならclassとして処理する
で実現できたりしないかな
nullableだったら無理だけど
- 693 :
- WPFだとスレッドからLabel.Textや
Textbox.Text、CheckBox.Checkedにアクセスできるもの?
できなければできるように拡張したりできないものかな
- 694 :
- >>692
クラスではなくメソッドについて struct/class 制約の共通化をやろうとした経験から言うと ...
Nullable 含めて内部判定することはできるけど、判定・分岐があちこちに発生することになり、かなりめんどくさいし、読みにくくなる。
だったらクラス分けて、誰かが言った通り interface (か abstract base class) で共通化図る方が楽と思われる。
- 695 :
- >>693
無⭐︎理
- 696 :
- >>671
やりたいことの意図を誤解してるかもしれんけど、
static class A
{
public static A<T> OfStruct<T>() where T : struct
{
....
}
public static A<T> OfClass<T>() where T : class
{
....
}
}
class A<T>
{
}
こんなのとか...
っていうか、ジェネリッククラスのスタティックメソッドってTを使ってなくてもいちいち型パラメータ
指定しないと呼び出せないのかw
- 697 :
- >>693
WPFだと一般的にはMVVM使う
で、MVVMなら直接ViewにアクセスしないでVM経由になる
VMの値はスレッド越しに取得設定できる
コレクションの操作については事前に同期オブジェクト渡すとかする必要があるけど
- 698 :
- こっちの方がマシか
class A<T>
{
protected A() { }
}
class AOfStruct<T>:A<T> where T:struct
{
}
class AOfClass<T>:A<T> where T:class
{
}
- 699 :
- 型制約は正直あんまり役に立たない微妙な機能な気がしている
- 700 :
- ジェネリックなメンバアクセスには、最近は構造的部分型を使うのが流行りだね
構造的部分型ベースの型システムを持つTypeScriptやGoでは利用する側でアドホックにinterfaceを定義できるから、
利用シーンを先読みして型階層を設計するという人間には困難な芸当なしで柔軟に型制約のようなことができる
- 701 :
- >>700
よくわからん
コードで例えてくれ
- 702 :
- 質問させてください
ASP.NET
C#
SQL Server
を使用しています
SQLにByte型で保存したバイナリデータが保存されています
そのバイナリデータをASP.NET側でLISTで受け取り、フォルダに保存したいです
LISTで受け取った後にフォルダに保存するところの書き方を教えてください
よろしくお願いします
- 703 :
- BinaryWriterを使えばいい
- 704 :
- LISTというのが何なのかは知らんが
配列で読み取ってFile.WriteAllBytesだけでよくね 何百MBとかならアレだが
- 705 :
- 普通にストリーミングで吐いた方が安パイ
- 706 :
- 保存ってのはクライアント側なのかサーバ側なのか
- 707 :
- >>702
みんなLISTが疑問符だ
そこちょぅと詳しく
- 708 :
- static int UnitStep1(int x) => x >= 0 ? 1 : 0;
static int UnitStep2(int x) => (x >> 31) + 1;
上のような2つの関数を最適化ありでコンパイルして
ランダムな100万個の値に対して実行すると、
@どちらも同じ値が返ってくる
AUnitStep1の方がUnitStep2よりも10倍近く時間がかかる
という実験結果が得られました。
@とAの理由を考察しないといけないのですが、
@は分かったものの、Aがさっぱり分かりません。
というか、どう考えてもUnitStep2の方が
無駄な処理をしているように思えます。
分かる方がいたら教えていただけないでしょうか?
よろしくお願いします。
- 709 :
- 三項演算子で比較するよりビットシフトのほうが圧倒的に早いから
cpuが得意とする処理と人間が理解しやすい処理は一致しない
どうしても納得行かないならILを見て各ステップでどういう命令がされるか確認するしか無いかな?
- 710 :
- >>709
ありがとうございます。とりあえずILについて調べて、
下のようなページを表示させるところまで行き着きました。
https://sharplab.io/#v2:C4LglgNgPgAgzAAhgJgQYQQbwLACgEFICMAbAmAHbAICqFYwAysAKYAORAFJdQB4CUCALwA+BLwQihCAAwIA/AiIIQsgNx5CxMj1r0mrNsm5Vxg0Qk4SRYuEUEBqJWoR4AvkA===
これから書いてある内容の理解に挑戦してみようと思います。
- 711 :
- そのILをぱっと見る限り、実行されるアセンブラまで調べに行く必要あるのかも
命令数は変わらんし
そこまで行ったらもう環境依存な気もする
てか最適化ありなら最適化されたIL見ないとだめかな
- 712 :
- >>708
大昔にアセンブリやっていた経験からの推測だけど...
@の >= は左辺引く右辺の減算をして符号判定をしており、右辺の 0 を引くという演算が最適化ありでも外れず無駄な演算をしている可能性がまず一つ。でもこれはAに対して圧倒的に不利になる要素ではない。
もう一つのよりありそうな可能性は、三項演算子がコンパイルで if ステートメントになり、分岐先ブロックでパイプライン先読み実行していたステップが、分岐先読みの失敗により、ロールバックするコストが高くついているのではないかと。
確率 50% の分岐なら、2回に1回はロールバックすることになるため、コストが最悪になる。if else ブロックのどちらが実現確率が高いか、コンパイラが判断・制御できていない。
それに対してAはパイプライン処理を乱す要素がない。
どう中間コンパイルされ、どう IL が動くのか、最近の低レイヤーの処理は全く知らないため、見当外れかもしれないが。
- 713 :
- 条件分岐は遅い
一方ビットシフトと加減はCPUが最も得意な処理
そのレベルのことを考慮するような処理にC#はあまり向いてないと思うが
- 714 :
- パイプライン処理の詳細は Wiki で調べて、命令パイプライン、パイプラインハザード、制御ハザードの節あたりを参照しておくれ。
条件分岐がなぜ遅いかわかる。確率考えてアセンブリレベルで制御しないと速くならないよ。
- 715 :
- あ、ごめん。よく読んだらランダムな値に対してって書いてあった。確率 50% の先読み最悪ケースになるね。アセンブリレベルでも最適化は無理。
- 716 :
- >>711
ありがとうございます。
アセンブラというのはSharpLabのページの
ResultsをJIT Asmにしたときに表示されるものと考えて正しいですか?
IL命令について色々と調べていたのですが、
JIT Asmのほうが書いてあることが少ないので先にこちらに挑戦してみようと思います。
あと最適化されたILというのは、ResultsをILにして、
一番右上の選択肢をReleaseにしたときに表示されるものと考えて正しいですか?
>>712
ありがとうございます。UnitStep?(int x)のxはプラスとマイナスが50%ずつになるように
ランダムに決めているので、確かに分岐の確率は50%です。
まだパイプラインについて完全に理解できていないので見当外れかもしれませんが、
試しにプラスとマイナスの割合を変えてどうなるかについても検証してみようと思います。
>>713
>>714
ありがとうございます。やはりハードウェアについてしっかりと理解しないといけないのですね。
ひとまず、>>714に書いていただいたキーワードについて調べてみたいと思います。
- 717 :
- もしパイプライン処理がビンゴだったら IL 見ててもわからないよ。
CPU の fetch, decode, exec という内部処理の流れを理解しないと。
質問の書きぶりから大学かなんかの課題に見えるんだけど、高級言語ばかり見ていて低レイヤーのこと知らないとハマることあるかもよって警告するためのお題なのかもね。
- 718 :
- C#で考えるべき速度は計算量まで
メモリレベルの最適化を考えるならCで書くべきだし
CPUレベルでの最適化がしたいならアセンブラを覚えるべき
- 719 :
- 分岐先読み失敗って言ったって
x >= 0 ? 1 : 0
さすがにこんなのゼロコストじゃないの?
単純に機械語レベルの命令数の差を反映しているだけのような気が
知らんけど
- 720 :
- >>718
いいインサイトですね。勉強になります。
>>716
もし true ? 1 : 0 の速さがAにかなり近くなって false ? 1 : 0 の速さが@よりさらに悪くなる、(あるいはその逆) ならパイプライン処理が原因だと考えて間違いないと思う。
- 721 :
- >>719
機械語レベルの命令数に差があるように見える?
@Aどちらも 2, 3 ステップだよ。
先読み失敗リカバリーはものすごくコスト高いよ。
パイプライン上の仕掛かりを全部クリアしなければならないんだから。その 2, 3 ステップの 1.5 〜 3 倍くらいのクロックサイクルを無駄にすると思う。
- 722 :
- >>719
ごめん、言い過ぎた。
IL わからんから、中間コンパイル通したらなんとも言えない。機械語の命令数が膨らむ可能性もありうる。
721 はネイティブコンパイルしたら、という仮定の話。
- 723 :
- 不勉強で今時のCPUのアーキテクチャーさっぱり分からんが、
ググってみると、投機的実行は予測が当たれば儲け、はずれても損なしだからこそ意味があると書いてある
コインの裏が出たら損をするなら意味がないと思うんだけど
- 724 :
- >>715
>>720
ありがとうございます。
xのプラスとマイナスの割合を変えて実験してみたところ、
UnitStep2では処理時間はほとんど変わりませんでしたが、
UnitStep1では、50:50のときが一番遅くてUnitStep2の10倍程度、
75:20と25:75はどちらも少し速くなってUnitStep2の6倍程度、
100:0と0:100はどちらもさらに速くなってUnitStep2の2倍程度になりました。
やっぱりパイプライン処理が原因っぽいですよね?
>>717
ありがとうございます。勉強になります。
高級言語では計算量までしか考える価値がなくて、
しかし計算量さえ小さければあとはマシンパワーでなんとでもなる。
だからこそ高級言語が今の時代に合っているということでしょうか。
>>719
ありがとうございます。
機械語レベルの命令=JIT Asmの命令だとすれば、
UnitStep1とUnitStep2では6命令と4命令で確かに差はあるものの、
単純計算なら10倍もの違いはないようです。
- 725 :
- >>723
それ出典教えてもらえる?
外れても損なし、だったらいいなっていう理想を言っているのではないのかな。
ランダムデータには弱いけど、正常系と異常系の分岐はたいてい正常系の発生確率が高いためこちらに賭けるのよ。で、ロジックの多くはこの手の分岐でしょ、っていうことを想定して先読みのアーキテクチャになっている。
ということをその文献も (独特の表現で) 言いたいのではないかと思うのだが。
もれも最近の CPU がわかっているわけではない。80286 〜 386 時代でアップデート止まってる。
- 726 :
- >>720
>>724の75:20というのは間違いで、正しくは75:25でした。失礼しました。
ところで、ランダムに50:50ではなくプラスとマイナスを交互にしたら
もっと遅くなるかと思いきや、むしろ75:25よりも少し早いくらいになりました。
(ランダムの場合も交互の場合もあらかじめ入力データを配列に格納してから
計測を開始しているので、入力データの作成コストは結果に影響していないはずです)
どんな仕組みで先読みをしてるのかさっぱり分かりませんが、
とにかく予測ができないのが遅くなる一番の原因のようです。
- 727 :
- >>724
そうですね、データ依存なんでパイプラインと先読みが原因だと個人的には思います。
そういえば思い出しましたが、if else ブロックの片方に固定的に賭けると必要以上に大負けすることがあるため、条件分岐を何度か通ったところで学習し、勝てる見込みのより高い方へ賭けるアーキ設計だったような気がします。
true : false = 100 : 0 or 0 : 100 に片方が大負けせず、同じ性能になったのはこの学習効果ではないかと。
モダン言語の進化の方向の一つに高級化があるのは、仰るとおり。低レイヤーの最適化はコンパイラと進化したハードウェアに任せ、コードは人間にわかりやすくして開発生産性を高めようということです。
もう一つの進化方向は Rust とか Go とか、低レイヤー向け言語を C++ よりわかりやすく、より安全にしようというものだと思います。
- 728 :
- >>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ステップの方が
低コストなのは当たり前の話でした
- 729 :
- >>728
ありがとう。
この説明は失敗時のリカバリーがノーコストでできる環境を前提にしていると思う。
投機的実行をした面とは別の面を持っていて、そちらにすぐスイッチしてロジックを実行しつつ、その裏で失敗した面を同時並行で捨てられるような感じ。それが一般的かどうかはわからない。
複数面を持たず、失敗ステータスを捨てて (= クリアして)、その後に分岐別側のロジックを走らせるというようにシーケンシャルにリカバリーするのが一般的なのではないかなと思ったんだけどね。
最近のは複数面持ってるのかもしれない。ただ、複数面持っていると分岐ない時にリソースが遊んで無駄だからねぇ、分岐なくても普段からその面で並列演算すればいいって話になるよね。
- 730 :
- スレタイの初心者用とはいったいw
初めに回答したのが的外れとまでは行かなくてホッとしてるw
- 731 :
- こいつらウンチクごちゃごちゃ長くても作るもん電卓だから
- 732 :
- >>730
全てわかっている人なんていないのだし、それぞれ知っていることを持ち寄って可能性をいろいろ検討してみるのが健全なやりとりなんだと思いますよ。
IL をうんぬんは知らない観点だったし、CPU アーキの話するのも 25 年ぶりくらいだったし、高級言語と C とアセンブリの使い分けを簡潔に整理してくれた人がいたので、とても勉強になりました。
>>731
ま、C# からはかなり離れてしまったね。
でも、電卓をバカにするものは電卓に泣くよ。AI もゲームも業務アプリも全てそのマイクロ電卓の組み合わせなんだから。高級言語の時代でも低レイヤーの動作原理を知っているに越したことはない。
- 733 :
- 色々と教えていただきどうもありがとうございました。
とりあえず、下のような感じの結論でまとめたいと思います。
・UnitStep1が遅い原因はパイプライン処理における分岐先読みの失敗による制御ハザードだと思われる
・分岐の方向の入れ替わりが激しくてもそこに規則性があれば制御ハザードは起こりにくいようで、
分岐先読みにおいて高度な学習が行われていることが伺える
・高級言語の目的を考えれば、開発生産性を優先してUnitStep1を選択することも十分にあり得る
UnitStep1の入力データをランダムに決定した場合の、±の割合に応じた実行時間の計測結果
http://iup.2ch-library.com/i/i2026606-1573870091.png
何かおかしなところがあれば指摘していただけると嬉しいです。
親切にしていただきどうもありがとうございました。
- 734 :
- >>733
733 さんは fact-base で真摯に検証・報告してくれる誠実な人ですね。
おかげで楽しかったし、とても勉強になりました。
感謝。
- 735 :
- >>734
お褒めいただきありがとうございます。
パイプライン処理はとても奥が深いようで完全に理解するのはなかなか大変そうですが、
データの割合に関するご指摘のおかげでわかりやすい計測結果も得られて私もとても楽しかったです。
あまりにもわかりやすすぎる結果のせいで今後しばらく条件分岐恐怖症になりそうですがw
- 736 :
- >>710
C4LglgNgPgAgzAAhgJgQYQQbwLACgEFICMAbAmAHbAICqFYwAysAKYAORAFJdQB4CUCALwA+BLwQihCAAwIA/AiIIQsgNx5CxMj1r0mrNsm5Vxg0Qk4SRYuEUEBqJWoR4AvkA===
個人情報漏れてね?
- 737 :
- >個人情報漏れてね?
???
- 738 :
- これはAUTO
- 739 :
- >>731
Windows10の電卓のソースコードがGithubに公開されてるけどかなり複雑なことやってるぞ
- 740 :
- >>739
そう言って最強の電卓を横に出して
自分が作ってるゴミまで光らせるのやめてもらえます?
ダッサイので
- 741 :
- >>740
電卓が簡単でないことを指摘されて逆ギレw
- 742 :
- 1enter2+
- 743 :
- >>740
お前のレス光ってるな
ゴミだけど
- 744 :
- >>741
お前が作ってるのは簡単だろ
- 745 :
- >>744
輝いてるよ!
- 746 :
- お前らいっつもケンカしてんな
- 747 :
- ID:hIGr9Z3d0
クスクスクス
- 748 :
- >>745
LEDだけな
- 749 :
- ワッチョイ 2922-pwu9
スププ Sda2-pwu9
ワッチョイ 02a7-Bv1e
ワッチョイ d163-r7Uq
NG推奨
- 750 :
- WPF開発に使われるMVVMパターンについてですが、Viewは良いとしてViewModelとModelの役割分担についての理解がイマイチです
ModelではOnPropertyChanged();などの記述はするべきではないという理解で良いんでしょうか?
- 751 :
- 雑な解釈
基本的に一画面ごとに最低一つViewModelつくる
なんも画面用にいじらなくてすべて共通部分しかないならModelオンリーで
- 752 :
- 基本的に変更も通知するモデルを作る
各画面ごとにそれをViewで使いやすい形に成形したVMを作る
深く考えない
困ったら考える
- 753 :
- 趣味でタッチパネル用のアプリ開発始めたのですが
IsMouseOverだとタッチイベントが認識されなくて辛い
なんかいい方法ご存知だったりしませんか?
- 754 :
- タッチパネルならUWPを使いましょう
WPFは終わった技術であり、過去の資産のために残されているだけです
- 755 :
- そもそもタッチ操作ではマウスオーバーを表現できないってのは明らかだけど
なんでIsMouseOverが出てくるの?
- 756 :
- なにを使うのが適切?
- 757 :
- C#でQUEUEクラスを利用した際、Dequeue()後にメモリは残るのでしょうか?
EnQueue()とDeQueue()を繰り返しているのですが、(Countは0になる)
Visual Studioでメモリ使用量をみるとサイズがとても大きくなってるのですがこれはどういうことでしょうか?
- 758 :
- GCされてないだけじゃね
適当なところでGC.Collect() してみなよ
- 759 :
- surfaceをペンとで使ってるけどペンを画面に近づけるだけでボタンの色が変わったりしてるな
- 760 :
- ペンはマウス扱いなんだろうけど
タッチはどうなんだろうな
- 761 :
- そりゃ対応ペンは少し浮いた状態でも座標検知できるけど指は無理っしょ
- 762 :
- APIによって色々
WM_POINTERなら全部別デバイスとして判別されてる
wpfにもタッチイベントあるんだからそれでやりゃいいやんと思うが
- 763 :
- あるんだ
最近WPF始めたから知らんかった
まだまだ使えそうだな
- 764 :
- >>761
ペンに特殊な仕掛けがあるわけじゃないと思うので、
ペンだろうが指だろうが同じだと思う
知らんけど
でも普通に静電容量式のタッチパネルでしょ?
- 765 :
- 一応Windows7からOSネイティブでタッチ操作に対応してるんだよね。
当時技術サンプルとして鯉が泳いでる池をタッチすると波紋が広がるスクリーンセーバーが
公開されてたけど、なぜかコードは非公開で意味ねえと思ったなw
- 766 :
- >>758
GCではだめでした
TrimExcess()呼び出せばいいんですって、奥様
- 767 :
- へぇーためになるわ
- 768 :
- >>764
surfaceのペンをスマホに当てても使えないから指とは仕組みが違うのでは?
- 769 :
- >>764
ペンは電池式で何らかの仕掛けがあります。
良く知りませんが、恐らく「交番電界(周波数が低い電磁波とも言える)」を
出している可能性が高いです。
- 770 :
- >>769
もともとタッチパネルの方が交番電界を出しているので、それを相Rるような
逆位相の降板電界をタッチペンの方が出している、と考えられるようです。
- 771 :
- テレパシーの実用化。
- 772 :
- >>769
へー
静電容量式の原理から普通に考えればペン側に仕掛けが必要とは思えんけど、
よく分からんね。
接触しているかどうかの識別はCの大きさで判定するだけのはずだと思うんだけど
- 773 :
- >>772
ペンは静電容量式に対応してないと反応しないよ
手袋とかでタッチしても反応しない
- 774 :
- 専用ペン使うのは電磁誘導方式でしょ。
静電容量とは根本的に違う。
- 775 :
- >>773
対応って言ったって要するに導電性があるだけだよw
だから100均でも売ってる
>>774
surfaceってペン「も」使える設計だよね?
- 776 :
- 長い名前を持つクラスに、thisを返すメソッドがあるとします
// 超長いクラス名
class VeryLongLongClassName {
// thisを返すメソッド
VeryLongLongClassName Foo( ) {
return this;
}
}
このとき、Foo()の定義につけるクラス名を省略、
あるいは置き換える方法はありますか?
たとえば以下のような形が理想です
var Foo() { … } // 型推論っぽく書けるとか
__CLASS__ Foo() { … } //自身のクラスを表す予約語とか
- 777 :
- ないです。
- 778 :
- >>776
外部との境界に var 型推論はムリ。それやると型を差し替えたときに影響が甚大になるため、型推論はローカルでしか許されない。
using エイリアスディレクティブで短い別名付けるとよいのではないかな。
- 779 :
- ありがとうございます
ないですかー 残念
- 780 :
- 問題点や何がやりたいのかを言うと
違うアドバイスか得られることもあるぞ
- 781 :
- インタフェースとか継承を考えても、thisで型推論するのは無理じゃない?
- 782 :
- 戻り値が特に必要ないメソッドはreturn thisにして繋げれるようにしておこうかなあと
return thisにするか同じクラスをnewするかはさておき
- 783 :
- VisualStudio2017を使用
Form1にsplitContainer1を上下に分割して全面に貼ってあり、splitContainer1の下段側にリッチテキストボックス1をドッキングさせて貼ってあります。
このリッチテキストボックス1が、ScrollBarsプロパティ:Both、WardWrapプロパティ:false
このリッチテキストボックス1に縦と横幅を超えるテキスト表示をした時、
縦のスクロールバーは普通に表示されるけど、水平のほうのスクロールバーが表示されなくなったのだけど何が原因と考えられるでしょうか?
・右キー押して自分でカーソルを右端まで動かせば一応画面のスクロールはさせられる
・以前はちゃんとスクロールバーが表示されてたはずなんだけどいつの間にか表示されなくなった?
- 784 :
- >>782
クラス名が500文字とかあるならわかるけど100文字以内なら気にすることでもないと思う
気になるならそもそもクラスの命名が間違っているのでは?
- 785 :
- xamlの質問になってしまいますが、全コントールアイテムのBorderBrushやForegroundの色を統一することって出来ないのでしょうか?
<Style TargetType="Button">
<Setter Property="BorderBrush" Value="Black"/>...
と一つ一つのコントロールを定義して回るしか方法はないのでしょうか?
- 786 :
- >>785
この辺が参考になるかも
ttps://www.atmarkit.co.jp/ait/articles/1009/07/news096.html
- 787 :
- >>776
ファイルスコープの別名なら普通に可能。
グローバルに別名が欲しいと考えてるならそもそも何か考え方が根本的に間違ってる気がする
- 788 :
- >>784
そういう話ではない
それだと「変数をvarで定義するのは設計が間違っているからだ」と言ってるようなもん
- 789 :
- >>788
いや誰が考えてもそういう(>>784)話ですw
それ以外にありえない
- 790 :
- returnの型から推論できるんだからメソッドの戻り型にもvarを使わせろって話?
んじゃあ始め書き込みで予約語の例示が意味不明
というか長い名前という言葉から文章を開始しといて何が違うんだ?
変数でvarを使うのは名称が長いからではないぞ?
長いものも3文字で表現できるという副次的メリットはあれどそのために導入されたものではない
- 791 :
- メンバの型に型推論が使えないのは単純に技術的な問題だよ
コンパイラは先にメンバのシグネチャだけを見てリストアップしてから各メソッドの本体を処理することで依存関係を解決している
メソッドの中身を見ないとメンバの型が確定しないとなると、一度メソッドを処理しただけでは依存関係を解決しきれないから
メソッドを何度も繰り返し処理する必要がでてきてコンパイルが遅くなる
- 792 :
- >>785
できるよ〜
1つのxamlにスタイルを定義して、全てのxamlから参照したりとか
- 793 :
- なんか結論としては>99の質問と同じような感じになっちゃったけど
最初の質問が微妙に異なるので見落ちとしてた、すまん
>>787
単純に自身と同型のオブジェクトを返すときに、なんかスマートな方法あるのかな?と思っただけ
言語によってはそのへんの仕組みがあったりする
ファイルスコープでのエイリアスが可能なら>>778の言うように
分かりやすいところに ThisClass みたいな名前のエイリアスを用意しておいて
クラス内部では基本的にそっちを使うのもアリかなと思っている
予約語ではないのでエディタとの相性はそこまで良くないけのが欠点か
- 794 :
- 戻りの型名を普通に書くのがスマート
くだらないアイデアでコードを汚さないで
- 795 :
- >>791
なるほど、確かにそうだな
動的な言語だとまた違うんだろうけど比較できるようなもんでもないしな
- 796 :
- >>794
んだね
アリかナシかで言えばアリだと思ったけど
言語仕様として存在しないなら自分個人ではなるべく避けたいな
- 797 :
- >>791
今どきのコンパイラでワンパスなんてないだろw
- 798 :
- な?名称が長いかどうかなんて関係ない質問なのに余計な単語から質問を始めるから周りが混乱する。
コメントで超長いクラス名とかまで書いてんじゃん
そんで指摘したらそーじゃねぇよ!ってあほかとwどんだけ説明下手くそなのw
- 799 :
- >>793
なるほど失礼w
長い名前云々書いたのははミスリードだったねw
戻り値を型推論で省略できないか?とシンプルに書いて欲しかった
- 800 :
- 型推論ともちょっと違うからなあ
- 801 :
- >>797
誰がワンパスだなんて言ったんだ?
現在何パス使っているにせよメンバの型推論を許せば間違いなくパスは増えるし、
791で書いた内容は俺の想像じゃなくてMS公式のコメントだぞ
- 802 :
- >>801
多少パスが増えることぐらいでガタガタ騒ぐなよ
って話な
あとMSの見解がどうかしたのか?w
- 803 :
- >>800
そうなの?w
// VLLCNじゃ何だかわからないので必要な場面で説明的な名前を与えるためだけのクラス
// 空っぽの継承のまま維持せよ。メンバ追加禁止!!!
class VeryLongLongClassName : VLLCN { private VeryLongLongClassName(){} }
// VeryLongLongClassNameの実体はこっち。
class VLLCN
{
....
}
まさかこんなのがお好みなのかなw
- 804 :
- 自身のクラス返すときだけ利用したいんでしょ
tweenerみたいな設定が多いものをチェインメソッドで必要な設定を好きな順番で書くとか
他にはfactoryみたいなのをわかりやすくするとか
気持ちはわからんでもないけど局所的すぎると思う
- 805 :
- .Net CoreからBitFlyerの認証が必要なWebAPIを使いたいんだけどさあ
業者は暗号化キーをソースコードやファイル等に保存しないよう求めてるんだけど、.Net Coreでキーを守る手段ってどういうのがあるの?
WindowsやmacOS付属の機能も使えなさそうだし、最終的に動かしたいLinuxなんかそもそもそんな機能がないし・・・・
ランタイムにもそんな機能なさそうだし、どうすればいいんだろ
- 806 :
- ソースはともかくファイルに保存は普通にやるよ
リポジトリに機密情報をコミットしない、と勘違いしてないか?
- 807 :
- >>804
> tweenerみたいな設定が多いものをチェインメソッドで必要な設定を好きな順番で書くとか
チェインメソッドってよく見かけるようになったけど見易いのかなぁ…
X.A( ).B( ).C( );
より
X.A( );
X.B( );
X.C( );
の方が見易いと思う俺は老害なんだろうか
- 808 :
- >>807
linqでつなげるのに慣れてれば違和感なくならない?
linqとは意味合いが違うけども
まぁ可読性なんて人それぞれだとは思うよ
- 809 :
- >>808
linqはパイプみたいに順次処理して行くからまだ理解できるんだけど>>804が言う
> 設定が多いものをチェインメソッドで必要な設定を好きな順番で書く
とかは普通に分けて書けばいいのにって思うんだよね
まあ人それぞれと言うのには同意するけど
- 810 :
- Groovy などでやる、フォームビルダーみたいに、
各コントロールのサイズ・色など、設定項目が多いものは、メソッドチェーンでは見にくい
- 811 :
- >>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にするってのがなんか受け付けないんだよな―。
- 812 :
- DSLとしてどの程度価値があるのか次第だと思う
https://martinfowler.com/bliki/FluentInterface.html
LINQのように関数型ライクな関数合成をOOで表現する場合と
FluentなBuilderパターンは見た目は似てても中身と目的は違うよね
- 813 :
- だから意味合いは違うって書いてんでしょうが
this返して繋げる前提ライブラリなんてよくあるし好き嫌いの範疇
君が嫌いならしなきゃ良いだけじゃん
俺だってC#のライブラリ作るとき設定するだけのメソッドでthisなんて返さないよ
それは俺が作るものが小さいものだからできるだけ標準に近いものが良いだろうってだけ
大きめのものでそれが全体を通して同じようにthis返す設計で、それを使うならなるべくその思想には従うかもしれん程度
- 814 :
- this返すお作法は昔のjava方面の文化じゃない?
C#は1.xの時代にMSか何かのガイドラインで「やるな」って書いてあったのを読んだ記憶がある。
個人的にそもそもそんなキモいことやらないよと思ったので禁止の理由までは覚えてないが。
- 815 :
- >>813
> だから意味合いは違うって書いてんでしょうが
何にキレてるのか知らんけど、意味合いの違うものを引き合いに出すこと自体がおかしいって指摘されてることぐらいは理解しようよ
- 816 :
- とは言え
X.A()?.B()?.C();
ならどうだろう?
- 817 :
- 意味合い違うものを出すのがおかしいなら807のレスがおかしいんだよ?
見やすいとか関係なくて776がこんな機能ないの?→無いよ→なんで欲しいの?→こういうのしたいんでしょ→見にくくね?気持ち悪くね?
って知るかよw
機能の話してんのになんで見易さの話にシフトすんだよ
見易さの話に変えられたので同じ表記の例示だしただけだし、そもそもlinqではないが採用してるライブラリも例示してんのになんでそこにこだわんの?w
- 818 :
- おおもとの>>776や>>793の疑問についてはusingでエイリアスをつけて
『using [別名] = [VeryLongLongClassNameとか別名をつけたいクラス名];』と宣言して、
『[別名] Foo() { return this; }』みたいなメソッドの書き方することはできるし、
その別名に「This」を使ってるようなソースもたまに見かける
なんだけど・・・そもそも戻り値が特にないからとりあえず安易にthisを返すみたいな考え方は間違ってる
戻り値がないならvoidにして無駄な戻り値を返さない
そのクラスがBuilder的な使い方をするクラスである場合に限って、
そういうクラスであることをクラス名ほかで明示したうえで首尾一貫して全voidメソッドでthisを返す
>>782みたいな考え方で戻り値がthisなのか新しいインスタンスなのかブレるかもしれないのは論外
戻り値が後者なメソッドが混ざってると>>807の2種類の書き方で結果が同一にならなくなる
- 819 :
- Fluent apiってthisを返すことが目的じゃないからな
メソッドチェインで宣言的っぽくプログラミングするためのアイデアであってthisを返すメソッドはそのサブセットでしかない
世に出てるライブラリを見ればわかるがthis以外もバンバン返してる
だから作法としてとりあえずthisを返すなんてのは何もわかってない全く馬鹿げたことだ
先にFluent apiの設計をしなければならない
その設計に必要ならthisを返すメソッドを加えるだけだ
- 820 :
- >>817
話題を変えること
と
違うものを引き合いに出して同じでしょ
って言うことの違いも理解できてないのかよ…
- 821 :
- >>820
話題を変えたから見た目の話してんのに機能面に難癖つけてるの分かってる?
見た目はこれと一緒、機能はちがうけどね
ってレスしたらそれは機能が違う!って戻してんじゃんw
見た目も機能も同じtweenerという例示
見た目の話に切り替えたので見た目は同じだが機能は異なるlinqという例示
念の為機能は異なることも明記した上での提示に対して機能面についてあーだこーだ言われてもねぇ
- 822 :
- 喧嘩すんなよ。
いろいろな観点から指摘が入って、設計やスタイルに関する考察が深まるのはいいことだ。
揚げ足取りとか噛み付きとか不毛だからやめような。
- 823 :
- コードレビューするなら
本質的な機能では無いのに戻り値返すのは利用者の理解を妨げる上に、バグの元にもなるので、余計な事すんなと言うな
あとから戻り値欲しくなった途端に困るやろ
- 824 :
- 今までレスしてる中でthis返す設計に肯定的な姿勢なのは元の質問者である782だけ
C#標準にそういう設計は無いからその利用者の多くは否定的になる、俺も含めて
世の中いろんな設計指針があるし他言語の流儀を真似することもある
同じチームで開発することになるならその辺りはできるだけ同じ方向を向きたいけれど、そういうのじゃなければ最終的にはお好きなようにとなるよね
- 825 :
- >>821
バカなの?
> linqはパイプみたいに順次処理して行くからまだ理解できるんだけど
って書いてあるだろ
そういう必然性のない
> 設定が多いものをチェインメソッドで必要な設定を好きな順番で書く
を同一視してるのがおかしいの
わかった?
- 826 :
- >>825
それは機能の話ね
で、機能は初めから違うよ、って言ってるよね?
誰も同一視してないのになんで同一視してんじゃねーよ!って絡んでくるの?
- 827 :
- 揚げ足取りだけど&Javaからの輸入だけど
>C#標準
つStringBuilder
もっとも自分でコード書くなら(変数名が短い前提で)メソッドチェーンにはしないけど
「文字列組み立ての順序を明示する」意図でメソッドチェーンで書くのはまあ理解できる
- 828 :
- linqもtweenerみたなのもメソッドをドットでつなげて表記する
データを加工して流すものとthisを返すものという機能面では全く異なるもの
機能と見た目を完全に切り離せるわけではないので、その見た目から機能面を理解しづらい=可読性に影響があるという議題は残るものの、どちらも利用する上での表記は同じ
ただこれだけで当初から機能は異なることを明記してるのになんで機能違うじゃねーか!みたいなすでに注釈してる内容に噛み付いてくるんだ
- 829 :
- >>827
おぉ、確かに
標準にもあったね、ありがとう
- 830 :
- >>826
もしかして「必然性」っていう言葉を理解できないの?
機能が違うからダメと言うより必要もないのにチェインメソッド使わなくても良くね?
って話な
- 831 :
- >>827
fact を提示するのは揚げ足取りではないと思うよ。
return this は言われるほど悪いものではないと個人的には思う。が、メソッドチェーンにする価値は LINQ に比べるとさしてないという意見にも同意。
- 832 :
- >>830
うん、使わなくてよくね?
使うべきとも使ったほうが良いとも書いてない
そういうライブラリがこの世に多少は存在することを例示しただけ
そもそも俺自身がthis返す設計に否定的だって何度も書いてるんだけど読んでる?
- 833 :
- 他言語だけどスクレイピングでよく使う
browser
.GotoHome()
.Login()
.DoSomething()
.DoAnother()
.SkipSomething()
.PrintResult()
コンテキストのつながりが自分にとって自然で
各メソッドを部品としてチェリーピックして使うような場合は
読みやすくなると思ってる
結局 return thisの是非じゃなく
メソッドチェーンでつないでいくのが適してる用途なのか
そうじゃないのかの話だよねこれ
- 834 :
- >>832
お前の意見はどうでもいいよ…
必然性の有無にも気づけずにLinqガーとかいうアホがいたって話だしw
- 835 :
- なんか絡まれたから対応したら君の意見はどうでもいいって…
じゃあなんで絡んだんだよw
- 836 :
- VBのWithみたいなことやりたいって理由でthis返すんなら最低だな
- 837 :
- >>835
> じゃあなんで絡んだんだよw
ちゃんと書いてあるだろ…
> 必然性の有無にも気づけずにLinqガーとかいうアホがいたって話だしw
見た目の話だけなら個人の好みだから人それぞれでいいけどLinqとかの必然性があるものを持って来られても困る
- 838 :
- >>837
いや、だからなんで俺の意見はどうでも良いはずなのに未だに絡むの?
何を説明しようがどうでもいいで片付けるんだから話にならないじゃんw
もう一回説明しようか?
linqと見た目が一緒、機能は異なる
ただそれだけなんだけど伝わらない?これも意見だからどうでも良いんだと思うけど
ずーっとこう主張してるのになんでlinqは必然性があるから良いんだ!みたいな頓珍漢な絡みするの?
- 839 :
- >>838
まじで日本語の理解力がなさすぎ
(引っ込みつかなくなってるだけかも知れんがw)
> うん、使わなくてよくね?
という君の意見はどうでもいい
Linqは>>811が書いてる通り
> LINQでつなげる場合はLINQメソッドの戻り値を意識しながらつなげるわけだから、話が違うじゃん
ってことな
- 840 :
- >>839
いや、だからそんなことわかりきってるよw
807で君が言った内容に対して表記が同じとしか言ってない
ちゃんと機能が異なることを追記した上で同じ表記だね、って言っただけでしょ?
それに対して延々と同じ内容で煽り続けてるんだよ?
linqは意味が違うよっていう808からの始まった内容に対してlinqは意味が違う!馬鹿なの?って
もっかい始めの方からレス内容確認したほうが良いよ
言葉尻捕まえて煽るだけで引っ込みつかなくなってるのはたぶん君の方だよ
- 841 :
- 判った。LINQ宗教だ
- 842 :
- もう堂々巡りにして引き分けに持ち込もうと必死だな
Linqならメソッドチェーンにする意味があるから
> tweenerみたいな設定が多いもの
と一緒にされても困るって何度書いても同じこと書いてくるんだろうなw
- 843 :
- 機能の話から表記の話なってまた機能の話に戻す
表記の話のときに表記が同じ例を提示すると機能が違うんだから同じにすんな!
ってそりゃそうですよね、機能は違うってみんな言ってますもん
機能が同じだなんてレスどこにありました?
- 844 :
- 804:機能の話
807:機能から発展した表記の話
808:表記の類似例の提示
811:機能ちげーじゃんというツッコミ
813:そうだよ機能は違うよという返し
ここから延々、表記の類似例に対して機能が違うじゃんというツッコミ
811は807とは違う人だけどね
807でも機能の話をしてたと言うなら俺の読解力が悪かった
表記の話であることを明確にするために808に意味合いが異なると注記したつもりではあった
今見返しても表記に関しての話題転換にしか見えないけど
- 845 :
- linqなんてゴミだろ
- 846 :
- LINQ友の会スレ消えちゃった?(核爆)
- 847 :
- ゴミのような時間の使い方をしている人らとはどっこいどっこいって感じよ
- 848 :
- まだ言ってるのかよw
> 機能が違うからダメと言うより必要もないのにチェインメソッド使わなくても良くね?
> って話な
って書いてあるのに「機能が違う」を連呼するしかない脳無し乙
- 849 :
- >>1
>なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
>C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください
ID真っ赤にしている人はコレ100回読んでね
- 850 :
- お互い口汚く罵るのはやめよう。どちらも有益な情報を持ち込み、スレに貢献してると思うよ。
>>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 :
- まあLINQはさておき
前者と後者じゃ後者のほうがスッキリして見える場合もあるんじゃないかなとは思う
hoge.foo();
hoge.bar();
hoge.baz();
hoge.quz();
hoge
.foo()
.bar()
.baz()
.quz();
セミコロン必須の言語やif文とは相性そんなに良くないけどさ
- 852 :
- >>850
tweenerはたぶんゲーム分野とかで使うことが多いと思うけど表示物のアニメーション制御に使うようなライブラリを指して言った
最近はweb系もアニメーションには富んでるからそっちにも似たようなものはある
表示物のx座標をaからbにc秒かけて移動させる、そのときd秒遅れてアニメーションを開始して終了後にe関数を呼ぶ
みたいな設定をするのに使う
- 853 :
- >>851
疑似with構文ってとこかな?
- 854 :
- c#の先祖に当たるdelphiではwithがあったがC#で亡くなった
- 855 :
- まあ罵倒は見てて見苦しいねw
thisを返す手法に違和感を感じる人(自分もその一人)が多いのは、
(1) シグジェチャだけではメソッドが返す値がthisなのか別のインスタンスなのか分からない
(2) チェーンさせる目的でthisを返すのは意味論(メソッド名はそのメソッドの機能を表現する)を破壊する
こんなところか。
本来は必用なら言語レベルで実現すべき機能なんだろうね。
でもC#erってVBのWithブロックには否定的な人が多かったよな
- 856 :
- 相談させてください。
以下のようなクラスを作りたいと考えています。
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 :
- (続き)
そこでさらに次のように改良したところ、無事警告は表示されなくなりました。
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 :
- 俺自身もthis返す設計に否定的で813で明確に表明してるんだけどねw
850の初期化の例みたいなのもC#ではメソッドに引数名を指定して呼び出すことができる機能があるからそれで事足りる
引数の数が多くなったりオプション引数使えば更に長くなったり呼び出し側も見た目はスマートとは言えないような書き方になったりするんで多用は避けたいところだけど局所的な利用なら無しでは無い気もする
まぁ設定用の構造体作って渡すとかjson等をシリアライズしたものを渡すとかのほうがいいんじゃない?とは思う
- 859 :
- >>856
>高コストな HighCostMethod を2回も呼びだすのは無駄なので
典型的なシングルトン。
データベースマネージャーとか、何かを管理するクラスは、基本的に1回しか実行しない
init( ) みたいな、特別な関数でしかnew できない。
通常の方法では、newできないように、エラーになるように作る
- 860 :
- >>857
HighCostMethod()の結果をキャッシュする
キャッシュがあればそれを使う、なければHighCostMethod()を呼んでキャッシュに入れてから値を返す
- 861 :
- >>856
private static double Cache = HighCostMethod();
public static double X = Math.Sign(Cache);
public static double Y = Math.Abs(Cache);
みたいに一旦結果を受けるものを作れば回避できそう
- 862 :
- >>859
レスありがとうございます。
おっしゃるとおり、シングルトンを使えば問題は解決するだろうと考えて
作成したのが MyStaticClass3 なのですが、
MyStaticClass3 が MyStaticClass2 よりも
パフォーマンス的に優れていると考えられなくて
質問させていただきました。
> init( ) みたいな、特別な関数でしかnew できない。
> 通常の方法では、newできないように、エラーになるように作る
ここで説明していただいているお話と
MyStaticClass3 の中身の違いがよく理解できていないので
詳しく教えていただけないでしょうか。
よろしくお願いいたします。
>>860
レスありがとうございます。
HighCostMethod()の結果をキャッシュするための装置として
MyStaticClass3.Initializer を作ったつもりなのですが、
改良点などがあればご指摘いただけると幸いです。
よろしくお願いいたします。
>>861
なるほど!レスありがとうございます。
ただ、一時的に値を保持するためにフィールドを使うのは
少し抵抗があるきもするのですが、よく使われる手法なのでしょうか。
また、一つのクラスを複数ファイルに分けて記述できることを考えると、
フィールドの初期化は必ず上から順に行われることが
保証されているのかということについても少し不安があるのですが、
もし何か参考資料などをご存知なら教えていただけると嬉しく思います。
よろしくお願いいたします。
- 863 :
- >>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() })
};
- 864 :
- VS2015だとCA1810 なんか出ないなw
出るとしても警告を抑止して問題ないケースだと思うけど
- 865 :
- >>862
XやYをプロパティにしてキャッシュがあるかどうか確認してなければHighCostを呼ぶ
じゃなければLazy<T>使う
https://dotnetfiddle.net/0dQM8v
https://docs.microsoft.com/en-us/dotnet/framework/performance/lazy-initialization
- 866 :
- stringのreplaceとか別のインスタンスじゃん
こういうのと仕様が違うの作っちゃうの嫌だな
こういうのは多数派に合わせる感じで
- 867 :
- >>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
- 868 :
- これはOKみたい。
static double x;
static double y =
(
(Func<double>)
(
() =>
{
var v = HighCostMethod();
x = Math.Sign(v);
return Math.Abs(v);
}
)
)();
もちろん俺ならこんなことしないw
素直に警告無視or抑止するのが一番いい。
無駄なことして可読性落とすなんて愚の骨頂
- 869 :
- >>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);
- 870 :
- >>867
おお!情報どうもありがとうございます。大変勉強になります。
そうであるなら、Cache のフィールドが残ることが気にならないか、
もしくは Cache も後々使うなら >>861 に書いていただいた方法が
最善になりそうですね。
>>864
なるほどw 警告も万能ではないとういことですね。
説得力のある面白い例を示していただきどうもありがとうございます。
- 871 :
- >>868
そのコードだとyにアクセスせずxにだけアクセスしたら初期値の0のままだぞ
- 872 :
- >>869
>>865の一つ目のリンク(.NET Fiddle)がLazy<T>使ったサンプルだよ
- 873 :
- >>871
CA1810のページによると、staticフィールドの初期化はいずれかのstaticフィールドに
最初にアクセスされる前に行われるとなってるから、それはないのでは?
知らんけど
- 874 :
- >>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);
}
のような感じとか。
- 875 :
- >>874
個人的に警告を回避するために普段しない書き方をするのは違うと思う
警告の内容を理解し、それが今回のケースでは問題ないと判断できるなら遠慮なく警告を抑制していいと思う
プログラム起動時に自動的に初期化されるstaticとプログラマが初期化タイミングを制御できるsingleton
起動コストが問題なくてstaticが妥当なら警告抑制を選択するかな
- 876 :
- >>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つ目のリンクに書いてある
あともし他人も使うコードなら潜在的に高コストな処理は
フィールドやプロパティじゃなくメソッドにしといたほうが無難
- 877 :
- >>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);
に書き換えても同じではないでしょうか?
> あともし他人も使うコードなら潜在的に高コストな処理は
> フィールドやプロパティじゃなくメソッドにしといたほうが無難
アドバイスどうもありがとうございます。言われてみて、確かにそのとおりだと思いました。
コストの高さに応じて適切な書き方が選択できるように勉強したいと思います。
- 878 :
- ソースといっしょで中身がないのに文章なっげぇな
- 879 :
- もう誰かとっくに書いてるだろうけど、やっぱり本来は重くなる可能性があるなら
フィールドやプロパティーじゃなくてメソッドにすべきなんだろうね。知らんけど
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 :
- なんかこう、せっかくの言語仕様を活かしきれてないような
もったいなさがあるよね
- 881 :
- 原則としてはgetterでは値の取得と通知しかしてはならない
これはC#に限った話ではなくオブジェクト指向の大原則の一つ
- 882 :
- >オブジェクト指向の大原則
w
- 883 :
- 大原則?
オブジェクト指向の原理主義的にはそもそもgetterを作るべきではないんだよ
getterを使うのは上司がタバコを吸いたいときに不器用な部下にしびれを切らして「お前、もういいからお前のライター寄越せ」
と言っているようなもので、オブジェクトから本来担うべき責務を剥ぎ取ってしまっている
火をつけろと命令を投げっぱなしにしておけば勝手に火をつけてくれるのが本来のオブジェクト指向の姿
- 884 :
- 昔の人は言いました「100人のプログラマーがいたら100通りのオブジェクト指向がある」
- 885 :
- なるほど
博士が100人いる村につながる胸熱展開ですね
- 886 :
- ところでみんな、警告って全部消してるのか?
- 887 :
- 消すの意味次第
抑制も含むなら消してる
抑制は含まないなら消してない
- 888 :
- vs2019になって警告増えたよね
- 889 :
- 警告を消してないと納品出来ないから渋々消してる。
- 890 :
- vs 2019でenumをuintで作ったらint32にしろって警告された
win32api用なんだけど使用時にキャストしろという事か
- 891 :
- 負の数混ぜてないか
- 892 :
- フォルダファイルの情報集めてデータベース作りたいんですけど
データベースの種類って何がいいのかな?
3万件ぐらいのレコード、外部に持っていくこともしない
よろちしおねがいします
- 893 :
- redisは早いぞ〜
- 894 :
- DB作って何がしたいのかしら
- 895 :
- sqliteでいんじゃね?
- 896 :
- 何がしたいのかによるよね
ぶっちゃけ外にださないんだったらcsvですらいいんじゃね?って気もするけど
- 897 :
- linuxにはlocateコマンドと言うものがあってファイルを高速に検索できる
これはただあらかじめフルパスのファイル名を全部取っておいて一つのテキストファイルにまとめてあるだけ
用途次第で最適な方法は異なる
- 898 :
- フルパスそのままじゃなくて差分のようなテキストファイルを作っていたような気もする
- 899 :
- >>893
Redisなんてゆうデータベースあるんですね、一般的なのかな
さんくすしらべてみます
>>895
サンクスsqliteよく使われてますよね昔から
今でも普通に使われてるのかな?
>>894>>896-897
何がしたいのかとゆうと、外付けHDDの中身を書き出したい的な事がしたいのです
高性能なフリーウェアがあるとしても、自分でつくりたいのれす
- 900 :
- いや、知りたいのはその書き出したファイル情報をどうしたいのか?なんだけど…
自分で作りたいというのが勉強を兼ねてるならsqliteとかでひとまず慣れるのが良いんじゃない?
- 901 :
- 教会作るのか扉作ってるのか木を切ってるのかっつー話よな
それはさておき
お手軽に使えるのはSQLiteでライブラリやマッパーも豊富
redisは高速でwebクラウド周りでは結構ちやほやされた
けどRDBとNoSQLの区別付いてるかは心配やな
外付けHDDの中身…か…
- 902 :
- テキストファイルにファイル名ずらっと並べて終わりだろう
- 903 :
- >>900
さんくす、SQlite?そんなの古くて誰も使ってないよ?みたいな状態が怖い
>>901
さんくす、とりあえず椅子を作りたい、用途に多少合わなくても使えるから
簡単な検索、重複ファイルの処理とか?
速度は遅くていいので、簡単で扱いやすいのがいいでつね
RDBで作ろうとおもってます
>>902
そんな感じになりそう、さすがにテキストファイルは作らないけど
sqlite使ってみようと思いますが、Microsoft SQL Serverってどうなんでしょう?
定番なんでしょうか?それとも難しいとか使いにくいとか
- 904 :
- >>903
sqliteはローカルで閉じたお手軽DBとしてはまだまだ現役よ。ローカルDBのデファクトスタンダードと言っていいぐらい。
クライアントサーバのようなシステム作りたいなら不向きだけど。
- 905 :
- SQL ServerとかそれこそWinのクラサバでしか使われてない無価値な技術だぞ
- 906 :
- sqliteは組み込みDBではメジャーだろ。androidアプリの標準ローカルDBがsqliteだし。iosのcoredbだって内部はsqlite使ってるだろ?
モバイルアプリでsqlite使われまくりだろ。
まぁ、最近はrealmだのあるが
- 907 :
- >>905
無知乙
- 908 :
- ボソッと Berkeley DB
- 909 :
- sqliteはChromeとかfirefoxでも使ってるはず
- 910 :
- >>903
win環境ならSQL Serverは最有力選択肢だよ
C#前提ならVisualStudioとも統合されてるし、簡単に扱えるので取り回しもしやすくて情報も多い
気になるのはやろうとしてることに対して、若干大げさな構成かなという点かな
RDBの経験積みたいのが目的に含まれるなら全然アリよ
- 911 :
- インストールとかもSQLServerのインストールと設定込みになるから大げさだよ
インストール先でSQLserverの管理も必要になる(セキュリティーホールに対するアップデートなど)
sqliteがいいと思うよ
- 912 :
- プロダクト目的なSQLite
勉強目的ならSQLServerっつーことで
- 913 :
- SQLite3は当のMSが使ってたりするぐらいメジャー
https://qiita.com/h_matsumura/items/e1597a985de25e2ea9c8
- 914 :
- >>904
さんくすです、現役なら今から勉強しても無駄にはならなそうですね
>>905
Microsoftはたまに、それ誰得よってのがあるから怖い
>>906
さんくす、androidに使われてたらしばらく安泰でつね
>>908
ちょと調べてみたけど、きびしい、頭の片隅に
>>910,912
さんくす、SQLServerも間違ってはいないのですね
DB使うまでもなくオーバスペックっぽいけど、練習になるから
>911
導入がメンドイのと保守もいると、さんくすね
>909
firefoxで使ってるのみました、でもFFは設計古いままきてるからどうなのかなって
>913
VisualStudioにsqliteいれといてくれたらいいのにね
みなさんさんくす、現在のDBの立ち位置がわかって、方向性がだいたい決まりました
まずはsqlite導入してみようかな
- 915 :
- SQLiteって導入するほどのもんでもない
っていうか導入とかせんでも使えるし
- 916 :
- 一緒んとこ置いて呼ぶだけやからなw
- 917 :
- Nugetなりvcpkgでソッコで使えるしね
- 918 :
- nugetで簡単にプロジェクト追加できるからVisual Studioに付属していないという批判はお門違い
- 919 :
- >>917
しね、とはなんだよゴルァ
- 920 :
- >>917
まあこういう文章だと語尾がしねに読めちゃうのはしょうがないしね
- 921 :
- 「〜だしね」からの「しねとは何だ!」ってのはいつものお約束だろw
むしろ愛を感じるわ。
- 922 :
- >>914
> VisualStudioにsqliteいれといてくれたらいいのにね
2019は知らんけど2017はVisual Studioのインストール時にSQL-Server LocalDBを入れるかどうかを聞いてきたような気がする
LocalDBは外部からの接続できないだけで中身はほとんどSQL-Server
Visual Studioからテーブル開いてデータを弄ることもできるしそこそこ便利よ
- 923 :
- sqliteもlinqで使えるの?
- 924 :
- >>923
使いたいときはentityframeworkっていう似たようなものを被せて使います
- 925 :
- 山車ね
- 926 :
- >>922
まじでっ、2017入ってるんだけど記憶にないお
スキップしたんだろうな、今からいれてみるサンクスね
- 927 :
- >>915-918
nugetも入れたほうがいいのかお
- 928 :
- genericsの〈T〉のTって動的に入れるのは無理?
System.Typeはわかってるんだが
- 929 :
- >>928
Type.MakeGenericType
- 930 :
- >>927
nugetを入れると言う以前にVS使ってソリューションて作るとすぐ使える状態にあるし
SQLiteを始めとして外部ライブラリを導入するならnuget使うのはc#では基本ツールと言えるので、使えたほうが良い
パッケージ管理にnugetが最適かは置いておくとして
- 931 :
- >>926
すまん、今ググったら入れるかどうかを聞かれるわけじゃなくて.NET desktop developmentを入れた時のオプションだったわ
https://i.stack.imgur.com/1u3O2.png
一応後からでも入れられるみたい
https://stackoverflow.com/questions/42774739/how-to-install-localdb-2016-along-with-visual-studio-2017
- 932 :
- sqliteだと配布も楽だしね。
- 933 :
- sqliteやるとして、Dapperを使うかEF使うかは意見が分かれるところだね
ついでにSQLから始めるってことでDapperをお薦めしますが
EFはSQLを知らなくてもなんとかなるが、そのうち壁にぶち当たるだろうからね
- 934 :
- SQLiteとEFの組み合わせはテスト専用だ
EFはサーバー用のフレームワークなのでSQLiteを使うようなスタンドアロンなアプリで使用されることは基本的にないし、
EFなんか被せたら軽量なSQLiteが台無し
- 935 :
- SQL-Server Local DB って MSDE のこととちゃうんけ
- 936 :
- >>935
どんだけ情報更新されてないんだよw
- 937 :
- MSDEつーか、SQL Server Expressだっけかな
- 938 :
- 間違ってなくて安心した
- 939 :
- いや間違ってる
MSDEの後継はSQL Server Express
Local DBはそれとインターフェイス互換性を持たせた別製品
ExpressとCompactのあいのこみたいなもの
- 940 :
- ありがとう
SQLite とは関係無いことは判った
SQLite の簡単さとは比べ物にならない
- 941 :
- SQLLiteてUPDATE文に結合テーブル使えないんだっけ
- 942 :
- >>939
> Local DBはそれとインターフェイス互換性を持たせた別製品
> ExpressとCompactのあいのこみたいなもの
お前もテキトーなこと書くなよw
LocalDBはエンジンはExpressとほぼ同じで外部からの接続ができないだけ
Compactは全く別物で使えるSQLも異なる
- 943 :
- 20年程前にSYBASEと分離したけど
大元は同じだったり
- 944 :
- MS製でサーバーインスコ必要ないSQLはmdbということになる?
- 945 :
- >>944
JETなりは必要になるんじゃ?
- 946 :
- なんでMSはAccessやめちゃったんだろうな
さっさとWeb移行して真面目に開発続けてればSalesforceみたいな糞に出番はなかったのに
- 947 :
- >>944
SQL Server Compact…はまだ生きてたっけ?
- 948 :
- >>947
Compactは終了で、その代わりがlocalDBなんじゃなかったっけ
- 949 :
- >>930
さんくす、Nugetすごく簡単だねえ、ただ多すぎて迷う、coreにしてみた
>>931
わざわざさんくすね、LocalDBも入れてみるお
>>933
Dapperとゆう新たな単語が、、頭の片隅に
他の人もサンクス、あとは勉強してコード書くだけだね
- 950 :
- >>946
Access地味に高いからな
使わんのにエンタープライズに入ってやがるのがムカつく
- 951 :
- >>950
Accessというか、MDBファイルは作るときこそ金はかかるが、配布は無料ってところが良かったよな
頑張ればフリーで全て賄うことも可能だったし
- 952 :
- ASP.NET Webフォームでオブジェクト指向な作りって出来ますか?Pageクラスを継承した画面ごとのクラスが基本となると思うんですが、それらとは別にドメインオブジェクトを定義すればいいんでしょうか?
古いフレームワークのせいか、参考になる情報がWeb上で見つからず困っています
- 953 :
- ドメインオブジェクトはどんなフレームワークでも作るのはまあ基本
- 954 :
- C#にしてもVB.Netにしても、オブジェクト指向な言語だからできるだろ
オブジェクト指向な作りってどんなのを指してるんだ?
- 955 :
- extendsを使いグローバル変数で回さないことかな
- 956 :
- mdb は Access 無くても作れるし使える
wsh からも作れるし
python からでも win32com とか adodb とかで生成も操作も可能
- 957 :
- >>956
生成できたっけ?
ADOXが必要だと思ってたけどadodbで生成できるならやり方教えて欲しい
- 958 :
- 昔はVSでもGUI上からmdb作れた気がするけどc#からコードで作れたと思う
- 959 :
- COMオブジェクト参照するの気持ち悪いな
- 960 :
- 扱い面倒だからね
自分だけなら良いけど
人が触ると直ぐに解放漏れするし
gc.Collect連打とか
- 961 :
- windowsなんてcomの塊なのに
- 962 :
- モダンアプリではより完全なCOMベースになったね
.NETなんかいらんかったんや
- 963 :
- >>959
ADO.NETじゃアカンの?
- 964 :
- 組み込みっていったっていまどきマルチスレッド当たり前で、要は
マルチユーザーでアクセスするのと同じなんだが、組み込みDBは行ロックが
ないのが痛すぎる。大きめのバッチ走らせると行ロックないから
他から更新できなくなるし。
- 965 :
- >>964
用途に応じて使い分ければいいんじゃないでしょうか
- 966 :
- Newtonsoft.Jsonに絡み、C#の文法や仕組みがよくわからないので教えてください
https://www.newtonsoft.com/json
前者のコードが通ること、対して後者が通らないことの理由がそれぞれよくわかりません
var jsonString = JsonConvert.SerializeObject(new {asdf = "asdf"});
var jsonString = JsonConvert.SerializeObject(new {var asdf = "asdf"});
JsonConvert.SerializeObjecメソッドに匿名のオブジェクトを作成して渡すのであれば、宣言を含めきちんと作成した後者のコードになるような気がしてしまいますが・・・・一体どういうことなのですか?
- 967 :
- 匿名型でvarを使う文法が存在しないからじゃねーの
- 968 :
- https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/anonymous-types
- 969 :
- >>967=968
ありがとう、こういうものだったのか
全然知らなかった助かったよ
- 970 :
- WindowsフォームのListBoxのアイテムの順番を
マウスでドラッグして移動出来たりはしないでしょうか?
- 971 :
- >>970
https://www.kisoplus.com/sample2/sub/listbox.html
試してないけど
- 972 :
- ありがとう!やってみる
- 973 :
- vs2019って新規作成でフォーム作れます?いきなりユーザーコントロールしかなくないですか?
- 974 :
- モルダー、あなた疲れてるのよ
- 975 :
- >>973
そうなんだよ
まずボタンやチェックボックスの自作から始まる
一通りできたらフォームの新規作成がアンロックされる
- 976 :
- はいはいそうですか
- 977 :
- >>976
右上二行目のコンボボックスが「AddOn」となっているだろうが、そこを「デスクトップ」にする
- 978 :
- WPFのStack、WrapPanelなどのコンテナ上の余白クリック時にイベントを追加したいのですが、Background="#00000000"とすることでそれ自体は達成することが出来ました
しかし該当コンテナ上に配置されてるButtonなどのコントロールをクリックしたときもコンテナに追加したクリックイベントを拾ってしまいます
あくまで余白クリック時のみ発生させたいのですが、何か方法はないでしょうか?
- 979 :
- >>978
ルーティングイベントを止めればええ
- 980 :
- >>979
if (!(sender is StackPanel)) { e.Handled = true; return; }
これを先頭に追加してみたところ希望の動作になりました。
どうもありがとうございます。
- 981 :
- >>980を踏んだ人は新スレを建てて下さい
次スレよろしく
- 982 :
- 次スレ立てました。
https://mevius.2ch.sc/test/read.cgi/tech/1576069931/
- 983 :2019/12/11
- >>982
スレたて乙
アセンブラ初心者スレッド 2
【実験台】 Python 3.0 のお勉強 Part 1 【非互換】
C言語なら俺に聞け 155
くだすれDelphi(超初心者用)その55
C言語なら俺に聞け 147
WPF(XAML, XBAP, .NET4.0)GUIプログラミング Part22
Rubyについて(アンチ専用) Part005
Smalltalk総合 Squeak Pharo
[RPA]PC自動化技術総合スレ[効率化] Part.8
【MACRO】Google Apps Script 質問スレ【DRIVE】
--------------------
ジ・エンド・まきPart.2
池田
☆★★★★チョコミントアイス20個目☆☆☆☆☆
【自動車】Rーリのデザイナー「韓国車、イタリアでは日本車と同級」
めんま「もっとみんなと遊びたい。だからね、ぱちんこと、すろっとに、生まれ変わりする。」 [135069671]
☆ Amerieちゃん ☆
テレ東☆角谷暁子 vol.1
何故欧米人は離婚しまくるのか?
【岡田准一】ザ・ファブル THE FABLE【レディー・ガガ】14
【セクハラ】高橋大輔選手、橋本聖子からキスされる
【ももクロのアイドル】佐々木彩夏 part153【あーりん】
スカイマークBC093便
Window$ 10 質問スレッド Par†70
新日本郵便輸送を語ろう 5
セレンさんの経歴・英語力を検証するスレ35
なぜ、スイスに負けたのか
第25回参議院議員選挙・議席予想情勢スレ その121 修正済 【荒らし出禁,ワッチョイ有】
関西のリサイクルショップ
FF7・FF8・FF9・FF10・FF12・FF13・FF15 どれが一番の神ゲー? Part25
エヴァのAA総括第参百六拾九層 夏のセクシーAA1
TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼