X



ふらっと C#,C♯,C#(初心者用) Part145
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん (ワッチョイ 1e7b-qjLW)
垢版 |
2019/10/07(月) 20:16:17.93ID:9eyAES450
!extend:checked:vvvvv:1000:512
次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為)

「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください
>>980を踏んだ人は新スレを建てて下さい。>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

■前スレ
ふらっと C#,C♯,C#(初心者用) Part144
https://mevius.5ch.net/test/read.cgi/tech/1563258983/
■関連スレ
C#, C♯, C#相談室 Part95
https://mevius.5ch.net/test/read.cgi/tech/1508168482/
■コードを貼る場合は↓を使いましょう。
http://ideone.com/
https://dotnetfiddle.net/

■情報源
https://docs.microsoft.com/ja-jp/dotnet/standard/class-libraries
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index
https://docs.microsoft.com/en-us/dotnet/standard/class-libraries
http://referencesource.microsoft.com/
・Insider.NET > .NET TIPS - @IT
https://www.atmarkit.co.jp/ait/subtop/features/dotnet/dotnettips_index.html
・DOBON.NET .NET Tips
https://dobon.net/vb/dotnet/index.html
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
0003デフォルトの名無しさん (ワッチョイ 2a01-oCTO)
垢版 |
2019/10/07(月) 23:08:42.11ID:4esZ9KBu0
c# windowsフォームにファイルをドラッグ&ドロップしたらファイルのパスを取得みたいなコードはネットにありますし、そのままビルドしたら正常に動作しましたので良いのですが、
ファイルをドラッグした瞬間にパスを取得することは出来ますか?
0006デフォルトの名無しさん (アウアウウー Sa21-qxT7)
垢版 |
2019/10/07(月) 23:36:38.52ID:/mGKDAACa
>>3
普通にやると一番早く取得できるのはDragEnterやDragOverイベントかな
もしドラッグを始めた瞬間に取得したいのなら
全プロセスに対してOle32.dllのDoDragDrop呼び出しをフックして
プロセス間通信でパスを通知、とすれば出来るのかもしれないけど初心者がすることではなさそう
0007デフォルトの名無しさん (ワッチョイ 3db0-FJ4P)
垢版 |
2019/10/08(火) 10:56:30.06ID:2mFIneqB0
質問失礼します
textboxに入力を終えて確定したことを知り自動的に
フォーカスをtextboxから別の決まったコントロール(buttonとか)に移動したいのですが
フォーカス移動のコードをどこにどう書いたらいいのか分かりません
0008デフォルトの名無しさん (アウアウウー Sa21-5zAY)
垢版 |
2019/10/08(火) 12:49:06.43ID:8dDmccAua
>>7
ケースバイケースでは?
同じ機能のTextBoxが一つしかなく、他で使いまわす予定もないなら
Formに書けば十分。

複数使いたかったり汎用的で他で使いまわしたいなら

(a) TextBoxを継承してそこに書く
(b) UseControlにTextBoxとButtonをペアで配置してUseControlにフォーカス移動のコードを書く

このいずれか。
0009デフォルトの名無しさん (ワッチョイ 3db0-FJ4P)
垢版 |
2019/10/08(火) 13:32:25.44ID:2mFIneqB0
>>8
ありがとうございます
なるほど、(a)かなあ
ところでtextboxの入力が確定したことをどうやって取得すればいいのかも分からないんです
それも教えてください、すみません!
0010デフォルトの名無しさん (ワッチョイ 3db0-FJ4P)
垢版 |
2019/10/08(火) 13:36:59.57ID:2mFIneqB0
あ、それはTextプロパティが変化したかどうかを見ればいいのか?
でもそれじゃイベントハンドラがどうしたらいいのか分からない
Textの変更を始めたというイベントハンドラって取得できるんですかね?
0011デフォルトの名無しさん (ワッチョイ 3db0-FJ4P)
垢版 |
2019/10/08(火) 13:52:29.59ID:2mFIneqB0
それも駄目か
やっぱり何らかの方法で変更が終了して
リターンを押して確定したことを取得しないといけないよね?
0012デフォルトの名無しさん (ワッチョイ 3db0-FJ4P)
垢版 |
2019/10/08(火) 14:15:27.36ID:2mFIneqB0
わかった _TextChangedか!
ありがとうございました
0015デフォルトの名無しさん (ワッチョイ 6a24-G1PU)
垢版 |
2019/10/09(水) 07:55:59.19ID:/K0h5hCH0
WPFアプリにてタスクバープレビューの右上の閉じるボタンから閉じた時のイベントを取得することは出来ないのでしょうか?
上記の方法で閉じると一見終了されたように見えてもプロセスは残ってしまうため、メインウィンドウの閉じるボタンを押したときに呼ばれる後処理メソッドを呼ばせたいのですが
0018デフォルトの名無しさん (ワッチョイ 7dda-EMGa)
垢版 |
2019/10/09(水) 16:30:31.60ID:31sFMC5w0
C# + Oracleで自社内向け業務アプリ作ることになったんだけど、..net coreでなく、net frameworkのWinFormsでいいよね?
ユーザーはせいぜい1200人程度なんだけど、.net coreランタイム入れる手間を考えたくない。

WinFormsって結構大きなデメリットになったりする?
0019デフォルトの名無しさん (ワッチョイ 2af9-aAvj)
垢版 |
2019/10/09(水) 16:45:47.71ID:KnJFPOSX0
Formで複数のNumericUpDownを使ってます
値の変化はValueChangedイベントを使用してます

あるNumericUpDownを変化すると別のも連動します
値を変える場合一時的にイベントハンドラを無効にしてます

今は-=で無効にしてますが他にイベントハンドラを無効にする方法はありますか?
0023デフォルトの名無しさん (ドコグロ MM12-6eFW)
垢版 |
2019/10/09(水) 20:36:12.50ID:mYLA6NTyM
Win限定なら作れる
でも現実にはある程度のユーザー数のある業務アプリなら.NET Framework の方が遥かに配布は楽だよ
ClickOnceが使えるからね
.NET CoreはSCDができるのはいいけど、配布や更新に関して良くも悪くも単なるexeができる以上のサポートは何もない
ヘタにzipで配っちゃったら後で地獄を見ることになる
0024デフォルトの名無しさん (ドコグロ MM12-6eFW)
垢版 |
2019/10/09(水) 20:42:22.99ID:mYLA6NTyM
あと、今から業務アプリを新規に作るんならそもそもクライアントアプリではなくWebにすべきだ
Webなら配布の心配なんか最初から要らないし、.NET開発におけるメインストリームだから情報も豊富だし将来性もある
0027デフォルトの名無しさん (ワッチョイ 9701-UsEV)
垢版 |
2019/10/10(木) 11:00:47.70ID:EXU1k5cj0
質問なんですが
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の再読み込み再描画でうまい方法あるでしょうか?
0030デフォルトの名無しさん (ワントンキン MM7f-IJsX)
垢版 |
2019/10/10(木) 19:37:58.48ID:+cMNiUZhM
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の値を取得できるでしょうか。
0031デフォルトの名無しさん (ワイーワ2 FFdf-1wBF)
垢版 |
2019/10/10(木) 19:39:53.55ID:i+8+28k+F
・extBox txt = (TextBox)(rw.Cells[2]).Controls[0];
0033デフォルトの名無しさん (ワッチョイ ffa7-NJTS)
垢版 |
2019/10/10(木) 21:29:45.48ID:kk1CdJ+b0
ProcessクラスにはDispose()があるようですが、
var processes = Process.GetProcesses();
とした時点で上記のProcess[]内のProcessたちを全てDispose()しないとメモリリークなどしてしまうのでしょうか?
それとも実際にハンドルなどを参照したものだけDispose()すれば良いのでしょうか?
0034デフォルトの名無しさん (アウアウウー Sa5b-AFDN)
垢版 |
2019/10/10(木) 21:39:45.74ID:afa4sCIxa
>>33
https://referencesource.microsoft.com/#System/services/monitoring/system/diagnosticts/Process.cs,1554
ReferenceSourceを見ると
GetProcessesByName()が内部でGetProcesses()を使っていて、それの戻り値配列に使わない場合はDispose()しているから
GetProcesses()を直接呼び出している場合でも戻り値配列の各ProcessをDispose()したほうが良さそう

GC管理下にあるからDisposeを呼び忘れていても、ファイナライザが呼び出されて少なくともメモリーは回収されるとは思う
0036デフォルトの名無しさん (ワッチョイ 976e-qVzB)
垢版 |
2019/10/10(木) 21:51:48.13ID:IMCrZqO+0
クラスA内にインスタンスメソッドBがあったとして、長くなってしまったから一部をメソッドCとして外に出すとします
このCはBから呼び出される以外どこからも参照されません。本当にちょっと分離するためだけに分けているのです
このときCの修飾子はどうするのがいいのでしょうか。publicは論外として、ただ単にprivateでいいんですかね
staticとかつけた方がいいですか?クラス内で変な使われ方するのを防いだ方がいいかなとか思ったのですが
0037デフォルトの名無しさん (ワッチョイ 7717-NJTS)
垢版 |
2019/10/10(木) 22:11:44.95ID:IquandTc0
そのソースを自分しか触らないのであればprivateでいいと思う
自分で作っているんだから変な使われ方をされることもないだろ?

もし他の開発者が触る可能性があるんならローカル関数を使えばOK
0038デフォルトの名無しさん (ワッチョイ 9fad-vnAR)
垢版 |
2019/10/10(木) 22:18:06.84ID:BXM3vcse0
privateにしてコメントに注意書きしておけばいいと思うが
メソッド名の頭にアンダースコアつけるとか
DoSomethingFromBOnly()みたいな名前にしておくとか
0040デフォルトの名無しさん (アウアウウー Sa5b-YqqQ)
垢版 |
2019/10/10(木) 22:26:58.12ID:PsSxAeUca
>>36
普通にprivateにすればOK。
誤用されるリスクは分割したメソッドに固有の問題じゃない。
それは命名と抽象化が不適切ならどのメソッドにも起こりうる。
だから分割したら誤用されるんじゃないか、って発想はかなり変だ。

staticはインスタンスメンバーを使わないなら付けるべきだが、付けたからって
誤用されるリスクが減るわけじゃない。

ローカル関数は、

(1) 分割したメソッドを何度も呼び出す。
(2) その時に必ず同じ変数を引数として渡す(それが冗長に感じる)

こういうケースじゃなきゃ積極的に使う理由はない気がする。
0041デフォルトの名無しさん (ワッチョイ 9f79-NJTS)
垢版 |
2019/10/10(木) 23:44:04.64ID:a+kHg1ZD0
メソッドBからしか正常に動作しないメソッドCという構図ならそもそも設計が怪しい
メソッドB以外から使われることがないだろうくらいの感じなら
万一使われても別に困らないしprivateで問題ない
0043デフォルトの名無しさん (ワッチョイ 1f2d-epSy)
垢版 |
2019/10/10(木) 23:51:17.44ID:mQn3Hgbj0
グローバルおじさんが来たな
0045デフォルトの名無しさん (ワッチョイ 1f2d-epSy)
垢版 |
2019/10/10(木) 23:58:46.54ID:mQn3Hgbj0
>>44
でもまあ拡張性に優れてないのは元からっぽいから、分けて書くことに始まった問題じゃないじゃん?
0047デフォルトの名無しさん (ワッチョイ f761-GP3X)
垢版 |
2019/10/11(金) 00:18:46.89ID:vfhfRP3v0
>>39のケースを解決しようととりあえずprotectedにすればいいと思うだろ?

ところがメソッドB2の処理の途中に
クラスXの処理を絡ませなければならないことになった
しかし、クラスA2はクラスXを呼び出すと循環参照になってしまうためそれができない

なのでクラスEにメソッドB3を作成することになった

ときにメソッドCはprivateでは呼び出すことができない

ここまで解決しようとするとメソッドCはpublicにしておくしかない

そしてこれはよくあることだ
0049デフォルトの名無しさん (ワッチョイ 17da-IE9o)
垢版 |
2019/10/11(金) 06:13:02.24ID:YbeJbbo90
皆さんは、Windowsノートパソコンで開発されてるのでしょうか?
それともsurface?MacBook Pro?iPad Pro?

プログラミング用にMacBookをすすめるサイトをよく見ますがC#ではやはりWindows機?
個人的にはThinkPadかなと思ってますが
皆さんはどんなもんですか
0051デフォルトの名無しさん (ドコグロ MM9b-Kkga)
垢版 |
2019/10/11(金) 07:23:14.81ID:e5VBdiYBM
>>47
> そしてこれはよくあることだ
ねーよ
よくあるとしたらお前の設計力が無さすぎ
そもそも
> メソッドBをちょっと変えた
> メソッドB2を作りたいときに
の時にBからB2をコピペして改変する時点でアホ丸出し
0053デフォルトの名無しさん (ドコグロ MM9b-Kkga)
垢版 |
2019/10/11(金) 08:18:01.09ID:e5VBdiYBM
>>52
アホすぎる…
クラスAをベースクラスにして変更部分をvirtualで差し替えてA1(これが今までのA)とA2を作る
変更部分にCを呼ぶコードがあるならCはクラスA1にだけあればいい
変更部分にCを呼ぶコードがないならCはクラスAに置いとけばいい
0055デフォルトの名無しさん (アウアウウー Sa5b-IE9o)
垢版 |
2019/10/11(金) 08:24:45.95ID:blacN5wca
>>50
うぅ・・
0056デフォルトの名無しさん (ワッチョイ ffa7-NJTS)
垢版 |
2019/10/11(金) 08:43:13.37ID:Q3FyvZZg0
今開発中のもので初めて例外を補足しない強制終了が起こったのですが、原因としては唯一のunsafeであるstackallocだと思われます
var stack = count <= 20 ? stackalloc ulong[count] : new ulong[count];
動的なサイズですが上記のように一応サイズ制限はしていたのですが、ulong[20](160byte)程度でもスタックオーバーフローは起こり得るんでしょうか?
0057デフォルトの名無しさん (ドコグロ MM9b-Kkga)
垢版 |
2019/10/11(金) 08:56:19.70ID:e5VBdiYBM
>>54
ちょっとは勉強しろよ...
両方の継承先で呼ぶ必要があるならベースに置けばいい
どっちか片方だけでいいなら必要とする継承先に置けばいいだけ
まともにコード書いたことないのか?
0066デフォルトの名無しさん (アウアウクー MMcb-t9WR)
垢版 |
2019/10/11(金) 13:49:55.26ID:R9rR1P0/M
古いコードを見ているのですが
if (false) {// なにか処理}
がたっくさんあるんです。
到達できないコードが検出されましたって大量に出て当たり前だよ!って

仮に何か意味があるとしたらどんな理由が考えられるでしょうか
全部消せと思うのですが何かわたしの知らないテクニックだったらまずいですし
0072デフォルトの名無しさん (ワッチョイ 9701-UsEV)
垢版 |
2019/10/11(金) 16:55:31.32ID:BNgoH63S0
Properties.Settings.Defaultについて教えてください
DataGridViewのセル幅の設定を保存したいのですが、いい方法はあるでしょうか?

セルが20個ほど並んでるのですが、Settings.SettingsにはInt[]の配列が選べないし
プロパティバインディングも項目がありません、たくさんのIntを保存するにはどうしたらよいでしょか?
0073デフォルトの名無しさん (アウアウウー Sa5b-YqqQ)
垢版 |
2019/10/11(金) 16:55:34.98ID:Qe/y/ERba
>>66
謎だねw
#ifディレクティブやコメントアウトを選択しなかった理由は
IDEでシンボル検索した時に引っかかるようにしたかったから、とかも考えられるけど、
まあ多分単純に書いた人がアホなだけだろうw

仮にそうう理由があるとしてもfalseなんてリテラルをそのまま書くのは意味が分からん
0079デフォルトの名無しさん (ワッチョイ 9701-UsEV)
垢版 |
2019/10/11(金) 19:16:25.09ID:BNgoH63S0
>>75
レスサンクス
カンマで区切って、文字列を数値にして
今それっぽい事をやってみたんですが、なにやら挙動があやしい

>>76
れすさんくす
やはり文字列になってしまうのでしょか、int[]あれば便利なのに
0083デフォルトの名無しさん (ワッチョイ 9701-UsEV)
垢版 |
2019/10/11(金) 20:21:50.98ID:BNgoH63S0
>>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());
}
こんなんです、これは捨てます
009136 (ワッチョイ 976e-qVzB)
垢版 |
2019/10/11(金) 22:30:13.36ID:SS1U2hzP0
遅くなりましたがありがとうございました。とりあえずprivateでやってみようと思います。
しかし恥ずかしながらローカル関数って初めて知りました……こんなんあったのか
0099デフォルトの名無しさん (ワッチョイ 97ad-Gs6/)
垢版 |
2019/10/12(土) 11:45:16.39ID:vesGJIfT0
Java 用語だったのか。 < ローカルクラス
クラス内だけじゃなくてメソッド内でも作れるみたいだけど。
匿名クラスは無名クラスだと思ってた自分。


この流れでしょうもないことを聞いてみる。

static なメンバ変数の修飾子というか、
static でないメンバ変数の this.[変数名] の this に当たるようなのってなにかないですか。
[クラス名].[変数名] で ok なのだけど、[クラス名] の部分を固定でやる方法ないかなと。
0113デフォルトの名無しさん (アウアウイー Sacb-FzDa)
垢版 |
2019/10/13(日) 11:55:56.33ID:f3TGJJSYa
えーそんなわけないでしょと思って確認したら
ColumnsのDataGridViewColumnCollectionは非ジェネリクスのIListしか実装してないのか・・・
DataGridViewってVS2005以前の書き方で実装されてるのね

となると、かっこ悪いけどキャストをかませて
for (var c in DataGridView1.Columns) { (c as DataGridViewColumn).MinimumWidth=20; }
と書くくらいしかないか、>>103のとおりDataGridView.Columnsを変数にするくらいしかなさそう
0115デフォルトの名無しさん (ワッチョイ 9701-Wib4)
垢版 |
2019/10/13(日) 12:28:10.86ID:Fykc0AcJ0
抽象クラスとインターフェースの使い分けのコツを具体例で教えて下さい!
0118デフォルトの名無しさん (アウアウウー Sa5b-Cvo3)
垢版 |
2019/10/13(日) 12:43:25.13ID:2Iz5cpana
>>116
使い分ける必要はない
常にインターフェイスを使う、でいいよ
抽象クラスはインターフェイスを使った上で、どうしても実装の大部分が重複してしまうような場合に稀に使うことがある、という程度のもの
全く使わなくても問題はない
0119デフォルトの名無しさん (ワッチョイ 97ad-Gs6/)
垢版 |
2019/10/13(日) 12:58:41.62ID:BB7naElC0
>>100
所属クラスを示す汎用のエイリアスのようなものがないかなーと。
でも using static ディレクティブ自体を知らなかったので勉強になりました。これを定義すれば結果として同じ事出来るし。

ありがとう。
0131デフォルトの名無しさん (ワッチョイ 7745-/roT)
垢版 |
2019/10/15(火) 20:41:28.27ID:5pSAXFzm0
1ヶ月位VBAを触って今日Visual Studio Express 2017をインストールしました
せっかくならVBAの癖が着く前に…と思ったのですが、VBAで書いたプログラムに互換性は無いでしょうか?
0132デフォルトの名無しさん (アウアウウー Sa5b-YqqQ)
垢版 |
2019/10/15(火) 20:52:55.04ID:Hz78fwHza
>>131
ここ、C#のスレだよw
VBAは20年前に死亡宣告されたVB6の親戚。
今のVisual Studioに入ってるVisual Basicとは似てるけど別物。
もちろんC#とは似ても似つかない
0136デフォルトの名無しさん (ワッチョイ ff7b-v59O)
垢版 |
2019/10/15(火) 21:15:31.52ID:n+UvEGVJ0
>>134
質問の内容が変わっているよね
VBAで作ったものはVB.Netに手直し程度で動かせるようになるものができる場合もあるけどC#は書き方も完全に別物
ここで聞くより自分のPCで動かしてみたほうが早い
0138デフォルトの名無しさん (アウアウウー Sa5b-YqqQ)
垢版 |
2019/10/15(火) 21:16:06.96ID:Hz78fwHza
>>134
C#を使えないなんて言ってないよw
VBAとC#は完全に別の言語だと言ってるだけ
VBAの知識はC#を覚える上でほとんど役に立たないよと
0139デフォルトの名無しさん (ワッチョイ 972d-epSy)
垢版 |
2019/10/15(火) 21:20:18.71ID:zMbku3w90
用語と名付けルールについていくつか教えてください
まず、class Asdf{}の入れた物(Asdf asdf; でいうasdf)は、何と呼べばいいんですか?変数でいいのでしょうか?
また、Asdfの入ったものを自動プロパティで宣言したい場合、一文字めを大文字にすべきなのでしょうか?
Asdf Asdf{get; set;}なのか、Asdf asdf{get; set;}なのかどちらが正しいのでしょうか
0142デフォルトの名無しさん (ワッチョイ 972d-epSy)
垢版 |
2019/10/15(火) 22:44:41.51ID:zMbku3w90
>>140
ありがとうございます
大文字かどうかは、クラス名とプロパティ名が一緒になってしまっていいのか結構疑問に思っていたのでスッキリしました
0143デフォルトの名無しさん (ワッチョイ 1663-GUq/)
垢版 |
2019/10/17(木) 01:03:06.25ID:GTpPRCCe0
Pythonでは文字列をコマンドとして実行するのにevalとexecの2つあるみたいですが
C#で文字列をコマンドとして実行するには、eval以外の関数はありますか?
0145デフォルトの名無しさん (ワイーワ2 FF6a-uHRg)
垢版 |
2019/10/17(木) 09:37:45.19ID:ewN8FeZ7F
subprocess.popen
subprocess.call
subprocess.call_hogehoge
もっとあるぞ
0146デフォルトの名無しさん (ワッチョイ 5fda-+VEO)
垢版 |
2019/10/17(木) 11:49:09.47ID:qkwcuRdz0
フォーム間でのデータの受け渡しを行うクールな方法を教えて下さい。
今は以下の2通りの方法ででやっています。
@互いの公開プロパティ(public get / private set)を参照しあう。
 (互いに相手フォームへの参照を通じて取得するので疎結合になり切れていない)
Aデータ保持用クラスを作って、そのインスタンスを参照する。
 (データ保持用クラスが増えまくって、だんだん管理困難になりそう)
0149デフォルトの名無しさん (ワッチョイ 9242-S3Tg)
垢版 |
2019/10/17(木) 12:38:06.93ID:p0JdpBwB0
WpfやUWPなどではDIコンテナってものを使うのが流行りだが、WindowsFormsでも存在するそうだ
こっちは使ったことがないからお薦めはわからんがググって探してみるといい

まあクールってことならWindowsForms捨てるのも一つだね
0151デフォルトの名無しさん (ドコグロ MMea-tIsl)
垢版 |
2019/10/17(木) 13:34:04.59ID:gr44XWYWM
>>149
WPFやUWP自体がほぼ全くと言っていいほど使われていないのに流行りも何も
DIコンテナは主にWebで利用されるもので、デスクトップアプリではあまり使われないよ
アプリの起動を遅くする原因になりやすいし、エンドユーザーにバイナリを直接配布するタイプのアプリではそもそも実装を差し替えたいというニーズ自体が稀だからね
0153デフォルトの名無しさん (ワッチョイ e338-m7UD)
垢版 |
2019/10/17(木) 15:44:16.62ID:U3fOiqzQ0
>>146
クールな方法というか堅実・定石な方法
フォーム間のデータのやり取りならA

相手のフォームに依存するとテスト時や改修時に困るでしょ
原則として相手の画面やクラスの事は知らないに越したことは無い

その設計でもデータ保持用クラスの管理が大変になることは無い
管理が大変になる場合は設計がおかしい
画面遷移の組合せ数分クラス作るとかアホなことすれば大変だろうけど
0154デフォルトの名無しさん (ワッチョイ 16a7-S3Tg)
垢版 |
2019/10/17(木) 17:38:31.11ID:xrf7PluH0
wpfのCheckBoxについてですが、Contentに文字を設定するとその文字の表示範囲もチェックオンオフの感知範囲になってしまいます
これを無効にして純粋にチェックボックスの□のみをクリック範囲にすることはできないのでしょうか?
CheckBoxのContentに文字を設定するのではなく、横にTextBlockを置くなどしないと無理でしょうか?
0156デフォルトの名無しさん (ワッチョイ 5fda-S3Tg)
垢版 |
2019/10/17(木) 17:47:00.63ID:LBezDrpM0
>>154
手段としてはその通りだと思う。

しかし、あのちっさいチェックボックスに正確にマウスを当てないと反応しないってのは、
使い勝手からするとどうかと思う。誤クリックが多いというなら、そもそもの配置場所が悪い
0157デフォルトの名無しさん (アウアウウー Sa43-ptFq)
垢版 |
2019/10/17(木) 17:49:21.17ID:f5CxH478a
>>154
PreviewMouseDownイベントを追加して
e.OriginalSourceからVisualTreeHelper.GetParent()でVisualTreeを親方向にたどっていき
途中に"checkBoxBorder"というNameのBorderがあればe.Handled=true;で無効化出来るかもしれない
出来るかもしれないが一般的にCheckBoxはテキスト部分をクリックしてもオンオフ出来るものだから
その一般的な挙動を逸脱するよっぽどの理由がなければ止めておいたほうがいい
0158デフォルトの名無しさん (ワッチョイ 16a7-S3Tg)
垢版 |
2019/10/17(木) 18:14:20.41ID:xrf7PluH0
>>156>157
ありがとうございます
具体的にはListBox内にCheckBoxを配置しており、チェックとは別にListBoxから選択時に多少のインフォメーションを表示するといった形にしたいためContentも含めると誤クリックが発生してしまいます
とりあえずは文字とCheckBoxは分離する方向でやってみたいと思います
0159デフォルトの名無しさん (ワッチョイ f345-UkKt)
垢版 |
2019/10/17(木) 19:36:38.52ID:ukHDmGyB0
先日C#を始めたものです
Hello Worldを記述出来ました
エクセル等のオフィスソフトに対応している初心者向けのサイトは無いでしょうか?
よろしくお願いします
0167デフォルトの名無しさん (ワッチョイ 1ee9-1jLk)
垢版 |
2019/10/17(木) 23:18:37.31ID:fKr8aC1m0
プロパティで、StringをDateTimeのようにnull許容できるようにしたいのですが、可能でしょうか?

public DateTime? test1 { get; set; } ← 可
public String? test2 { get; set; } ← 不可

DapperでDB操作してるのですが、DBゆえにnullがあるのでどうしたものかと
0168デフォルトの名無しさん (アウアウイー Sa87-sprL)
垢版 |
2019/10/17(木) 23:30:47.28ID:+xa644SFa
C#8.0の新しい文法を使う意図だったら「#nullable enable」のディレクティブをつけないとnull許容参照型にならないよ
そうでなければ、stringは参照型だから?をつけずとも普通にnull許容
0176デフォルトの名無しさん (ワッチョイ 16b4-ARNK)
垢版 |
2019/10/18(金) 21:44:11.74ID:nML+rjlo0
データを取得したんですが
第三正規系までできません。

こちらのデータを第三正規系にお願いします。
第一正規系はやりました。

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,はま寿司,漬け。まずい。食えたもんじゃない,汚い,漬け,小さい
0191デフォルトの名無しさん (ワッチョイ 7f2d-BO72)
垢版 |
2019/10/19(土) 18:32:57.19ID:BH051H7O0
すまんが、インターフェイスとオートプロパティーとがよくわから人だけどさあ
interface IPerson{string Name();}
class Person : IPerson {public string Name{get=>"Taro";}}
これじゃなんでIPerson.Name();を実装したことにならないの?正しくはどうすればよかんべえ?
0192デフォルトの名無しさん (ワッチョイ 7f2d-BO72)
垢版 |
2019/10/19(土) 18:36:03.37ID:BH051H7O0
自分で気づいて今インターフェイスをstring Name{get;}にしてみたらできた
すまん、191のは無視してくれ・・・・
0195デフォルトの名無しさん (ワッチョイ e334-V+wO)
垢版 |
2019/10/21(月) 20:48:34.93ID:Q380rRZI0
ListViewをLargeImageListとして使って、かつ画像は非同期的に読み込んで反映させていきたいんだけど、
ImageListを変更しても画像が差し変わらない。アイテムを選択したりすると変わる。
差し替え後に強制的に反映させるにはListViewをRefleshするしかない?
0197デフォルトの名無しさん (ワッチョイ 4bda-PVzv)
垢版 |
2019/10/21(月) 22:36:01.36ID:gFaZXUyV0
RichTextBox.Textプロパティに数MBの文字列をセットすると
5秒くらいフォームがフリーズするので
Task/async/await的なコードを試したのですが
別スレッドからコントロールにはアクセスできないと怒られ
それではとInvokeメソッドを使ってみるも
今度はアクセスで怒られない代わりにまたフリーズ。

上手いこと非同期でTextプロパティにセットする
方法はありますかね。
0198デフォルトの名無しさん (ワッチョイ 167b-836U)
垢版 |
2019/10/21(月) 22:46:01.22ID:/X8txQrc0
>>197
数MBの文字列程度でフリーズした経験はないけど、その環境でフリーズするのなら非同期にしても解決はしないよ
Invoke使おうがその文字列の処理にそれだけかかるのだからどうしようもない
非同期にするのは処理中にキャンセルするとか他のGUIからの入力処理をする目的じゃないと
0204デフォルトの名無しさん (アウアウウー Sa43-WFp/)
垢版 |
2019/10/22(火) 14:13:07.80ID:d9ySxcs9a
UIスレッド自体が輻輳してるんだからそんなことしても無意味w

別のプロセスか別のUIスレッドで動作させるか、
あるいは小分けにしてちょっとずつ更新するしかないと思うよ。
0205デフォルトの名無しさん (ワッチョイ 16a7-S3Tg)
垢版 |
2019/10/22(火) 19:15:02.64ID:ZcCp4/Eg0
クラス継承の意義がイマイチ分かりません
継承したいクラスをフィールドに持たせ、共通して呼び出したいものはインターフェースとして定義するではダメなのでしょうか?
単にその両者をいっぺんにやるためにあるという理解で良いんでしょうか?
0208デフォルトの名無しさん (アウアウウー Sa43-WFp/)
垢版 |
2019/10/22(火) 20:19:18.17ID:d9ySxcs9a
アポロ13って映画に「何のために作られたかではなく、何に使えるかが重要」って台詞が出てくるけど、
意義とか考えるのは(重要だとは思うけど)後回しにして、どういう使い方ができるかに
注視した方がいいよw

あと、オブジェクト指向関係で教条主義的なことを言う奴の話は眉に唾して聞いた方がいいw
これほんと
0215デフォルトの名無しさん (ワッチョイ d201-4js2)
垢版 |
2019/10/22(火) 22:38:30.26ID:QfoZv31s0
>>205
例えばフレームワークが用意してるControllerクラスを継承して20個くらい個別のコントローラーを作る場合と
個別のコントローラーにControllerクラスを持たせて呼び出しを委譲できるようにする場合
前者はカスタマイズしたい部分だけ書けばいいけど
後者はControllerの機能を呼び出すためにはすべてのクラスに委譲メソッドを用意する必要がある

Controllerのメソッドを20個呼び出したいなら20x20で400個委譲メソッド定義をしないといけないしテストもしないといけない
自動生成することも可能だけどそれを考慮しても必要になる労力とコンポジションで得られる柔軟性が見合わない

それぞれメリット・デメリットあるからそれを判断して使い分けるのが良いと思う
0220デフォルトの名無しさん (ワッチョイ d62d-BO72)
垢版 |
2019/10/23(水) 01:24:57.24ID:m9ZvUGV10
List型からカンマ区切りの文字列にしたいのですが、先頭や最後にカンマがくっついて欲しくありません
こう言う場合ってどう書くのですか?

string s = "";
int i = 0;
foreach(var l in data){
   if(i == 0) i = 1;
   else s += ",";
   s += l.ToString();
}

自分なりにも書いてみたのですがなんか素人感が半端ないです
どうか正しいかっこいい書き方を教えてください、お願いします
0222デフォルトの名無しさん (ワッチョイ 670c-2cJs)
垢版 |
2019/10/23(水) 08:41:29.15ID:cIthmx8S0
Goは>>205のような考えで継承廃止したんじゃなかったっけ?
コーディングコスト削減メリットよりも階層複雑化によるデメリットの方が大きいから、やるならインターフェースでやれって考え方だったと思う
天下のグーグルがそう言ってるからには継承が悪という考えもあながち全否定は出来ない
0226デフォルトの名無しさん (ワッチョイ c67c-ptFq)
垢版 |
2019/10/23(水) 09:57:02.37ID:N3BHKY3G0
Rangeということは「最小値と最大値」の範囲内かどうかなわけで
nullが範囲外なのは自明だからそもそも意味がなくね?
nullは特別に範囲内ってのなら「最小値と最大値」であるRangeじゃなくて他の方法で表現せざるを得ないよね
0227デフォルトの名無しさん (ワッチョイ 23da-a8RP)
垢版 |
2019/10/23(水) 10:43:58.06ID:s4ZmhUIr0
>>226
単純にnull許容型にrangeの属性を付与できるか否かってだけが知りたい
それを調べようとしてもmsdnに記載が見つからないって話

これはtestが0-100になるように有効だろうけど
[range(0,100)]
int test

このrangeは有効なのか?って話
int?にはrangeは無効で101とか入れれますよーとかはないよねって調べたい
[range(0,100)]
int? test
0230デフォルトの名無しさん (オッペケ Sr47-g1So)
垢版 |
2019/10/23(水) 12:06:02.89ID:uTmD95wkr
>>229
できる出来ないの基準は?
既存コントロール使わないで全部時前で処理するなら、出来ないことが重い浮かばない
0232デフォルトの名無しさん (ワッチョイ e338-m7UD)
垢版 |
2019/10/23(水) 12:24:26.05ID:rCWJ/rTC0
原理的に出来ないことは無いが大変さが違う

それこそMVCで組みづらいとか
EFとの相性とか
WebAPI作りたいとか
他言語や環境と混ぜづらいとか
つぶしが効かないとか

まあ新規でWebFormsはやめとけと
0235デフォルトの名無しさん (ワッチョイ d62d-BO72)
垢版 |
2019/10/23(水) 13:28:03.53ID:m9ZvUGV10
>>221
>>223
ありがとう
こんなの全然知らなかったよ
0238デフォルトの名無しさん (ドコグロ MM2f-tIsl)
垢版 |
2019/10/23(水) 22:41:24.14ID:MpJkuZYiM
>>237
ConcurrentListが無いのは、Listは外部ロックを使わない並行処理との相性が悪いからだろう
追加と参照のみならいいが、削除や途中への挿入があるとインデックスがほとんど意味を持たなくなってしまう
インデックスが指してる要素が他のスレッドによる変更の影響で突然コロコロ変わったら使い物にならないのは容易に想像できるだろ?
SynchronizedCollectionを使うとかそういう話じゃなくて、Listインターフェイスの設計が本質的に並行処理と相容れないんだよ
0239デフォルトの名無しさん (ワッチョイ 638a-mjLV)
垢版 |
2019/10/24(木) 08:41:52.53ID:vvI6h2Gc0
あるソフト使ってて、これ使いたいなって機能があるんだけど、なんて検索かけたらいいのか分からないので知っている人いたら教えてください。
WindowsフォームアプリでVisualStudio2015で開発しています。


[欲しい機能]
例えばWindow内が横3段に分かれいるとすると

------------△---------------

みたいに境界が表示されててそこをクリックすると部分的に隠したり、表示させたりできる機能



今作ってるアプリが監視系で画面上に常駐するので、出来るだけWindow内の邪魔なボタンとかは隠しておきたいのでこの機能が欲しいです。
知ってる方いたらよろしくお願いします。
0244デフォルトの名無しさん (ドコグロ MM87-20LG)
垢版 |
2019/10/24(木) 10:07:31.16ID:/Cd29/CTM
>>243
シングルスレッドでの同期処理ならプログラマが意図しないタイミングで変更が加えられる可能性は少ないだろう
そもそも途中挿入しないならConcurrentBagでいいよね
自分で答え出てるじゃん
0248デフォルトの名無しさん (アウアウウー Sa27-AEvr)
垢版 |
2019/10/24(木) 10:58:17.20ID:xs21harXa
>>239
XPの時代のエクスプローラーのタスクパネルみたいなUIだと思うけど
たぶん標準では存在しない

折り畳みできるコンテナを自分で作れば、それを別のPanelの中に入れ子にして
AnchorとDockをうまく設定すれば似たようなことは一応できると思う。

PanelじゃなくてFlowLayoutPanelを使ってもいいかもしれないが、
たぶんかえって使いづらくなりそう
0249デフォルトの名無しさん (ワッチョイ d38d-mjLV)
垢版 |
2019/10/24(木) 10:58:42.47ID:ey5VOEQr0
>>241
そうそう折りたたみって言葉がしっくりきます。


試しに「折りたたみ panel」あたりで検索したらやりたい事が出来そうなサイトが見つけられました。
SplitContainerとクリックイベントを使ってどうにか出来そうです。

また、境界部分にも三角形△などの目印を付けるやり方が載ってるサイトも見つかりました。


いいヒントになりました、ありがとうございます^^
0251デフォルトの名無しさん (ワイーワ2 FFdf-Tlcr)
垢版 |
2019/10/24(木) 11:57:49.13ID:ABhN6CSmF
>>239
Collapse
Accordion
0252デフォルトの名無しさん (ワッチョイ e36e-cmPQ)
垢版 |
2019/10/24(木) 21:14:55.46ID:00cf/jHw0
頭に0個の参照って表示されてる関数が無数にあるんですが、これ要するに全く使われてないってことですよね
全部消してしまいたい……と思ったのですが実行する中でその関数が呼び出されるような可能性ってあったりするんでしょうか
0255デフォルトの名無しさん (ワッチョイ 3342-roNU)
垢版 |
2019/10/24(木) 22:06:02.66ID:Eph2jaDU0
複数のパネルをドラッグドロップできるようにしたんだけど
マウスが別のパネルに重なったときにパネルがいれかわってしまうんだけど
これを防ぐにはどうしたらいい?
0257デフォルトの名無しさん (ワッチョイ ffa7-ldkf)
垢版 |
2019/10/24(木) 22:17:00.79ID:WLXJ5XGy0
>>255
マウスダウンで「掴む」じゃん
マウスドラッグで「移動」するじゃん
マウスアップで「置く」じゃん

ドラッグ中の処理は移動なのにどうしてマウスダウンで掴んだやつ
以外が動いちゃうん?
0258デフォルトの名無しさん (ワッチョイ b37b-pWYb)
垢版 |
2019/10/24(木) 23:01:06.74ID:yaJ1dO+n0
マウスがパネルに触れた時点でフォーカス変わったりしているとかだろ
最低限の動きするミニマムコード使って検証する方がここで聞くより解決しやすいと思うがね
そこでわからなかったらそのミニマムコード出してまた質問したらここの人も答えやすい
0261デフォルトの名無しさん (ワッチョイ cf2d-KmKR)
垢版 |
2019/10/25(金) 22:28:16.88ID:7rgagi6Z0
List<(string, int)> list;があった場合、listの中からlist.item2が最大の要素(string, int)を得るにはどうすればいいのですか?
var l = list.Max(x=>x.Item2);みたいにしたいのですが、int型が帰ってきてしまいます
0265デフォルトの名無しさん (アウアウウー Sa27-wnNP)
垢版 |
2019/10/25(金) 23:42:07.16ID:5pdqBhsBa
経験上、こういう汎用的すぎるユーティリティ関数を自作して多用するのはお勧めしない
個人開発ならいいけど、多人数での開発になると新しいメンバーとの間で記述方法に差異を有む原因になり、結果的に負債化していくんだよ
ダサくてもこういうのは毎回ベタに書いたほうがいい
0269デフォルトの名無しさん (ワッチョイ cf2d-KmKR)
垢版 |
2019/10/26(土) 00:58:09.61ID:rff7tW+R0
>>262-265
どの方法も一見正攻法ではないように見えるため、人に教えてもらわないことには勇気を出して書けませんでした
ありがとうございます
0275デフォルトの名無しさん (ワッチョイ c354-qX8c)
垢版 |
2019/10/27(日) 06:36:34.10ID:xM0noxLs0
>>261

list.Aggregate( (result, next) => result.Item2 > next.Item2 ? result : next );

O(n) で一度しか走査しない。
ただし、複数該当しても 1 つしか返さないし、Aggregate メソッドは LINQ to Entities 非対応。
0276デフォルトの名無しさん (オイコラミネオ MM87-xJ/E)
垢版 |
2019/10/27(日) 10:39:45.76ID:5GZQ4gBgM
質問はこっちでいいんかな?
webviewってWebBrowserのGetElementのような事ってできないんですかね?
テキストに入力したりボタン押したりしたいんですけど、検索してもなかなか見つからないんです
誰か教えてください!
0282デフォルトの名無しさん (オイコラミネオ MM87-xJ/E)
垢版 |
2019/10/27(日) 13:46:09.61ID:5GZQ4gBgM
なるほど、JavaScript書けば操作できるわけですね
やってみます!
ありがとうございます

>>281
WebBrowserだと、なぜかjQuery使ってるサイトでエラー出るんですよね
レジストリ加えてie11で動くようにはしてるんですけどjQueryで引っかかるんです
でWebViewでと思って質問した次第なんです
0284デフォルトの名無しさん (ワッチョイ cf2d-KmKR)
垢版 |
2019/10/27(日) 15:37:26.99ID:gq/FPXPl0
>>275
ありがとう
これ、SQLの感覚とはえらい違うのね・・・・
0297デフォルトの名無しさん (オッペケ Sr47-A5aQ)
垢版 |
2019/10/29(火) 11:13:54.66ID:RhfnzEGer
ぶっちゃけC#の未来ってどうなの?
来年の.NET 5でクロスプラットフォーム化が加速するようだが
0299デフォルトの名無しさん (アウアウウー Sa27-AEvr)
垢版 |
2019/10/29(火) 12:03:29.65ID:xV/7zc0Da
クロスプラットフォーム化だのcoreだのは将来投資あるいは保険みたいなものじゃないの?
本気でそっちの方にいく将来像を持っているわけではないと思う。

UWPもぜんぜん普及しないし、
建前はともかく実態的には.NET Frameworkと一心同体という状態が
今後も続くんじゃないのかな

知らんけど
0305デフォルトの名無しさん (ドコグロ MMdf-wnNP)
垢版 |
2019/10/29(火) 19:27:34.78ID:fnWDg3A7M
米国だと内製が主流だから、受託じゃ怖くて使えないようなものも自己責任で比較的カジュアルに使える開発現場が多いんだよ
.NETの先端は、もはやOSS利用にいちいち申請が必要だったりするようなジャップ企業には縁のないものになってしまった
0309デフォルトの名無しさん (ドコグロ MMdf-wnNP)
垢版 |
2019/10/29(火) 20:01:15.15ID:fnWDg3A7M
>>308
MSはちゃんとアメリカに税金払ってるし、クラウドプロバイダによるOSSタダ乗り問題に対する姿勢などについてもMSは比較的真摯であり、そういう意味では確かに信用できる
しかしAWS, Azure両方を実業務において一年以上使った上で、サービスとしてはあらゆる面においてAWSの方が遥かに上だ
0311デフォルトの名無しさん (ドコグロ MMdf-wnNP)
垢版 |
2019/10/29(火) 20:16:08.34ID:fnWDg3A7M
>>310
AWSは一貫性が高いし、一度作ったサービスは責任を持って継続的に統合し続けるよね
Azureは思いつきのように低品質で他サービスともロクに統合されていないサービスを出してすぐに廃止したり「v2」が出てリプレースされるケースが多い
本当に馬鹿らしくなる
0314デフォルトの名無しさん (オッペケ Sr47-A5aQ)
垢版 |
2019/10/29(火) 21:46:56.72ID:RhfnzEGer
C#ってTwitterでの検索が困難だな
#が無視されてしまう
0317デフォルトの名無しさん (ワッチョイ 3342-roNU)
垢版 |
2019/10/30(水) 01:09:01.92ID:eibhOM1C0
formをスクロールバーでちょっと下にスクロールしてから
パネルを追加するとLocationのポイントが下にずれてしまいます
panel.Location = new Point(30, 60)
これがスクロールした画面を基準にしたポイントになるので
yの60がずれてしまいます
これを防ぐにはどうすればいいでしょうか
0326デフォルトの名無しさん (ワッチョイ 6fda-UUC+)
垢版 |
2019/10/30(水) 23:28:43.02ID:RGy19TUC0
>>85
じゃあマックはダメですね
0329デフォルトの名無しさん (ブーイモ MM27-ANgw)
垢版 |
2019/10/31(木) 09:20:44.08ID:SMoJlzw2M
OSが勝手にやるもんだろ
0332デフォルトの名無しさん (ブーイモ MM27-w9lH)
垢版 |
2019/10/31(木) 10:41:56.01ID:OU1pcY6zM
winformなんだけど
ひたすら流れてくるログを表示してくれる
フォームに埋め込めるコンソールウインドウみたいな
コントロールってないだろうか
折り返しとか最大保持行数とか設定できるやつ
0335デフォルトの名無しさん (アウアウウー Sa2f-jEuW)
垢版 |
2019/10/31(木) 12:28:32.03ID:mFefkbxQa
>>332
ないと思うけど、そんなのTextBoxでもRichTextBoxでも
新しい行を追加する時に既に「行数 ≧ 最大値」だったら
先に先頭行削除してから追加するだけと違うの?

何も難しくない気が
0336デフォルトの名無しさん (ワッチョイ 8a01-ODnH)
垢版 |
2019/10/31(木) 13:06:24.26ID:JXLI+jKB0
>>332
ConsoleControlってのでできそうだけど
ListView使って自分でやったほうが早そう

>>335
先頭行削除するときに先頭行以外の部分をコピーする必要があるから
ログの量とか速度が速いと困るかもしれない
0339デフォルトの名無しさん (アウアウウー Sa2f-jEuW)
垢版 |
2019/10/31(木) 13:37:40.30ID:mFefkbxQa
>>338
行数は上限があるんだから増えないのでは?w

それに速度が問題になるようなケースならリアルタイムで逐次的に表示更新する
意味ないのでは?

だーれも目で追えないと思うよw
0342デフォルトの名無しさん (ドコグロ MM0b-xbEI)
垢版 |
2019/10/31(木) 19:15:16.89ID:i5H6Qw2zM
>>340
お前は問題を履き違えている
Stringのコピーなんか人間の体感スケールで見ればそれ自体は大したコストではない
問題は、Stringの再作成時にテキストボックスの内容全体を更新しなければならないこと
0343デフォルトの名無しさん (アウアウウー Sa2f-jEuW)
垢版 |
2019/10/31(木) 19:39:52.83ID:mFefkbxQa
いや、速度がどうとか言う人がいたんで、
逐次的な表示更新が間に合わないなら
最新n件をキューにためておいてUIの都合でおっとり更新したらいいんじゃないか、
って言いたかったのでは?
0344デフォルトの名無しさん (ブーイモ MM27-w9lH)
垢版 |
2019/10/31(木) 20:04:31.91ID:UUndQwtgM
なんかいろいろすいません
テキスト系のコントロールだと全書き換えになって遅いし
List系だと折り返しがしづらいしで
表示だけに特化したコントロールはないかなと思ってました

表示と同時にログはファイルにも記録しているので
ドバッと来て追いきれない時はファイルでじっくり見ます
画面はあくまで気になるログが出ていないか
確認する程度のものです
0345デフォルトの名無しさん (ワッチョイ af17-qV4/)
垢版 |
2019/10/31(木) 20:17:16.88ID:K3Up5Amy0
「c# log viewer」とかでググって出てきた奴を片っ端から試す
もし満足できるものが無かったら自分でコントロール作った方が手っ取り早いと思う
ログのパースが不要なら簡単にできるでしょ
0350デフォルトの名無しさん (ブーイモ MM27-w9lH)
垢版 |
2019/10/31(木) 22:10:23.48ID:SVC1VZx2M
>>348
試してみたよ、速度はそこまで悪くなかった
ただ最新のログを表示してくれないので、以下のコードをtextrollに追加してみたんだけど
スクロールバーが激しく上下に移動して
バグったようにちらついてダメだった

log.SelectionStart = log.Text.Length;
            log.Focus();
            log.ScrollToCaret();

>>349
ありがとう試してみる
0351デフォルトの名無しさん (ワッチョイ 6b01-VuYh)
垢版 |
2019/10/31(木) 22:11:15.94ID:CJAalL950
>>330
さいきんはデスクトップアプリつくらないのか、よもまつだな
>>328
削除は危険だからなあ
>>331
さんくす、でもなにやらむずそう
>>333
さんくすね、十分簡単なんだけど、ゴミ箱に移すという基本的なことが標準でできないのかなと
>>334
そうそうそんなかんじで、ファイルを整理するのにゴミ箱ほしいなと
0356デフォルトの名無しさん (ブーイモ MM27-w9lH)
垢版 |
2019/10/31(木) 22:48:12.69ID:QvaaIFldM
>>349
試してみたよ
ログを追加したときに最新行を表示してくれる機能がなかった
中身は結局RitchTextBoxみたいだね
ログはどんどん溜まっていく一方で、古いログを消す機能は実装されてないみたいだった
なかなかこれってものはないもんだなぁ…
0357デフォルトの名無しさん (ワッチョイ de7b-wZJI)
垢版 |
2019/10/31(木) 22:52:53.11ID:6sTRo/Hz0
>>350
ScrollToCaret使わなくても組み替えて最新の行をAppendTextで出力するだけでいい
そもそもスクロールしない行数にしたらいい。80行にしてあるのは「この程度では遅くならない」例のためだけ
>スクロールバーが激しく上下に移動して
表示が早いからだよねそれ
0359デフォルトの名無しさん (アウアウウー Sa2f-jEuW)
垢版 |
2019/10/31(木) 23:07:55.77ID:mFefkbxQa
何を既に試して、その上でどういう要件が満たせないから困ってるのか、
最初から書いて欲しいよね

後出しで「それだとこういう不満がある」とか言われてもみんな気分悪くなるだけじゃないの
0360デフォルトの名無しさん (ワッチョイ 4aa7-kTP4)
垢版 |
2019/10/31(木) 23:18:32.99ID:Ipg5PEVm0
結局、ログがどうあったらいいかよくわかってないんだろ
そもそも「誰が」「どう使う」ためのログなのか?わかってなきゃ
この世に存在しない無敵のログ表示を求めて彷徨い歩くだけだ
0362デフォルトの名無しさん (ブーイモ MM27-w9lH)
垢版 |
2019/10/31(木) 23:48:40.87ID:IinI+zAtM
最初に言った通りコンソールウインドウみたいなのが欲しいんだよね
最新のログが一番下に表示されて、勝手にスクロールしていくような

ログが延々と流れてくるので保持行数は200行程度として
できるだけ軽いのが欲しいんだ
0364デフォルトの名無しさん (ワッチョイ 0be7-0B+f)
垢版 |
2019/11/01(金) 01:18:38.34ID:IqjPKLBG0
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万行になるとまともに変形しない
0366デフォルトの名無しさん (ワッチョイ caad-o2oR)
垢版 |
2019/11/01(金) 10:42:20.61ID:SS2XtcMO0
直近200行のリングバッファを表示するだけではダメなのか
2000,000行保持してまさか目視するわけじゃないよな
200行以前はファイルにでも吐いておけば
0367デフォルトの名無しさん (ワッチョイ 7b88-ORrh)
垢版 |
2019/11/01(金) 11:16:41.01ID:nKOXVm3I0
200行程度List<string>で保持して更新あるたびにaddとremoveして都度Textboxを更新でなんの問題も無いと思う
気になるならListをQueueにでもすればいい
ごちゃごちゃさせる程でもない単純な要件なんだから実装もそれに倣えばいい
0369デフォルトの名無しさん (アウアウウー Sa2f-jEuW)
垢版 |
2019/11/01(金) 18:49:44.29ID:oc3Xlll7a
>>332の件、ちょっと気になったのでTextBoxで試してみた

(a) SelectedTextを空文字で上書きして先頭の行を削除、
その後AppendTextで新しいログを追記

(b) Linesを一旦List<string>にコピーして先頭行の削除と
新しいログの追加を行った後、Linesに書き戻しキャレットを末尾に
移動しScrollToCaret

(a)の方法でやると確かにスクロールバーがプルプルするw
(b)の方法ならそれはほとんど起こらない(完全ではないみたいだが)

(a)の方法でも、先頭行を削る時に一気に10行とか削れば
そこまで気にならない印象
0370デフォルトの名無しさん (ワッチョイ de7b-wZJI)
垢版 |
2019/11/01(金) 20:09:54.53ID:BUUWKxub0
そもそも高速でログを流すのでなければ表示の切り替えはそんな目立たないと思うんだけど
>>369
(a) を参考に空文字で上書きするときにTextBoxからFocusを外してスクロールバーが動かないようにできないかと思ったけどうまくできなかったw
削除時にスクロール位置動かなければうまくいきそうだけど手段が他にすぐ思いつかない
他に思い付いたやり方は3つ
・AllocConsole()使ってコンソール画面を表示してそこにログを流す
 コンソール画面閉じるとプロセスも閉じるのでその対策が必要
・348にRichTextBoxを2つ用意して交互にバックグラウンドでスクロールさせた後に表示する
・348で最新のログを一番上に追加していく
0372デフォルトの名無しさん (ワッチョイ 6763-ORrh)
垢版 |
2019/11/02(土) 01:17:56.03ID:gWk8WKKS0
いや、難しくしてるのは意味のない要件だって
細部まで詳細に思惑通りに動くコントロールが要求されるなら1から全部作るしか無い
TextBox等のすでに提供されてるコントロールを使うならそれに則った要件に変えればいいだけ

内部の動作ログを画面上に出してほしい要件はちょいちょいあるけど、俺個人はいつも上部を最新にするかスクロールさせないかの仕様を取る
何なら画面のチラツキなんて目を瞑ることもあるし最新行への追従をさせないこともある
楽に実装したいからそういうコントロール使ってるんだもん

どうしても要件変えられないなら低レベルAPI使って描画制御からやりゃほとんど対応できる
対応しただけのコストに見合うメリットがあるかは知らん
クライアントの強い要望とか言われたらするしか無いだろうけど
0373デフォルトの名無しさん (ワッチョイ 6710-Dc2t)
垢版 |
2019/11/02(土) 07:08:12.27ID:Cj9wzs8u0
>>372
俺もDataGridViewにして上部を最新にしちゃうな
大体タイムスタンプの列あるし
0374デフォルトの名無しさん (ワッチョイ 0bad-Cnwx)
垢版 |
2019/11/02(土) 11:38:27.23ID:NJrq0tm30
そういえば昔、グリッドだかリストコントロール+それとは別のコントロールとして縦スクロールバーをつけて
擬似的にスクロール可能な全行表示コントロールを作ったことあった。
実際としてはグリッド・リストに一部のデータを表示しているだけってヤツね。

経験としては割に合わないからやめといた方がいいと思う。
0377デフォルトの名無しさん (ワッチョイ 8a01-ODnH)
垢版 |
2019/11/02(土) 18:59:15.75ID:t8MMHk4t0
>>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();
}
0387デフォルトの名無しさん (ワッチョイ 67d8-8pfq)
垢版 |
2019/11/04(月) 14:50:52.31ID:ZZvILvvT0
>>383,384,385
arrayから取り出して実行するところのコーディングが分かりません

void(*ptf[n])(void);
ptf[0] = func1;
ptf[1] = func2;
ptf[2] = func3;
...
(*ptf[i])();
こういうのをメゾットでやるには、マネージコードではどうすればいいんだろう?
0406デフォルトの名無しさん (ワッチョイ 6bda-tz1I)
垢版 |
2019/11/05(火) 14:36:36.98ID:5/2Yewwy0
WPF始めたばかりでThumbを使ってドラッグでコントロールを移動をしたかったんだけど
これってそもそも中にラベルやボタンを置けない仕様なのかな…?
とりあえずtemplateを使って無理矢理borderとbuttonを置いてみたけど
今度はborderからはDragStartedもDragDeltaもThumbに届くのに、buttonからは届かない

Thumbってどういう風に使うものなんですかね…
ウインドウのタイトルバー的な感じに置くものなのでしょうか
0408デフォルトの名無しさん (ワッチョイ 6bda-tz1I)
垢版 |
2019/11/05(火) 14:55:03.31ID:5/2Yewwy0
例えばラベルにThumbの機能を持たせようとするとどうしたらいいんだろう?

thumbのテンプレートにラベルを置いたとして、ラベルのテキストやbackgroundプロパティを
tumbのプロパティとして定義することはできるのかな…?
0410デフォルトの名無しさん (ワッチョイ 4e7c-a7m8)
垢版 |
2019/11/05(火) 15:12:25.39ID:F/FN86RY0
基本的にThumbってのは「マウスのドラッグで操作する」ことを表すもので
そのドラッグにどう意味づけするかはThumbではなくてThumbを持っている要素が決めるもの
スクロールバーならドラッグをスクロールとして扱うし
スライダーなら値の増減を表す
0411デフォルトの名無しさん (ワッチョイ 6bda-tz1I)
垢版 |
2019/11/05(火) 15:29:08.42ID:5/2Yewwy0
もしかして俺の理解がおかしいのかな

普通のウインドウみたいにタイトルバーをドラッグしてコントロールを動かしたい場合って

<dockpanel>
<thumb>
<label>

みたいにするものなのかな、それとも

<dockpanel>
<label>
<thumb>

が正しい?

本当は

<thumb>
<dockpanel>
<label>

みたいにしてdockpanelのボタンとか以外の場所は
ドラッグ移動可能にしたいのだけど…
0413デフォルトの名無しさん (ワッチョイ 4e7c-a7m8)
垢版 |
2019/11/05(火) 15:58:11.06ID:F/FN86RY0
正直全然説明が理解できんが
DockPanelをルートとしたウィンドウ内ウィンドウ的なのが存在してて
それのタイトルバー的なのをマウスで掴んで動かしたいってことでいいのか

まあThumbの出番は無いだろうな
0416デフォルトの名無しさん (ワッチョイ 0b6e-ANgw)
垢版 |
2019/11/05(火) 19:01:21.35ID:R3NaIBm20
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にもオブジェクトの参照持たせるのは不味いような気もします。
よろしくおねがいします
0417デフォルトの名無しさん (アウアウウー Sa2f-jEuW)
垢版 |
2019/11/05(火) 19:19:02.37ID:Ra2VTEEXa
>>416
あんまり教条主義的に考えない方がいいのでは?
特に事情がない限り

// ○○ファイを読み込んでこのインスタンスのフィールドとプロパティーを更新する
public void Load(string path)
{
  ....
}

とか、

// 〇〇ファイルから新しいインスタンスを作成
public static Person FromFile(string path)
{
  ....
}

こんなの方が使いやすいのでは?
0419デフォルトの名無しさん (ワッチョイ 3a2d-DXXI)
垢版 |
2019/11/05(火) 20:06:06.04ID:HWawPKHc0
>>416
C#を使用している限りでは、このコードでメモリリークの問題は起きないはずです
それでもどうしても心配だというなら弱参照にしてください
0420デフォルトの名無しさん (ワッチョイ 0b6e-ANgw)
垢版 |
2019/11/05(火) 21:59:36.96ID:R3NaIBm20
>>417
あーまぁ今回の例だとそうかもしれないですね。
ただ実際の開発だとxmlを読み込むんですけどちょっと処理が膨大で。読み込む先、今回で言うところのPersonクラスも相当でかいので分けないといかんだろと
0421デフォルトの名無しさん (ワッチョイ 8a01-ODnH)
垢版 |
2019/11/05(火) 22:21:14.48ID:rzC/SdAh0
>>416
正直どっちも勘弁してって感じ
インスタンス生成の責務をファクトリに割り当てる頻出パターンなので
ファクトリやファクトリメソッドのキーワードでググればいいと思う

ファクトリクラスはusing Personしても参照を持つ必要はない
0422デフォルトの名無しさん (ワッチョイ 0363-ORrh)
垢版 |
2019/11/05(火) 22:43:58.63ID:hT1YfL4n0
>>420
personは分解できないの?
そんな巨大ならpersonを分解して
xml読み込んでパースした情報を保持するやつ
パースした情報からpersonの部品を作るやつ
personの部品からpersonを作るやつ
みたいに段階踏むかなぁ
0423デフォルトの名無しさん (ワッチョイ 0363-ORrh)
垢版 |
2019/11/05(火) 22:45:42.68ID:hT1YfL4n0
nugetなんて誰でもリリースできるんだから著名じゃないライブラリの良し悪しは中々情報は得にくいだろうね。
頑張って元言語の記事読むしかないんじゃない?
0425デフォルトの名無しさん (アウアウウー Sa2f-jEuW)
垢版 |
2019/11/05(火) 23:00:27.36ID:Ra2VTEEXa
>>420
どうしても分ける前提なわけね。
まあPersonReader がPersonのインスタンスを持つのは普通に変だよねやっぱり。
どこにも必然性がない。

PersonReader が状態を持つ必要がなければstaticクラスのstaticメソッドでいいはず

どうでもいいけど、

// ファイルを読み込む処理
person = 〜

じゃなくて、例えば

// ファイルを読み込む処理
person.Hoge = 〜;
person.Hage = 〜;
person.Piyo = 〜;
...

だよね多分?
0426デフォルトの名無しさん (アウアウイー Sa43-4Sz2)
垢版 |
2019/11/05(火) 23:15:11.57ID:Uakp03G7a
最近のVisualStudioなら暮らすライブラリのプロジェクトで[ビルド(B)]-[パッケージ(P)]をクリックするだけで
nuget登録用のnupkgが出来上がるよ
あとはnugetにログインしてWeb上から適当に情報入力して登録すればすぐ反映される
悪意のあるパッケージとかどうやって識別してrejectしてるのか正直不思議
それとも表沙汰になってないだけでnpmみたいな汚染が日常的に起こってるのか

さすがにストアアプリよりははるかにマシだけどNuGetも玉石混合、というかゴミパッケージのほうが多いと思うよ
0429デフォルトの名無しさん (ワッチョイ 6f5f-qQ6b)
垢版 |
2019/11/05(火) 23:43:07.83ID:UYy2SJn60
>>428
自分で作ることは滅多にないけど、標準で用意されてるのは時々使う
FlagsAttributeやDllImportAttributeなんかは比較的良く使われているのではないだろうか
使わない人は全然使わないだろうけど
0433デフォルトの名無しさん (ワッチョイ 6f5f-qQ6b)
垢版 |
2019/11/06(水) 00:10:24.55ID:vTr6jChq0
>>430
Attribute自体はプロパティやメソッドに付与して、コンパイラやライブラリに対して追加の情報を与えるだけ
Attributeが具体的に何を意味をするのかは、それぞれのAttributeによる
ASP.NET Coreのソースだったら、Validation関係かな
0434デフォルトの名無しさん (ワッチョイ 0363-ORrh)
垢版 |
2019/11/06(水) 00:13:31.71ID:fi/5YPdO0
>>428
自作はenumにラベルつけるのに作るくらいかなぁ
enumの定義値とメニュー上の表示文字列対応させるみたいな感じ
多言語対応とかあるような案件じゃ使えないけど

すでにあるのはちょいちょい使う
TestとかBenchmarkとかは属性ありきだったりするし
0436デフォルトの名無しさん (ワッチョイ 0363-ORrh)
垢版 |
2019/11/06(水) 01:07:17.94ID:fi/5YPdO0
>>435
そのやり方だと対応言語増やすときに再ビルド必要になっちゃうよね
enum以外にも定義が必要な語句は多そうだからそういうのは外に出す方を取るかなぁ
まぁケースバイケースだろうけどね
0438デフォルトの名無しさん (アウアウウー Sa2f-jEuW)
垢版 |
2019/11/06(水) 01:36:47.06ID:sSqMDD2ka
属性をキーにするぐらいにあらenumを直接キーにすりゃいいじゃんw
素直に拡張メソッドてToString定義した方が早いよw
0440デフォルトの名無しさん (アウアウウー Sa2f-jEuW)
垢版 |
2019/11/06(水) 01:41:32.51ID:sSqMDD2ka
拡張メソッドが使える以前はenumと相互に暗黙変換できるクラスを作って
そこに変換メソッドを書いてたけど、あれは実にあほらしい作業だったなあ
0441デフォルトの名無しさん (ワッチョイ 0363-ORrh)
垢版 |
2019/11/06(水) 02:20:17.85ID:fi/5YPdO0
>>439
実際にはenumとラベルを相互に変換したり複数対応させたり等々ケースに応じて細かな要件が出てくるからそういう拡張をするときのベースとして使ってる
あとキャッシュしないと遅いから自作側でキャッシュ処理も含めて作ることが多い
descriptionだとその属性自身を機能拡張したいときにしづらくない?
0444デフォルトの名無しさん (ワッチョイ 8b6e-msxt)
垢版 |
2019/11/07(木) 18:27:33.71ID:4Y6lEZUW0
C++のライブラリのちょっとした機能使いたくて現状C++でexe作ってそれをprocessで呼び出してる構造なんですけどなんかデメリットあります?
一応ラッパーもあってC#に一元化も出来るんですけどまぁ遅い。それに実行ファイル配るときに一緒にdllわさっと渡さないといけなくて。今はC#とC++のexe2つ渡すだけです
ソースコード別になっちゃって管理がめんどいくらいしか思いつかなかったんですけど、なんかトラブルの種になりそうなことありますか?
0446デフォルトの名無しさん (ワッチョイ 5b2f-DaD1)
垢版 |
2019/11/07(木) 18:55:13.67ID:5UmAe6Qb0
フォーム上に左1/4が欠けた円を表示させたいです。
FillEllipseで円を書いてFillRectangle背景色で1/4を塗りつぶせばいいや
と思ったら、FillRectangleが隣り合った塗りつぶしたくない図形も塗りつぶしてしまう。
なにかいい方法は無いでしょうか?
0447デフォルトの名無しさん (スップ Sdbf-4TTv)
垢版 |
2019/11/07(木) 19:05:19.59ID:rg6PQaG0d
>>444
別に現状で不満ないなら良いのでは?
配布するものならexeが複数あるとC++の方のexe起動してうごかねーっていうのがくるかも
あと動かす環境が変わったときに両方のexeの再ビルドが必要になる可能性があるとか
環境まで言い出したらexeかどうかなん些細な話かもしれんが
0453デフォルトの名無しさん (ワッチョイ 9f2c-3bRk)
垢版 |
2019/11/07(木) 19:52:29.15ID:tx6c8EjT0
円弧の端と円の中心、もう片方の端と円の中心でそれぞれ線分を引いた形じゃなくて
円弧の端と端を1本の線分でつないだ形?
まあGraphicsPath作ってFillPathすればいいんじゃない
0455デフォルトの名無しさん (アウアウウー Sacf-FD+t)
垢版 |
2019/11/07(木) 21:34:03.21ID:nmFTkuxva
>>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;
}

必用ならパス作るしかないか
0456デフォルトの名無しさん (ワッチョイ 9f01-vL98)
垢版 |
2019/11/07(木) 21:35:04.28ID:debRpYWr0
>>444
Process経由の場合はDLL使ったAPI呼び出しに比べると
マーシャリング/アンマーシャリング、エラーハンドリングが面倒になりがち
現状そこに不満がないなら無理してDLLに変更する必要はないと思う

あと一応バイナリリソースとしてdllやexeをC#のアセンブリに埋め込んで1ファイルにすることも可能
(リソースからexeを取り出して起動したりDLLをロードしたりするための追加コードが必要)
0461デフォルトの名無しさん (ワッチョイ 5b2f-DaD1)
垢版 |
2019/11/07(木) 23:18:55.53ID:5UmAe6Qb0
やっかいなのは

欠けた円の半径を任意に変更したいのでGraphicPathで円に接する直線を引くのが難しいこと
欠けた円をたくさん描くので、rectangleやgclipでやると隣の欠けた円にも影響を及ぼすこと

なんですよね。
clipならできるのかなぁ。
0463デフォルトの名無しさん (アウアウウー Sacf-FD+t)
垢版 |
2019/11/07(木) 23:24:51.97ID:nmFTkuxva
>>461
>>455で何がダメなの?
0464デフォルトの名無しさん (ワッチョイ 9fa7-cErl)
垢版 |
2019/11/07(木) 23:25:47.22ID:6/qmKr7m0
それもできないなら一度
どっかのピクチャーボックス(wpf?winforms?)に貼り付けて
欠けた円を作ったあとで
それを必要な領域だけくり抜いて持って来ればええよ
0469デフォルトの名無しさん (ワッチョイ 9fda-rO36)
垢版 |
2019/11/08(金) 10:55:00.38ID:l/9rfM6i0
usingは無理でした
名前空間はPropertiesだけで
Properties.Setting.Default のエイリアスや参照は作れないようです

privateだと参照が作れるんですが
publicにするとDefaultが internal sealedで定義されているため
エラーになっちゃうんですよね…
0473デフォルトの名無しさん (ワッチョイ 9fb9-vPHs)
垢版 |
2019/11/08(金) 13:27:02.99ID:GoK8IDZc0
以下のプログラムについて質問お願いいたします。

--- 以下プログラム ---
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 を返します。

しかしプログラムを読んでみても、
何がどうなってそのような動作になっているのかどうしても理解できません。
何かお分かりになることがあれば
どんなことでも構いませんので教えていただけないでしょうか。
どうぞよろしくお願いいたします。
0475デフォルトの名無しさん (アウアウウー Sacf-FD+t)
垢版 |
2019/11/08(金) 13:55:40.06ID:Y8kt1QUVa
>>473
なんか1年ぐらい前にも同じネタがあった気がするんだけど...
コードよく読んでないけど、要するに2進数で見た時に
「値が1の最下位ビットの位置」を求めてるだけだと思うよ。

2進数で2で割ることは右に算術シフトするのと同じなのは分かるよね?
あと、奇数とはbit0が1の数なのも分かるよね?

だから「x が 2 で割れる回数」と「値が1の最下位ビットの位置」は同じになる
0476デフォルトの名無しさん (アウアウウー Sacf-FD+t)
垢版 |
2019/11/08(金) 14:03:08.97ID:Y8kt1QUVa
>>475
× 算術シフト
〇 シフト

要するにLSBが1になるまで右シフトを繰り返した、その回数を求めてるんだと思う
知らんけど
0478デフォルトの名無しさん (ワッチョイ 9fb9-vPHs)
垢版 |
2019/11/08(金) 15:11:25.53ID:GoK8IDZc0
>>474-477

ありがとうございます。
色々と実験してみた結果、
x & ~x + 1 が、x と 2で割れる回数が同じ、
1UL << i の形の値になることがわかりました。

ただ、どうして x & ~x + 1 と 1UL << i が
結びつくのかまだ理解できておらず、
67 で割った余りを計算する理由も分かっていないので
引き続き考えてみようと思います。

もし他にもヒントがあれば教えていただけると嬉しいです。
よろしくお願いいたします。
0479474 (ワッチョイ 9f2c-E8Ce)
垢版 |
2019/11/08(金) 15:35:02.78ID:bNpOstnB0
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]
0481デフォルトの名無しさん (ワッチョイ 9f01-vL98)
垢版 |
2019/11/08(金) 16:48:42.14ID:q9/Fdf+e0
>>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系のコードなのでビット演算を理解すればあとは忘れていい類だと思う
0482デフォルトの名無しさん (ワッチョイ 9fda-rO36)
垢版 |
2019/11/08(金) 16:50:19.91ID:l/9rfM6i0
>>478
わかったわ

x & ~x + 1 は、最下位の1のビットだけ残す計算
ビット反転して1を足すことで、最下位の1まで繰り上がり
他のビットは必ずどちらかが0になるのでandで消える

で、67で割った余りを求める理由は、2^t を67で割った場合
tが0〜63の範囲ならユニークな値になるから
最小サイズの配列のインデックスを返す値として
最も適していたということだな

なかなか面白いプログラムだった
0485デフォルトの名無しさん (ワッチョイ 9fda-rO36)
垢版 |
2019/11/08(金) 17:10:58.46ID:l/9rfM6i0
>>482を修正

>で、67で割った余りを求める理由は、2^t を67で割った場合

割った余りを求めれば

>tが0〜63の範囲ならユニークな値になるから

tが1〜64の場合だな


かなり洗練されているが読みやすさとしては
仕事で扱うには勘弁してほしいw

ところでまさかこれ課題じゃねーよな?
0486デフォルトの名無しさん (ワッチョイ 9fb9-vPHs)
垢版 |
2019/11/08(金) 18:04:22.31ID:GoK8IDZc0
>>479
ありがとうございます。
Ruby を扱う技術が私には無いので
アイディアだけお借りして C# に翻訳してみたところ、
期待通りに動作いたしました。
ちなみに、他の方から実行速度に関するご指摘があったので
オリジナルと比較してみたところ、私の書いたコードでは
オリジナルよりも 250 倍程度時間がかかってしまうようでした。
とはいえ読みやすさは良いプログラムの重要な条件なので、
場面に応じて使い分けるのが良さそうですね。
0487デフォルトの名無しさん (ワッチョイ 9fb9-vPHs)
垢版 |
2019/11/08(金) 18:04:48.09ID:GoK8IDZc0
>>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」というのをさらっと書いてくださっていますが、
これは実際に調べてくださったのですか?
それとも、きちんと数学を勉強していればすぐに分かることなのでしょうか。。。
0489474 (ワッチョイ 9f2c-E8Ce)
垢版 |
2019/11/08(金) 19:01:19.01ID:bNpOstnB0
>>487
限定された範囲で、規則性があるものは、理論的に説明できないだろ。
ちょっとしたトリビア

355 / 113 = 3.141592 92035

円周率と、小数点以下6桁まで一致するとか
0490デフォルトの名無しさん (ワッチョイ abe6-DaD1)
垢版 |
2019/11/08(金) 20:36:38.33ID:83cZSp6a0
コレクションの初期化子で複数を同じ値でまとめて指定する方法はないでしょうか?

Pythonの、l=[False]*100みたいなことをやりたいのですが、
var l = new List<bool> { False, False・・(100個分)}ぐらいしか思いつかず・・
0494デフォルトの名無しさん (ワッチョイ 9fb9-vPHs)
垢版 |
2019/11/08(金) 20:51:12.72ID:GoK8IDZc0
>>492
> ついになる数はそのビット数の次の素数

レスありがとうございます。
私も最初そのように考えたのですが、
16 の対が 17 ではなく 19 なので
そういうわけではないようなのです。

ちなみに 16 の対が 19 になるというのは
>>481 さんが書いてくださっており、
私のほうでも改めて確認しているので、
間違いではないと思います。
0495デフォルトの名無しさん (ワッチョイ 2b63-4TTv)
垢版 |
2019/11/08(金) 21:38:06.59ID:3NnH1vyN0
>>494
ほんまやね、すまん
ここらへんは整数論の話だから得意な人に聞けば話は早いんじゃないかな?
フェルマーの小定理から決まるのかな?って思うけど俺自身は整数論詳しくないんで解説できないわ
0496デフォルトの名無しさん (ワッチョイ 9fb9-vPHs)
垢版 |
2019/11/08(金) 22:38:41.75ID:GoK8IDZc0
>>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 以下の数が適切でないのは当たり前な気がするので、
フェルマーの小定理から直ちに欲しい情報が得られるというわけではないようです。

とはいえ、関連しそうな分野が分かっただけでも大きな前進ですので、
もう少し詳しく調べてみようと思います。どうもありがとうございました。
0499デフォルトの名無しさん (ワッチョイ 2b63-4TTv)
垢版 |
2019/11/08(金) 23:08:44.38ID:3NnH1vyN0
>>498
もしfalse限定ならC#のbool変数の初期値はfalseに決まってるからbool配列100個を作るだけで目的のものは作れるよ
trueの場合はRepeatすることになるけど、falseなら配列宣言で済ませたほうがパフォーマンスは良い
100個程度なら微々たる差ではあるけど
0502デフォルトの名無しさん (ワッチョイ abe6-DaD1)
垢版 |
2019/11/08(金) 23:27:57.31ID:83cZSp6a0
>>500
Pythonで[[0, 1]]*10とかやって、恐ろしいことになったのを思い出しました
今はちゃんと[[0,1] for _ in range(10)]としてますが、C#でも同じですね

それにしてもPythonから移ってくると、C#は難しいですね・・
0503デフォルトの名無しさん (ワッチョイ 9fb9-vPHs)
垢版 |
2019/11/08(金) 23:28:43.13ID:GoK8IDZc0
>>497
レスありがとうございます。

いろいろなビット数 n の対になる数を調べてみると、
必ずしも素数になるとは限らないものの、
調べた範囲では全て p^k(p は素数、k は自然数)の形になっていました。

で、教えていただいたガロア体というのは要素の個数 p^k の集合ということで
ビンゴかと思ったのですが、
どうやら私が考えているのは p^k を法とする剰余環というものらしく、
k = 1 で無い限りガロア体とは本質的に異なるもののようです。

しかし色々と調べれば調べるほどこのあたりの分野から答えが見つかりそうだと
思えてきたので、もう少し頑張ってみようと思います。どうもありがとうございます。
0504デフォルトの名無しさん (ワッチョイ 2b63-4TTv)
垢版 |
2019/11/08(金) 23:52:22.74ID:3NnH1vyN0
>>501
newするRepeatをGenericで作ればいいよ
whereで値型と参照型分けるようにして作ってそっち呼ぶようにすれば気にする必要もなくなる
インスタンス生成が多くなるようなプロジェクトではよく使う
ゲーム系なんかだと結構使われること多いんじゃないかな?
0507デフォルトの名無しさん (ワッチョイ 0fa7-DaD1)
垢版 |
2019/11/09(土) 08:50:31.29ID:Bvga/TrM0
Visual Studio2019で新プロジェクトを作ろうとしたらWindows Forms App(.NET Core)がさも推奨かのように上の方に出てきますが、
Windowsで使う想定のWinFormsアプリを作る場合も.NET Coreで作ったほうがいいんでしょうか?
0512デフォルトの名無しさん (ワッチョイ 2b54-BjYd)
垢版 |
2019/11/09(土) 10:38:23.18ID:YXlbcSmw0
>>506

手続型は可読性と保守性が低い。使うなら局所的に、隠蔽して使うのが吉。

どんな場合でも LINQ とは言わないが、データ変換が主な場面ではメソッドチェーンや遅延評価できる LINQ 推奨。
0513デフォルトの名無しさん (ワッチョイ 9fa7-cErl)
垢版 |
2019/11/09(土) 10:55:47.68ID:Bq7xaXZQ0
ちょっと条件変わったときに途中で引っ掛けにくいよね

あ、ここ、フラグでcontinueいるわ
あ、i%10==0毎に処理いるわ
あ、i±Nまで見る必要あるわ

とか、for文のが圧倒的に拡張性が高い
0519デフォルトの名無しさん (ワッチョイ 9f2c-E8Ce)
垢版 |
2019/11/09(土) 11:56:21.81ID:Ypm9+s0e0
>>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]]
0520デフォルトの名無しさん (ワッチョイ 2b54-BjYd)
垢版 |
2019/11/09(土) 12:15:40.62ID:YXlbcSmw0
>>513

設計せずに書き出すダメプログラマー丸出しの発言だな。そうやってできるのは、いちおう動くけどバグが埋れてて、変数ダンプしながらフローを追わないと挙動がわからない可読性の低いコードになるんだよ。

君のいうことは、インデックス付き Select や GroupBy & SelectMany や TakeWhile なんかを組み合わせれば簡単にできるよ。

もともとは System.Linq の Enumerable.Repeat が参照型では Shallow Copy になるってことから始まったのだから Select 使って Deep Copy にすることでいいんでないの。
0526デフォルトの名無しさん (アウアウウー Sacf-FD+t)
垢版 |
2019/11/09(土) 14:14:43.55ID:6EEimGlVa
どこまで本気なのかネタなのかよくわからないけど個人的には>>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)を好むのは多分巨大なコードを書いてメンテナンスしたことがない人だと思う。
0528デフォルトの名無しさん (ワッチョイ 2b63-4TTv)
垢版 |
2019/11/09(土) 14:38:43.64ID:w+/raRA00
普段から書いてりゃ慣れるしLinqの遅延評価が役立つ場面なら積極的にlinqの方を選択する
可読性なんてその人そのプロジェクトで変わる
難読可したコードとかまでいくなら気にするのはわかるけど、この程度の差ならどっちでも良い
他言語から入ってきた人ならlinqが馴染みやすいこともあるだろうし、Cからやってる人ならforが馴染みやすいかもしれない
ただそれだけ
0529デフォルトの名無しさん (アウアウイー Sa0f-acGn)
垢版 |
2019/11/09(土) 14:47:42.99ID:Ersh0Xipa
そのコレクションが固定長だったら、だけど
自分だったら
var array = new Label[100];
と配列で宣言したうえで>>526の(b)だな
listをわざわざforループで添字アクセスするのはちぐはぐだし
配列を明示的に使って固定長であることを明示的に表すべきだと考えるロートル人間なので
0533デフォルトの名無しさん (ワッチョイ 8b6e-msxt)
垢版 |
2019/11/09(土) 16:07:38.17ID:rNsqZ2GJ0
C#というかアルゴリズムの質問になっちゃうかもしれないんですけど
aというテキストファイルがあってそこにはb cという2つのファイル名が書いてある bを見るとdと書いてあって cにはファイル名書いてない
このときaを読み込んで最終的に手元にa b c dの4つのファイル名を取得したい。まぁList<string>に格納される感じでしょうか
再帰で書くんだろうなぁとは思いつくんですが、再帰が大の苦手でどういう終了条件でどういう戻り値の関数を作ればいいのか考えつきません
手助けいただけないでしょうか
0534デフォルトの名無しさん (ワッチョイ 4f02-YkAg)
垢版 |
2019/11/09(土) 16:40:40.94ID:Xnyz1DqK0
IEnumerable<string> ReadFilePaths(string filePath) { /* 再起なしでファイルパスをすべて読み取る */ }

IEnumerable<string> ReadFilePathsRecursive(string filePath) =>
ReadFilePaths(filePath)
.SelectMany(i => ReadFilePathsRecursive(i))
.Append(filePath)
;


はい
0536デフォルトの名無しさん (ワッチョイ cb88-4TTv)
垢版 |
2019/11/09(土) 17:06:05.75ID:4gIYGCYB0
不要な引数は_だね
破棄パターンはまだ言語仕様になってないけど要望も多いし議論も進んでるからそう遠くない未来には入るだろう
すでに導入されてる言語もあるし

俺個人的には526のbみたいなlistなのかarrayなのかよくわからん制御のほうが混乱する
0538デフォルトの名無しさん (ワッチョイ 2b54-BjYd)
垢版 |
2019/11/09(土) 17:20:28.60ID:YXlbcSmw0
>>526

LINQ が万能ではないことは認める。使う人を選ぶ技術でもあるし。

だが、Enumeration の操作にいちいちカウンタ使って境界テストしなければならなかったり、if, break, continue でフローを追わなければならなかったりするのは、レビュアーや運用・保守者を泣かせるコードになることが多い。

モダンな言語がここ10年のあいだに参照透過性や関数型を追求する方向に進化しているのは、そういう可読性、保守性、開発効率性を意識しているから。

ちっちゃいコードなら手続型で好きなように書けばいいんだよ。大規模開発やビジネスロジックが重要な場面では関数型で書くのが適してる。

まあ、LINQ もあまりやりすぎると読みにくくなるのだが。
0541デフォルトの名無しさん (アウアウウー Sacf-FD+t)
垢版 |
2019/11/09(土) 17:47:37.52ID:6EEimGlVa
>>537
ぐぬぬw
0544デフォルトの名無しさん (アウアウウー Sacf-FD+t)
垢版 |
2019/11/09(土) 18:25:40.87ID:6EEimGlVa
MSのDocs(?)の日本語版ってマウスオーバーでオリジナルの英語版が読めなかったっけ?
対応してるページと対応してないページが混在してるのか?
Docsって何やねんw
0547デフォルトの名無しさん (ワッチョイ fb38-zIDV)
垢版 |
2019/11/09(土) 20:45:25.24ID:RT6p7yxc0
LINQは慣れると意図が読めるけど
forは何のためにループ回してるのかは解りづらくなりがち

数学的な問題や複雑な処理を書く場合LINQの表現力はすごいけど、慣れてない人が理解できるようになるのは大変

LINQやRxなしで同等のコード書くのはもはや考えられない
0548デフォルトの名無しさん (オッペケ Sr0f-EJQs)
垢版 |
2019/11/09(土) 20:48:12.46ID:sTrPPJ5/r
プログラマなら普通は逆だよね?

linqというかSQLはただの集合論のはずなのになぜかforの代替で使われたりする
linqはループを隠ぺいしているだけで実際はループしてる
0550デフォルトの名無しさん (ワッチョイ 9f01-lZUE)
垢版 |
2019/11/09(土) 21:03:01.43ID:XH4+9Keu0
>>547
> forは何のためにループ回してるのかは解りづらくなりがち
流石に
> for (int i = 0; i < list.Count; i++) list[i] = new Label();
の意図がわからないならプログラマーやめるべきだと思うわ
0551デフォルトの名無しさん (アウアウエー Sa3f-pFIx)
垢版 |
2019/11/09(土) 21:05:00.70ID:aDURcOtda
やりたいことは何かを書いてそれを実現する具体的な方法をライブラリにお任せするのがLinq(宣言的)
やりたいことは何か全くわからないけどそれを実現する具体的な手続きだけは知りたくないことまで細かく書くのがループ(手続き的)

何をしたいのかわからないコードよりしたいことが書いてあるコードのほうが親切
0556デフォルトの名無しさん (オッペケ Sr0f-EJQs)
垢版 |
2019/11/09(土) 21:32:36.03ID:sTrPPJ5/r
大体の場合においてやりたいことだけをlinqで書けはしない
普通の処理をすべてLinqに置き換えられるならそれだけでいいが
そんな世界どこにもない


実現不可能な話でlinqがいいなんて現実的じゃない
0559デフォルトの名無しさん (アウアウエー Sa3f-pFIx)
垢版 |
2019/11/09(土) 21:45:51.67ID:aDURcOtda
プログラマがヘボでクエリとコマンドの分割がうまくできてないとLinqが綺麗に適用できないことがある
しかしLinqはクエリであることを忘れてはいけない
コマンドで汚染されたループをLinqでは書きにくいと主張するより先にリファクタリングすることをおすすめする

速度最適化が必要な場面はあるが常に速度最適化が求められるわけではない
速度よりメンテナンス性が重視されることの方が多い
0560デフォルトの名無しさん (オッペケ Sr0f-EJQs)
垢版 |
2019/11/09(土) 21:46:24.40ID:sTrPPJ5/r
本当に集合論ならループの順番などという概念がない
が実際にはある
MS自体はシーケンス(連続、並び)と言ってるが一部のオタが勝手にSQLと同じ集合論だと言ってるだけ
0562デフォルトの名無しさん (オッペケ Sr0f-EJQs)
垢版 |
2019/11/09(土) 21:55:50.65ID:sTrPPJ5/r
Linqでももともとやりたいことをそのまま表現できるパターンは少ない
それでどちらにしてもコードに落とし込みをする段階がある

処理に応じて手順を分解してコードにする
実際にそれをやるのがプログラムである
手順が分解できない、他人の書いた手順を理解する気がないならプログラムする気がないと言うこと
0566デフォルトの名無しさん (アウアウウー Sacf-FD+t)
垢版 |
2019/11/09(土) 22:38:55.83ID:6EEimGlVa
>>534
これもイテレーター使った方が読みやすい気がする
IEnumerable<string> ReadFilePathsRecursive(string path)
{
  yield return path;
  foreach (var path2 in ReadFilePaths(path))
    foreach (var path3 in ReadFilePathsRecursive(path2))
      yield return path3;
  }
}
0569デフォルトの名無しさん (ワッチョイ 2b54-BjYd)
垢版 |
2019/11/10(日) 00:18:01.25ID:jJedryfu0
>>561
LINQ をまともに使っている人は LINQ の得手不得手を知っているから LINQ が万能だとは言っていない。
データ処理の多くの場面ではカウンタ使ってプリミティブに手続書くのは非効率だと言っているだけ。

逆に手続型信者 (老害ともいう) は不必要な場面でもカウンタ使ってイテレーションを書き、コードをいたずらに冗長化するねっていうこと。それに対する有効な反論がない。自分にとっては読みにくいっていう個人的感想ばかりじゃないか。

誰かが言ったとおりこれは慣れだよ。初めは確かにとっつきにくいが慣れる。そして戻れなくなる。

>>562
趣味グラマーならそれでいいよ。だが、ビッグデータやデータサイエンティストの時代になって業務ユーザもコード読むようになったこのご時世。
運用が止まって、下手くそなコード読んでトラブルシュートしなければならない身にもなってみて欲しい。センスない奴が書いたプリミティブな手続をダンプしながらフロー追っかけて修正し、リグレッションテストして、一定時間内に通常運用に戻すのは地獄。

無意味な宗教戦争にしないために、みなさんが前提や目的や利用場面をもう少し明確にすることを提案する。
下請けで隠蔽工程のコーディング担っているプログラマは LINQ のありがたみなんてわからなくても当然。レビュアーや PM や使う人のことを考えず、自分のスキルでとりあえず動くものを行数書いて月給もらえればいいんだから。
0571デフォルトの名無しさん (ワッチョイ 2b54-BjYd)
垢版 |
2019/11/10(日) 01:00:17.48ID:jJedryfu0
>>570

LINQ to Entities のことかな?
LINQ to Entities は残念ながらまだ発展途上だね。(もう 10 年にもなるのに。)
業務ロジックも書けなくはないが、.NET プラットホームや DB 実装などへの依存性が強すぎて、かなり工夫する必要があり、汎用性がなくなってしまう。
Select, Where (, OrderBy, Take, FirstOrDefault, Join)くらいしかまともに使えないと思っていた方が無難だと思う。となると DB アクセス回数と無駄なデータ取得が増えることになり、性能が出ない。

また C# 9 あたりで予定されている Records がないとデータ変換ロジックが非常に書きにくい。

.NET 5 になれば期待できるのではないかと思うけど。
0575デフォルトの名無しさん (ワッチョイ 9f79-DaD1)
垢版 |
2019/11/10(日) 14:15:34.99ID:j17ZnuaO0
標準のLINQでは効率的に処理できないなら
効率的に処理できる拡張メソッドを定義してそれを使うべき

流れの中でforやらforeachを使われると可読性が落ちるしテストもしにくくなる
0577デフォルトの名無しさん (ワッチョイ 9f01-vL98)
垢版 |
2019/11/10(日) 15:27:29.24ID:Fk6O1w1g0
開発組織のコード管理能力やチームメンバーのリテラシーに合わせて判断することだとは思うが
拡張メソッド作れないって縛りプレイはできれば勘弁して欲しいな
0578デフォルトの名無しさん (スップ Sdbf-4TTv)
垢版 |
2019/11/10(日) 15:45:16.03ID:VGQLXxaqd
拡張メソッド無しはさすがにしんどい
そら上位のnamespaceにstringやらintのextension大量に作るとかやられるのは勘弁してほしいがちゃんと整理されてるなら問題ないじゃん
0581デフォルトの名無しさん (ワッチョイ df2d-tdZI)
垢版 |
2019/11/10(日) 23:41:53.75ID:Xa0PWm0+0
そういや、Max、Min句が対象とした個別要素を返すってのは酷い気がするな
IEnumerable<T>に対して使った時にT型で返すように何故しなかったのか全く理解できん
0583デフォルトの名無しさん (ワッチョイ 9f01-vL98)
垢版 |
2019/11/11(月) 02:22:50.36ID:U14XuieM0
MoreLINQ使えばMinBy/MaxByがある
(複数返すからTじゃなくIEnumerable<T>的なのが返される)

リスト埋めるやつもMoreLINQ使えば比較的読みやすい
var labels = new List<Label>().Pad(10, _ => new Label());
0588デフォルトの名無しさん (アウアウウー Sacf-FD+t)
垢版 |
2019/11/11(月) 12:41:25.30ID:W7OxtIUea
どうかな
個人的にはどちらか一つだけしか選べないとしたら>>581の実装の方が合理的だと思うけど

単純にそっちの方が需要多いと思うし、二度手間にはなるが現状の実装は
>>581的実装で代替できる(変換結果の最大値は変換関数から求められる)のに対して
逆はどうやっても不可能だから
0589デフォルトの名無しさん (ワッチョイ 2b54-BjYd)
垢版 |
2019/11/11(月) 12:47:13.66ID:k+N9opvZ0
>>588
上位互換の方がいいっていうのはわかる。でもそれは LINQ to Object だけを考えた場合ね。

LINQ は LINQ to Entities という OR マッパーも強く意識しているから、標準 SQL 互換の機能も大事であり、どちらか一つという選択を強いるなら現状になる。
0590デフォルトの名無しさん (スップ Sdbf-4TTv)
垢版 |
2019/11/11(月) 12:47:47.01ID:pQGjPoV1d
別に難しいもんじゃないんだし作りゃいいんだよ
どういうのがベストかが状況によってたやすく変化する処理だと思う
値が欲しいのか要素が欲しいのか、一つで良いのか全部列挙するのか
だから標準としては1回走査で済んでsum等の算術系と同じような入出力になる現仕様を選んだんじゃない?
0591デフォルトの名無しさん (ワッチョイ df2d-tdZI)
垢版 |
2019/11/11(月) 18:08:06.42ID:FT34EqpP0
なんかよくわからないけど、SQLとの互換性ならTが返ってきた方が遥かにSQLに近いでしょ
0597デフォルトの名無しさん (ワッチョイ cb88-4TTv)
垢版 |
2019/11/11(月) 19:42:55.85ID:rlOgmRK80
>>596
標準ではない
使ったこと無いけど583が紹介してるものか自作するか
自作しても数行だしググればコードは転がってるよ

個人的にはこういうやつは上げだすとキリがないんで現状で十分かなと思ってる
標準で山ほど用意されても何があって何を自作しなきゃならんかがわからなくなるんで本当に基本的なものだけあればいいかなと思う
0599デフォルトの名無しさん (ワッチョイ df2d-tdZI)
垢版 |
2019/11/11(月) 20:48:49.06ID:FT34EqpP0
SQLで書けるものはだいたい書けるようなってないと使いづらいよやっぱ
0601デフォルトの名無しさん (ワッチョイ df2d-tdZI)
垢版 |
2019/11/11(月) 20:54:23.36ID:FT34EqpP0
それは流石にLinqのせいじゃなく、例の変な人が言ってるフレームワーク等で吸収する部分じゃないか?
0602デフォルトの名無しさん (ワッチョイ 9f01-vL98)
垢版 |
2019/11/11(月) 21:13:49.74ID:U14XuieM0
>>595
SQLの場合はインデックスがあるから一般的にO(log n)で最大値のキーが取得できる

LINQ標準でMaxByと同じことをやる場合はちょっと効率悪いけどOrderBy使う
O(n)にするためだけにAggregate使った拡張メソッド作るよりも
走査する件数を減らすことを考えたほうがよかったりする
0606デフォルトの名無しさん (ワッチョイ 2b54-BjYd)
垢版 |
2019/11/11(月) 21:51:17.93ID:k+N9opvZ0
>>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 のストアドを呼ぶことはできるはず。
0616デフォルトの名無しさん (ワッチョイ 2b54-BjYd)
垢版 |
2019/11/12(火) 06:42:14.04ID:8jIzWHEF0
>>610
LINQ にこだわるなら、こだわるだけの理由が必要。
スレに貢献している人を茶化すなら、茶化すだけの知識なり、思想なり、技術的裏付けが必要。

>>611,612
どちらの意見もわかる。

LINQ to Object に閉じるなら十分。足りない部分はライブラリ自作すればいいし、そのパズルが楽しかったりする。

でも、LINQ to Entities に踏み込むと足りないことだらけ。本質的ではないところで相当な工夫が必要だし、工夫しすぎると汎用性がなくなって使い物にならなくなる。

LINQ to Object で組み始めたロジックを LINQ to Entities 互換に拡張することを考えている時間が結局ムダになることも多い。

両者、似ているようでギャップがかなり大きいところに物足りなさを感じる。
0617デフォルトの名無しさん (アウアウエー Sa3f-I5cZ)
垢版 |
2019/11/12(火) 06:51:40.24ID:9Bw+vwp6a
最初から全くの別物なのに似ているというだけで変な期待をかけて勝手に裏切られた気持ちになる人が少なからず居る
別物と割り切って名前もインターフェースも変えれば初学者が迷わずに済んだだろうな
0618デフォルトの名無しさん (ワッチョイ 2b54-BjYd)
垢版 |
2019/11/12(火) 07:47:36.42ID:8jIzWHEF0
>>617
そうだね。裏切られたとは思わないけど、当初の期待はかなり高かった。

でも、LINQ to Entities の情報が少なすぎて別物だって理解するまでに相当な時間がかかってしまう。
誰も頼れる人がいない中、ネット情報のみの独学でみっちり3週間かかったよ、まともに使えるようになるまでに。
0620デフォルトの名無しさん (ブーイモ MMbf-BjYd)
垢版 |
2019/11/12(火) 08:11:27.68ID:SXTlA5+FM
>>619
わからなかったからどちらも試したよ。
Framework のバージョンによって作法が大きく異なるのに、ネットはバージョンを示さず情報が混在しているのも混乱する大きな要因だった。
0626デフォルトの名無しさん (ブーイモ MMbf-BjYd)
垢版 |
2019/11/12(火) 12:08:55.50ID:wo/moEjDM
>>624
君は読解力ないのかな?
局面によっては使えるかもしれないけど、業務ロジックを完結させるには役者不足、LINQ to Entities はまだまだ発展途上だね、今後に期待、と一貫して言っているのだが。

一次ソースも二次ソースも充実してないのは発展途上でこれからもまだまだ移りゆくものだからだとも思ってる。それがわかるのにけっこうコストがかかったよ、そのあたりが個人的に物足りなさを感じるところかな。
0628デフォルトの名無しさん (ブーイモ MMbf-BjYd)
垢版 |
2019/11/12(火) 12:31:28.37ID:wo/moEjDM
>>625
一次ソースはバージョンに関しては混乱しない。それは二次ソースの話。一次ソースが混乱させるのは、LINQ to Object から Entities へ移行するにあたって、重要かつ基礎的なコンセプトをまともに解説していないこと。

たとえば、IEnumerable の派生である IQueryable はアップキャストするだけで AsEnumerable で評価されてしまうとか、引数となるラムダ式が全く同じ記法なのに IEnumerable では Func で IQueryable では Expression だとか。

これらは分かってしまえば当たり前だし、うまく設計したものだなと感心するけれど、初学者にはトラップでしかない。

君はこれら暗黙の前提を一次ソースで知ったのか?
だとしたらどこにガイドがあるか教えてほしい。

一次ソースに当たれというのは一般的なお約束だけれども、LINQ to Entities に関しては、コンセプトや実装の難しさに比して一次ソースがかなり脆弱で不親切だと思うよ。

617 の言うとおり Object と Entities でインターフェースを変えて設計するか、あるいは、移行に十分な情報を一次ソースが用意するか、どちらかだと思う。そのどちらでもないことがアンチを生んでいる原因ではないかと。
0632デフォルトの名無しさん (ブーイモ MMbf-BjYd)
垢版 |
2019/11/12(火) 13:53:14.21ID:wo/moEjDM
>>630,631
業務ユーザが LINQ to Entities に手を突っ込むの、ガイジだよなぁ、わかるぞ。
だがね、人のやらないことを先鞭をつけてやらねばならない場合もあるのだよ。

ひととおり技術評価した結果、本格的に導入するのは時期尚早という判断で別の技術つかうことにした。.NET 5 以降に期待してる。
0639デフォルトの名無しさん (オッペケ Sr0f-NaRu)
垢版 |
2019/11/12(火) 20:14:31.68ID:CeIzlsxBr
>>628
それらを区別することがはたしてLINQの目指すべき理想なのかね
0640デフォルトの名無しさん (ブーイモ MMbf-BjYd)
垢版 |
2019/11/12(火) 21:23:28.30ID:wo/moEjDM
>>639
それらってどれのことだろう?
LINQ to Object と Entities のことかな?

両者の設計はよく考えられたシームレスで美しいデザインだと個人的には思うよ、違いをしっかり理解できた後ならね。違いが分かりにくいというのは言語設計の問題ではなく、MS Docs などガイドの問題だと思う。

何が理想的な設計かは人によって感じ方が違うのではないかな。

あ、EF4, 5, 6, Core と進化する間に名前空間や正規関数などがコロコロ変わっているあたりは、場当たり的で汚いと思う。何か制約があって実装をやり直した、その苦労の跡が垣間見える。Core から後方互換を捨てて綺麗に作り直そう感があるから、.NET 5 に期待している。
0641デフォルトの名無しさん (アウアウイー Sa0f-acGn)
垢版 |
2019/11/12(火) 21:44:06.09ID:WF3NQ/iBa
ごめんちょっと話が横に反れちゃうけど、このスレ見たり書き込んだりしてる人って
MicrosoftDocsって日本語/英語どっちを見てるの?
当たり前のように原文ですらすらと読んで理解してるものなの?
MSDNが廃止されてDocsになったはいいけど特にAPIリファレンスとか日本語訳の品質が酷すぎて辛い
自分は英語ほとんど読めないんで、Chromeで日本語版、FireFoxで英語版+Google翻訳をそれぞれ表示して
3タブ切り替えながら読み進めてくなんて効率の悪いことをやってるんだけど、みんなはどうしてるのか気になった

MSの一次ソースに当たるのも↑の理由でしんどいんだよね・・・
もう潤沢な日本語訳が提供されるような時代じゃなくなったんで英語のできないPGは退場せざるをえないのか
0644デフォルトの名無しさん (ブーイモ MMbf-BjYd)
垢版 |
2019/11/12(火) 22:25:29.03ID:wo/moEjDM
>>641
調べる目的によるかな。

引数の順番とかオーバーロードとかうろ覚えの確認程度なら、検索して最初に出てきた方。
初出のロジックを書くためにコンセプトや基礎設計からじっくり考えつつ API を調査するなら、まず日本語でざっくり理解、重要なポイントが和訳で怪しいなら英語で精緻化。
LINQ なんかは集合論や数学に近く、これらは概念が同じなら分野跨いで英単語が同一だったりして英語の方が理解が早いから英語のみ、とか。
LINQ to Entities の場合、一次二次併せてそもそもの情報量が少ないから、英語日本語関係なくとにかく漁る。(そして英語の Q&A でほのめかされているヒントに辿り着き、一次ソース原文を当たったりする。)
0645デフォルトの名無しさん (ワッチョイ 2b63-4TTv)
垢版 |
2019/11/12(火) 23:03:23.32ID:Mubuqyvi0
俺も英語は苦手だけどdocsは基本英語
どういうメソッドあったっけ?で見ることが多いから多少の単語がわかればほぼ理解できる
動作が知りたいときでよくわからん英語の言い回しがあったときは日本語にして読んでみる
けど、そういうときは日本語にしても大抵理解できない
デフォを英語にするようにしとけばプログラムで頻出する英単語が徐々に覚えられるようになるから英語をオススメする
0647デフォルトの名無しさん (アウアウイー Sa0f-acGn)
垢版 |
2019/11/12(火) 23:53:04.67ID:WF3NQ/iBa
ありがと、自分もdocs英語派に転向するよう頑張ってみる
比較的翻訳が整ってる基礎説明みたいなページでもいちいち
「角度」⇒「Angular.js」、「反応」⇒「React.js」みたいな脳内逆翻訳をかますよりは
苦手でも最初っから英語版を読み解くほうがやっぱりマシなんだよな・・・

自分はFirefoxのアドオンで
・Simple Translate (右クリックでGoogle翻訳結果をポップアップ表示)
・MouseDictionary (マウスを乗せた英単語の日本語意味をリアルタイム表示)
を入れてる
みらい翻訳はいちいち英文をCopy&Pasteするのが面倒で常用断念
0651デフォルトの名無しさん (アウアウウー Sacf-keNo)
垢版 |
2019/11/13(水) 01:08:43.01ID:aZU5BEQSa
まあジャパニーズITドカタの世界じゃ専門卒の英語アレルギーな連中に扱えないようなものが普及することは決してないから、
業界から脱出するつもりがないんなら英語はハナから捨てたほうが賢明だよ
だって業務では永遠に使えないんだから
0656デフォルトの名無しさん (ワッチョイ 9f01-vL98)
垢版 |
2019/11/13(水) 03:12:16.84ID:LQUpdw6j0
翻訳ソフトを多用するから英語読む力が身につかないんやで
まともな辞書を使って単語帳をつけて定期的に復習するのが大事
翻訳ソフトは最後の手段

マウスオーバーで引ける辞書も便利だけど
便利すぎて辞書ナシで文やパラグラフを読む努力をしなくなると英語力は向上しない
0658デフォルトの名無しさん (ワッチョイ cb88-4TTv)
垢版 |
2019/11/13(水) 12:16:37.65ID:3gCJP2hx0
翻訳精度の向上ってもう10年以上言われ続けてるよねw
こないだgoogleだかどっかが文脈を考慮した翻訳どうのこうのってリリース出してたけどどこまで伸びるかねぇ
0660デフォルトの名無しさん (ワッチョイ 0fa7-DaD1)
垢版 |
2019/11/13(水) 13:18:54.28ID:/n7NHPZ80
既に英語-日本語は十分な翻訳精度になってない?
MSDNのようなオフィシャルな場はもうほぼ完璧だし、そこら辺の外人フォーラムなんかでも一応意は汲める
中学英語程度の基礎があれば読みに関してはもう不自由しない
0661デフォルトの名無しさん (ワッチョイ 9f01-vL98)
垢版 |
2019/11/13(水) 13:36:03.37ID:LQUpdw6j0
>>657
超短期的な目的でしょそれ
翻訳ソフト使わないと読めないままで良いと思ってるんなら別にいいんだけどさ

技術的な調査能力だったり新しい技術を身につける速度に顕著に差が出るよ
0662デフォルトの名無しさん (ワッチョイ cb88-4TTv)
垢版 |
2019/11/13(水) 14:39:59.45ID:3gCJP2hx0
現状で完璧なんて口が裂けても言えないと思うけど…
msdnみたいな同じ言い回しが頻出するようなところは個別の対応もしやすいし、そもそも単調な事実だけを述べるだけの文章なんで誤訳は少ない
そんな環境でも真逆の意味に訳されてしまっているケースすら存在する
こないだdoとdo notが逆に翻訳されててちょっと燃えたよね
補助として使う分には十分なレベルではあると思うが翻訳能力自体はまだまだ伸びて欲しいと思うよ
0664デフォルトの名無しさん (ドコグロ MM3f-keNo)
垢版 |
2019/11/13(水) 14:52:44.04ID:zYuYteZMM
まともな大学出てるエンジニアなら英語さえ話せれば外資に転職して軽く一千万以上貰える
必死こいてEFCoreとか覚えるより本気で英語を勉強した方が遥かに効率的だぞ
0666デフォルトの名無しさん (ワッチョイ 2b63-DaD1)
垢版 |
2019/11/13(水) 18:13:13.40ID:EdyIqayv0
質問です
ジェネリッククラスにおいて型Tがクラスのときとstructのときで全く挙動を変えたいのですが、
同名の2つのジェネリッククラスに異なる型制約をつけることは可能でしょうか
0672デフォルトの名無しさん (ワッチョイ fb3c-AXNO)
垢版 |
2019/11/13(水) 20:12:00.42ID:L3Ppb+A30
こんばんは
質問させてください

LINQのGroupByでデータテーブルの複数のカラムを指定しvar変数に格納後、
格納したデータをCopyToDataTableメソッドでデータテーブルに変換しようとしても、
CopyToメソッドしか候補に表示されないのですがVisual Studioのバグですか?
0673デフォルトの名無しさん (ワッチョイ 5b2f-DaD1)
垢版 |
2019/11/13(水) 20:36:20.89ID:FrzbMubD0
フォームアプリ作っていてデバッグ中です。

フォームのクラスから呼び出したクラスにブレークポイントを設定しているのですが、
止まってくれません。

フォームのクラス上に設定したブレークポイントでは止まってくれます。
これって仕様なのでしょうか?
0674デフォルトの名無しさん (ワッチョイ 5b2f-DaD1)
垢版 |
2019/11/13(水) 20:54:49.74ID:FrzbMubD0
なんかプロジェクト内でブレークポイントで止まるクラスと止まらないクラスがある。
前はどこに設定しても止まっていたのに・・・。
一体何が原因なんでしょうか?
0680デフォルトの名無しさん (ワッチョイ 8b01-hbis)
垢版 |
2019/11/13(水) 22:24:28.57ID:yG9mqOTd0
>>672
IGroupingはキーを列挙するものだよ?
キーは通常DataRowじゃないからそりゃ出ないよ
グループごとにChildrenをDataTableにしたいのか、Childrenをキー順に並んだ1つのDataTableにしたいのかによって書き方は変わる
0681デフォルトの名無しさん (ワッチョイ 9f01-vL98)
垢版 |
2019/11/13(水) 22:25:44.66ID:LQUpdw6j0
>>663
マスターww

辞書使う前にとにかく翻訳ソフト使うやつは
リファレンス見ずにQiita見てコピペしようとするやつと同じ思考回路なんだよね
いつまでもスキルが身につかない原因を自分が作り出してることに気が付かないとすぐに淘汰されるよ
0694デフォルトの名無しさん (ブーイモ MM76-+sLU)
垢版 |
2019/11/14(木) 12:17:18.58ID:1eSFX+RHM
>>692
クラスではなくメソッドについて struct/class 制約の共通化をやろうとした経験から言うと ...

Nullable 含めて内部判定することはできるけど、判定・分岐があちこちに発生することになり、かなりめんどくさいし、読みにくくなる。
だったらクラス分けて、誰かが言った通り interface (か abstract base class) で共通化図る方が楽と思われる。
0696デフォルトの名無しさん (アウアウウー Sa45-CsEk)
垢版 |
2019/11/14(木) 12:59:54.31ID:xkNbqoiZa
>>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
0697デフォルトの名無しさん (ワッチョイ 7e7c-+JiD)
垢版 |
2019/11/14(木) 13:09:24.35ID:Um2wzMfp0
>>693
WPFだと一般的にはMVVM使う
で、MVVMなら直接ViewにアクセスしないでVM経由になる
VMの値はスレッド越しに取得設定できる
コレクションの操作については事前に同期オブジェクト渡すとかする必要があるけど
0698デフォルトの名無しさん (アウアウウー Sa45-CsEk)
垢版 |
2019/11/14(木) 13:27:31.68ID:xkNbqoiZa
こっちの方がマシか
class A<T>
{
  protected A() { }
}

class AOfStruct<T>:A<T> where T:struct
{
}

class AOfClass<T>:A<T> where T:class
{
}
0700デフォルトの名無しさん (ドコグロ MM4a-woiy)
垢版 |
2019/11/14(木) 15:23:48.31ID:DypnJQvvM
ジェネリックなメンバアクセスには、最近は構造的部分型を使うのが流行りだね
構造的部分型ベースの型システムを持つTypeScriptやGoでは利用する側でアドホックにinterfaceを定義できるから、
利用シーンを先読みして型階層を設計するという人間には困難な芸当なしで柔軟に型制約のようなことができる
0702デフォルトの名無しさん (ワッチョイ 21da-bNU/)
垢版 |
2019/11/14(木) 20:42:53.07ID:XexdQDOu0
質問させてください

ASP.NET
C#
SQL Server
を使用しています

SQLにByte型で保存したバイナリデータが保存されています
そのバイナリデータをASP.NET側でLISTで受け取り、フォルダに保存したいです
LISTで受け取った後にフォルダに保存するところの書き方を教えてください

よろしくお願いします
0708デフォルトの名無しさん (ワッチョイ 02b9-Ks/Y)
垢版 |
2019/11/15(金) 23:36:35.15ID:pmE2fanG0
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の方が
無駄な処理をしているように思えます。

分かる方がいたら教えていただけないでしょうか?
よろしくお願いします。
0709デフォルトの名無しさん (ワッチョイ e963-L4DL)
垢版 |
2019/11/15(金) 23:45:14.55ID:ksKmrlqp0
三項演算子で比較するよりビットシフトのほうが圧倒的に早いから
cpuが得意とする処理と人間が理解しやすい処理は一致しない
どうしても納得行かないならILを見て各ステップでどういう命令がされるか確認するしか無いかな?
0710デフォルトの名無しさん (ワッチョイ 02b9-Ks/Y)
垢版 |
2019/11/16(土) 00:11:47.33ID:m6RZqer/0
>>709
ありがとうございます。とりあえずILについて調べて、
下のようなページを表示させるところまで行き着きました。
https://sharplab.io/#v2:C4LglgNgPgAgzAAhgJgQYQQbwLACgEFICMAbAmAHbAICqFYwAysAKYAORAFJdQB4CUCALwA+BLwQihCAAwIA/AiIIQsgNx5CxMj1r0mrNsm5Vxg0Qk4SRYuEUEBqJWoR4AvkA===

これから書いてある内容の理解に挑戦してみようと思います。
0711デフォルトの名無しさん (ワッチョイ e963-L4DL)
垢版 |
2019/11/16(土) 00:31:35.36ID:4hbhG1OZ0
そのILをぱっと見る限り、実行されるアセンブラまで調べに行く必要あるのかも
命令数は変わらんし
そこまで行ったらもう環境依存な気もする
てか最適化ありなら最適化されたIL見ないとだめかな
0712デフォルトの名無しさん (ワッチョイ e954-+sLU)
垢版 |
2019/11/16(土) 00:37:54.66ID:NxgYCWhy0
>>708
大昔にアセンブリやっていた経験からの推測だけど...

@の >= は左辺引く右辺の減算をして符号判定をしており、右辺の 0 を引くという演算が最適化ありでも外れず無駄な演算をしている可能性がまず一つ。でもこれはAに対して圧倒的に不利になる要素ではない。

もう一つのよりありそうな可能性は、三項演算子がコンパイルで if ステートメントになり、分岐先ブロックでパイプライン先読み実行していたステップが、分岐先読みの失敗により、ロールバックするコストが高くついているのではないかと。
確率 50% の分岐なら、2回に1回はロールバックすることになるため、コストが最悪になる。if else ブロックのどちらが実現確率が高いか、コンパイラが判断・制御できていない。
それに対してAはパイプライン処理を乱す要素がない。

どう中間コンパイルされ、どう IL が動くのか、最近の低レイヤーの処理は全く知らないため、見当外れかもしれないが。
0714デフォルトの名無しさん (ワッチョイ e954-+sLU)
垢版 |
2019/11/16(土) 00:59:24.83ID:NxgYCWhy0
パイプライン処理の詳細は Wiki で調べて、命令パイプライン、パイプラインハザード、制御ハザードの節あたりを参照しておくれ。

条件分岐がなぜ遅いかわかる。確率考えてアセンブリレベルで制御しないと速くならないよ。
0716デフォルトの名無しさん (ワッチョイ 02b9-Ks/Y)
垢版 |
2019/11/16(土) 01:07:09.62ID:m6RZqer/0
>>711
ありがとうございます。
アセンブラというのはSharpLabのページの
ResultsをJIT Asmにしたときに表示されるものと考えて正しいですか?
IL命令について色々と調べていたのですが、
JIT Asmのほうが書いてあることが少ないので先にこちらに挑戦してみようと思います。

あと最適化されたILというのは、ResultsをILにして、
一番右上の選択肢をReleaseにしたときに表示されるものと考えて正しいですか?

>>712
ありがとうございます。UnitStep?(int x)のxはプラスとマイナスが50%ずつになるように
ランダムに決めているので、確かに分岐の確率は50%です。
まだパイプラインについて完全に理解できていないので見当外れかもしれませんが、
試しにプラスとマイナスの割合を変えてどうなるかについても検証してみようと思います。

>>713
>>714
ありがとうございます。やはりハードウェアについてしっかりと理解しないといけないのですね。
ひとまず、>>714に書いていただいたキーワードについて調べてみたいと思います。
0717デフォルトの名無しさん (ワッチョイ e954-+sLU)
垢版 |
2019/11/16(土) 01:19:12.81ID:NxgYCWhy0
もしパイプライン処理がビンゴだったら IL 見ててもわからないよ。

CPU の fetch, decode, exec という内部処理の流れを理解しないと。

質問の書きぶりから大学かなんかの課題に見えるんだけど、高級言語ばかり見ていて低レイヤーのこと知らないとハマることあるかもよって警告するためのお題なのかもね。
0719デフォルトの名無しさん (アウアウウー Sa45-CsEk)
垢版 |
2019/11/16(土) 01:33:47.48ID:KEmuW3Wza
分岐先読み失敗って言ったって
x >= 0 ? 1 : 0
さすがにこんなのゼロコストじゃないの?

単純に機械語レベルの命令数の差を反映しているだけのような気が
知らんけど
0720デフォルトの名無しさん (ワッチョイ e954-+sLU)
垢版 |
2019/11/16(土) 01:41:11.97ID:NxgYCWhy0
>>718
いいインサイトですね。勉強になります。

>>716
もし true ? 1 : 0 の速さがAにかなり近くなって false ? 1 : 0 の速さが@よりさらに悪くなる、(あるいはその逆) ならパイプライン処理が原因だと考えて間違いないと思う。
0721デフォルトの名無しさん (ワッチョイ e954-+sLU)
垢版 |
2019/11/16(土) 01:50:49.22ID:NxgYCWhy0
>>719
機械語レベルの命令数に差があるように見える?
@Aどちらも 2, 3 ステップだよ。

先読み失敗リカバリーはものすごくコスト高いよ。
パイプライン上の仕掛かりを全部クリアしなければならないんだから。その 2, 3 ステップの 1.5 〜 3 倍くらいのクロックサイクルを無駄にすると思う。
0722デフォルトの名無しさん (ワッチョイ e954-+sLU)
垢版 |
2019/11/16(土) 02:00:02.51ID:NxgYCWhy0
>>719
ごめん、言い過ぎた。
IL わからんから、中間コンパイル通したらなんとも言えない。機械語の命令数が膨らむ可能性もありうる。
721 はネイティブコンパイルしたら、という仮定の話。
0723デフォルトの名無しさん (アウアウウー Sa45-CsEk)
垢版 |
2019/11/16(土) 02:19:10.34ID:KEmuW3Wza
不勉強で今時のCPUのアーキテクチャーさっぱり分からんが、
ググってみると、投機的実行は予測が当たれば儲け、はずれても損なしだからこそ意味があると書いてある

コインの裏が出たら損をするなら意味がないと思うんだけど
0724デフォルトの名無しさん (ワッチョイ 02b9-Ks/Y)
垢版 |
2019/11/16(土) 02:28:53.52ID:m6RZqer/0
>>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倍もの違いはないようです。
0725デフォルトの名無しさん (ワッチョイ e954-+sLU)
垢版 |
2019/11/16(土) 02:35:13.39ID:NxgYCWhy0
>>723
それ出典教えてもらえる?
外れても損なし、だったらいいなっていう理想を言っているのではないのかな。

ランダムデータには弱いけど、正常系と異常系の分岐はたいてい正常系の発生確率が高いためこちらに賭けるのよ。で、ロジックの多くはこの手の分岐でしょ、っていうことを想定して先読みのアーキテクチャになっている。

ということをその文献も (独特の表現で) 言いたいのではないかと思うのだが。

もれも最近の CPU がわかっているわけではない。80286 〜 386 時代でアップデート止まってる。
0726デフォルトの名無しさん (ワッチョイ 02b9-Ks/Y)
垢版 |
2019/11/16(土) 02:40:12.76ID:m6RZqer/0
>>720
>>724の75:20というのは間違いで、正しくは75:25でした。失礼しました。

ところで、ランダムに50:50ではなくプラスとマイナスを交互にしたら
もっと遅くなるかと思いきや、むしろ75:25よりも少し早いくらいになりました。
(ランダムの場合も交互の場合もあらかじめ入力データを配列に格納してから
 計測を開始しているので、入力データの作成コストは結果に影響していないはずです)

どんな仕組みで先読みをしてるのかさっぱり分かりませんが、
とにかく予測ができないのが遅くなる一番の原因のようです。
0727デフォルトの名無しさん (ワッチョイ e954-+sLU)
垢版 |
2019/11/16(土) 02:46:49.96ID:NxgYCWhy0
>>724
そうですね、データ依存なんでパイプラインと先読みが原因だと個人的には思います。

そういえば思い出しましたが、if else ブロックの片方に固定的に賭けると必要以上に大負けすることがあるため、条件分岐を何度か通ったところで学習し、勝てる見込みのより高い方へ賭けるアーキ設計だったような気がします。

true : false = 100 : 0 or 0 : 100 に片方が大負けせず、同じ性能になったのはこの学習効果ではないかと。

モダン言語の進化の方向の一つに高級化があるのは、仰るとおり。低レイヤーの最適化はコンパイラと進化したハードウェアに任せ、コードは人間にわかりやすくして開発生産性を高めようということです。

もう一つの進化方向は Rust とか Go とか、低レイヤー向け言語を C++ よりわかりやすく、より安全にしようというものだと思います。
0728デフォルトの名無しさん (アウアウウー Sa45-CsEk)
垢版 |
2019/11/16(土) 03:34:45.34ID:KEmuW3Wza
>>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ステップの方が
低コストなのは当たり前の話でした
0729デフォルトの名無しさん (ワッチョイ e954-+sLU)
垢版 |
2019/11/16(土) 03:57:31.89ID:NxgYCWhy0
>>728
ありがとう。

この説明は失敗時のリカバリーがノーコストでできる環境を前提にしていると思う。
投機的実行をした面とは別の面を持っていて、そちらにすぐスイッチしてロジックを実行しつつ、その裏で失敗した面を同時並行で捨てられるような感じ。それが一般的かどうかはわからない。

複数面を持たず、失敗ステータスを捨てて (= クリアして)、その後に分岐別側のロジックを走らせるというようにシーケンシャルにリカバリーするのが一般的なのではないかなと思ったんだけどね。

最近のは複数面持ってるのかもしれない。ただ、複数面持っていると分岐ない時にリソースが遊んで無駄だからねぇ、分岐なくても普段からその面で並列演算すればいいって話になるよね。
0732デフォルトの名無しさん (ワッチョイ 69a0-+sLU)
垢版 |
2019/11/16(土) 10:49:58.51ID:42LkciGb0
>>730
全てわかっている人なんていないのだし、それぞれ知っていることを持ち寄って可能性をいろいろ検討してみるのが健全なやりとりなんだと思いますよ。

IL をうんぬんは知らない観点だったし、CPU アーキの話するのも 25 年ぶりくらいだったし、高級言語と C とアセンブリの使い分けを簡潔に整理してくれた人がいたので、とても勉強になりました。

>>731
ま、C# からはかなり離れてしまったね。
でも、電卓をバカにするものは電卓に泣くよ。AI もゲームも業務アプリも全てそのマイクロ電卓の組み合わせなんだから。高級言語の時代でも低レイヤーの動作原理を知っているに越したことはない。
0733708 (ワッチョイ 02b9-Ks/Y)
垢版 |
2019/11/16(土) 11:14:24.24ID:lqoaSlCM0
色々と教えていただきどうもありがとうございました。
とりあえず、下のような感じの結論でまとめたいと思います。

・UnitStep1が遅い原因はパイプライン処理における分岐先読みの失敗による制御ハザードだと思われる
・分岐の方向の入れ替わりが激しくてもそこに規則性があれば制御ハザードは起こりにくいようで、
 分岐先読みにおいて高度な学習が行われていることが伺える
・高級言語の目的を考えれば、開発生産性を優先してUnitStep1を選択することも十分にあり得る

UnitStep1の入力データをランダムに決定した場合の、±の割合に応じた実行時間の計測結果
http://iup.2ch-library.com/i/i2026606-1573870091.png

何かおかしなところがあれば指摘していただけると嬉しいです。
親切にしていただきどうもありがとうございました。
0735デフォルトの名無しさん (ワッチョイ 02b9-Ks/Y)
垢版 |
2019/11/16(土) 11:44:37.21ID:lqoaSlCM0
>>734
お褒めいただきありがとうございます。
パイプライン処理はとても奥が深いようで完全に理解するのはなかなか大変そうですが、
データの割合に関するご指摘のおかげでわかりやすい計測結果も得られて私もとても楽しかったです。
あまりにもわかりやすすぎる結果のせいで今後しばらく条件分岐恐怖症になりそうですがw
0736デフォルトの名無しさん (ワイーワ2 FFca-/nAh)
垢版 |
2019/11/16(土) 12:23:55.13ID:HpU1Ehe+F
>>710
C4LglgNgPgAgzAAhgJgQYQQbwLACgEFICMAbAmAHbAICqFYwAysAKYAORAFJdQB4CUCALwA+BLwQihCAAwIA/AiIIQsgNx5CxMj1r0mrNsm5Vxg0Qk4SRYuEUEBqJWoR4AvkA===

個人情報漏れてね?
0750デフォルトの名無しさん (ワッチョイ eea7-iGNt)
垢版 |
2019/11/19(火) 18:50:59.68ID:wDZa4BoT0
WPF開発に使われるMVVMパターンについてですが、Viewは良いとしてViewModelとModelの役割分担についての理解がイマイチです
ModelではOnPropertyChanged();などの記述はするべきではないという理解で良いんでしょうか?
0757デフォルトの名無しさん (ワッチョイ 1310-QS5Z)
垢版 |
2019/11/21(木) 14:49:09.23ID:vYs/9NCN0
C#でQUEUEクラスを利用した際、Dequeue()後にメモリは残るのでしょうか?
EnQueue()とDeQueue()を繰り返しているのですが、(Countは0になる)
Visual Studioでメモリ使用量をみるとサイズがとても大きくなってるのですがこれはどういうことでしょうか?
0764デフォルトの名無しさん (アウアウウー Sa9d-927E)
垢版 |
2019/11/21(木) 15:36:34.05ID:2+YsLjv3a
>>761
ペンに特殊な仕掛けがあるわけじゃないと思うので、
ペンだろうが指だろうが同じだと思う
知らんけど

でも普通に静電容量式のタッチパネルでしょ?
0765デフォルトの名無しさん (アウアウウー Sa9d-927E)
垢版 |
2019/11/21(木) 15:39:50.86ID:2+YsLjv3a
一応Windows7からOSネイティブでタッチ操作に対応してるんだよね。

当時技術サンプルとして鯉が泳いでる池をタッチすると波紋が広がるスクリーンセーバーが
公開されてたけど、なぜかコードは非公開で意味ねえと思ったなw
0769デフォルトの名無しさん (ワッチョイ 5161-CJzu)
垢版 |
2019/11/21(木) 17:45:14.26ID:0fDEV4Sz0
>>764
ペンは電池式で何らかの仕掛けがあります。
良く知りませんが、恐らく「交番電界(周波数が低い電磁波とも言える)」を
出している可能性が高いです。
0771デフォルトの名無しさん (ワッチョイ 8901-o5/b)
垢版 |
2019/11/21(木) 18:08:29.79ID:2xdKb6kz0
テレパシーの実用化。
0772デフォルトの名無しさん (アウアウウー Sa9d-927E)
垢版 |
2019/11/21(木) 19:22:17.78ID:iJSjE21Ua
>>769
へー
静電容量式の原理から普通に考えればペン側に仕掛けが必要とは思えんけど、
よく分からんね。

接触しているかどうかの識別はCの大きさで判定するだけのはずだと思うんだけど
0775デフォルトの名無しさん (アウアウウー Sa9d-927E)
垢版 |
2019/11/21(木) 20:57:25.88ID:phtIa0Jsa
>>773
対応って言ったって要するに導電性があるだけだよw
だから100均でも売ってる

>>774
surfaceってペン「も」使える設計だよね?
0776デフォルトの名無しさん (ワッチョイ 93bd-AvZR)
垢版 |
2019/11/22(金) 00:36:21.37ID:k4KfXICB0
長い名前を持つクラスに、thisを返すメソッドがあるとします

 // 超長いクラス名
 class VeryLongLongClassName {

   // thisを返すメソッド
   VeryLongLongClassName Foo( ) {
     return this;
   }
 }

このとき、Foo()の定義につけるクラス名を省略、
あるいは置き換える方法はありますか?

たとえば以下のような形が理想です

 var Foo() { … } // 型推論っぽく書けるとか
 __CLASS__ Foo() { … } //自身のクラスを表す予約語とか
0778デフォルトの名無しさん (ワッチョイ 69a0-x9/g)
垢版 |
2019/11/22(金) 01:10:47.79ID:JIfSXtJz0
>>776
外部との境界に var 型推論はムリ。それやると型を差し替えたときに影響が甚大になるため、型推論はローカルでしか許されない。
using エイリアスディレクティブで短い別名付けるとよいのではないかな。
0779デフォルトの名無しさん (ワッチョイ 93bd-AvZR)
垢版 |
2019/11/22(金) 01:39:19.16ID:k4KfXICB0
ありがとうございます
ないですかー 残念
0781デフォルトの名無しさん (ワッチョイ 7997-Rk0C)
垢版 |
2019/11/22(金) 01:41:47.12ID:9t5OvAOe0
インタフェースとか継承を考えても、thisで型推論するのは無理じゃない?
0782デフォルトの名無しさん (ワッチョイ 93bd-AvZR)
垢版 |
2019/11/22(金) 02:06:03.92ID:k4KfXICB0
戻り値が特に必要ないメソッドはreturn thisにして繋げれるようにしておこうかなあと
return thisにするか同じクラスをnewするかはさておき
0783デフォルトの名無しさん (アウアウエー Sae3-QS5Z)
垢版 |
2019/11/22(金) 03:39:52.30ID:zCaqBpsza
VisualStudio2017を使用

Form1にsplitContainer1を上下に分割して全面に貼ってあり、splitContainer1の下段側にリッチテキストボックス1をドッキングさせて貼ってあります。
このリッチテキストボックス1が、ScrollBarsプロパティ:Both、WardWrapプロパティ:false

このリッチテキストボックス1に縦と横幅を超えるテキスト表示をした時、
縦のスクロールバーは普通に表示されるけど、水平のほうのスクロールバーが表示されなくなったのだけど何が原因と考えられるでしょうか?

・右キー押して自分でカーソルを右端まで動かせば一応画面のスクロールはさせられる
・以前はちゃんとスクロールバーが表示されてたはずなんだけどいつの間にか表示されなくなった?
0785デフォルトの名無しさん (ワッチョイ 8ba7-QS5Z)
垢版 |
2019/11/22(金) 10:12:54.94ID:NcGK5KJU0
xamlの質問になってしまいますが、全コントールアイテムのBorderBrushやForegroundの色を統一することって出来ないのでしょうか?
<Style TargetType="Button">
<Setter Property="BorderBrush" Value="Black"/>...
と一つ一つのコントロールを定義して回るしか方法はないのでしょうか?
0787デフォルトの名無しさん (アウアウウー Sa9d-927E)
垢版 |
2019/11/22(金) 11:05:21.71ID:fOeQA7sva
>>776
ファイルスコープの別名なら普通に可能。
グローバルに別名が欲しいと考えてるならそもそも何か考え方が根本的に間違ってる気がする
0789デフォルトの名無しさん (アウアウウー Sa9d-927E)
垢版 |
2019/11/22(金) 11:34:48.44ID:fOeQA7sva
>>788
いや誰が考えてもそういう(>>784)話ですw
それ以外にありえない
0790デフォルトの名無しさん (ワッチョイ 3988-+jxl)
垢版 |
2019/11/22(金) 12:09:19.86ID:miLj5dAA0
returnの型から推論できるんだからメソッドの戻り型にもvarを使わせろって話?
んじゃあ始め書き込みで予約語の例示が意味不明
というか長い名前という言葉から文章を開始しといて何が違うんだ?

変数でvarを使うのは名称が長いからではないぞ?
長いものも3文字で表現できるという副次的メリットはあれどそのために導入されたものではない
0791デフォルトの名無しさん (ドコグロ MM63-5f43)
垢版 |
2019/11/22(金) 12:18:11.80ID:627roQa/M
メンバの型に型推論が使えないのは単純に技術的な問題だよ
コンパイラは先にメンバのシグネチャだけを見てリストアップしてから各メソッドの本体を処理することで依存関係を解決している
メソッドの中身を見ないとメンバの型が確定しないとなると、一度メソッドを処理しただけでは依存関係を解決しきれないから
メソッドを何度も繰り返し処理する必要がでてきてコンパイルが遅くなる
0793776 (ワッチョイ 93bd-AvZR)
垢版 |
2019/11/22(金) 12:21:55.56ID:k4KfXICB0
なんか結論としては>99の質問と同じような感じになっちゃったけど
最初の質問が微妙に異なるので見落ちとしてた、すまん

>>787
単純に自身と同型のオブジェクトを返すときに、なんかスマートな方法あるのかな?と思っただけ
言語によってはそのへんの仕組みがあったりする

ファイルスコープでのエイリアスが可能なら>>778の言うように
分かりやすいところに ThisClass みたいな名前のエイリアスを用意しておいて
クラス内部では基本的にそっちを使うのもアリかなと思っている
予約語ではないのでエディタとの相性はそこまで良くないけのが欠点か
0795776 (ワッチョイ 93bd-AvZR)
垢版 |
2019/11/22(金) 12:29:12.04ID:k4KfXICB0
>>791
なるほど、確かにそうだな
動的な言語だとまた違うんだろうけど比較できるようなもんでもないしな
0796776 (ワッチョイ 93bd-AvZR)
垢版 |
2019/11/22(金) 12:35:32.03ID:k4KfXICB0
>>794
んだね

アリかナシかで言えばアリだと思ったけど
言語仕様として存在しないなら自分個人ではなるべく避けたいな
0798デフォルトの名無しさん (ワッチョイ 3988-+jxl)
垢版 |
2019/11/22(金) 13:09:44.77ID:miLj5dAA0
な?名称が長いかどうかなんて関係ない質問なのに余計な単語から質問を始めるから周りが混乱する。
コメントで超長いクラス名とかまで書いてんじゃん
そんで指摘したらそーじゃねぇよ!ってあほかとwどんだけ説明下手くそなのw
0799デフォルトの名無しさん (アウアウウー Sa9d-927E)
垢版 |
2019/11/22(金) 13:09:46.78ID:fOeQA7sva
>>793
なるほど失礼w

長い名前云々書いたのははミスリードだったねw
戻り値を型推論で省略できないか?とシンプルに書いて欲しかった
0803デフォルトの名無しさん (アウアウウー Sa9d-927E)
垢版 |
2019/11/22(金) 14:08:44.11ID:fOeQA7sva
>>800
そうなの?w

// VLLCNじゃ何だかわからないので必要な場面で説明的な名前を与えるためだけのクラス
// 空っぽの継承のまま維持せよ。メンバ追加禁止!!!
class VeryLongLongClassName : VLLCN { private VeryLongLongClassName(){} }

// VeryLongLongClassNameの実体はこっち。
class VLLCN
{
  ....
}

まさかこんなのがお好みなのかなw
0804デフォルトの名無しさん (ワッチョイ 3988-+jxl)
垢版 |
2019/11/22(金) 14:16:21.50ID:miLj5dAA0
自身のクラス返すときだけ利用したいんでしょ
tweenerみたいな設定が多いものをチェインメソッドで必要な設定を好きな順番で書くとか
他にはfactoryみたいなのをわかりやすくするとか
気持ちはわからんでもないけど局所的すぎると思う
0805デフォルトの名無しさん (ワッチョイ b32d-gZQb)
垢版 |
2019/11/22(金) 14:17:29.50ID:k9hYLF030
.Net CoreからBitFlyerの認証が必要なWebAPIを使いたいんだけどさあ
業者は暗号化キーをソースコードやファイル等に保存しないよう求めてるんだけど、.Net Coreでキーを守る手段ってどういうのがあるの?
WindowsやmacOS付属の機能も使えなさそうだし、最終的に動かしたいLinuxなんかそもそもそんな機能がないし・・・・
ランタイムにもそんな機能なさそうだし、どうすればいいんだろ
0807デフォルトの名無しさん (ワッチョイ 1301-hZ32)
垢版 |
2019/11/22(金) 15:31:23.92ID:VuiommTl0
>>804
> tweenerみたいな設定が多いものをチェインメソッドで必要な設定を好きな順番で書くとか
チェインメソッドってよく見かけるようになったけど見易いのかなぁ…
X.A( ).B( ).C( );
より
X.A( );
X.B( );
X.C( );
の方が見易いと思う俺は老害なんだろうか
0809デフォルトの名無しさん (ワッチョイ 1301-hZ32)
垢版 |
2019/11/22(金) 16:37:13.07ID:VuiommTl0
>>808
linqはパイプみたいに順次処理して行くからまだ理解できるんだけど>>804が言う
> 設定が多いものをチェインメソッドで必要な設定を好きな順番で書く
とかは普通に分けて書けばいいのにって思うんだよね
まあ人それぞれと言うのには同意するけど
0811デフォルトの名無しさん (ワッチョイ 7997-Rk0C)
垢版 |
2019/11/23(土) 02:25:29.33ID:LRCCNZf00
>>807
自分もそう思う
>>808
LINQでつなげる場合はLINQメソッドの戻り値を意識しながらつなげるわけだから、話が違うじゃん
list.Reversed().Select((v)=>v+1)みたいな例はデータをどんどん変換しているから良いと思うけど、
form.ForeColor(Color.Red).BackColor(Color.Black)みたいなやつは1行で書けるメリットがあるのはわかるけど、
やってることは関数じゃないのに関数っぽくっ振る舞ってるのがすごくモニョモニョする。
これが、
form.CopyWithForeColor(Color.Red).CopyWithBackColor(Color.Black)で別のformが2つ作られるとか、
form.ForeColorChanger(Color.Red)でForeColorChanger<Form>が生成されて、ApplyFormで元のFormに反映されるとか
ToFormで新しくフォームが作れるとかならわかるんだけど、
副作用のあるメソッドで、戻り値がvoidのやつはもったいないから、戻り値をthisにするってのがなんか受け付けないんだよな―。
0813デフォルトの名無しさん (ワッチョイ 6963-+jxl)
垢版 |
2019/11/23(土) 03:16:21.47ID:gK3OO6AB0
だから意味合いは違うって書いてんでしょうが
this返して繋げる前提ライブラリなんてよくあるし好き嫌いの範疇
君が嫌いならしなきゃ良いだけじゃん
俺だってC#のライブラリ作るとき設定するだけのメソッドでthisなんて返さないよ
それは俺が作るものが小さいものだからできるだけ標準に近いものが良いだろうってだけ
大きめのものでそれが全体を通して同じようにthis返す設計で、それを使うならなるべくその思想には従うかもしれん程度
0814デフォルトの名無しさん (アウアウウー Sa9d-927E)
垢版 |
2019/11/23(土) 04:29:53.39ID:1tUJgTKRa
this返すお作法は昔のjava方面の文化じゃない?

C#は1.xの時代にMSか何かのガイドラインで「やるな」って書いてあったのを読んだ記憶がある。
個人的にそもそもそんなキモいことやらないよと思ったので禁止の理由までは覚えてないが。
0815デフォルトの名無しさん (ワッチョイ 1301-hZ32)
垢版 |
2019/11/23(土) 08:12:23.68ID:IdTl1qyV0
>>813
> だから意味合いは違うって書いてんでしょうが
何にキレてるのか知らんけど、意味合いの違うものを引き合いに出すこと自体がおかしいって指摘されてることぐらいは理解しようよ
0817デフォルトの名無しさん (ワッチョイ 6963-+jxl)
垢版 |
2019/11/23(土) 11:11:29.56ID:gK3OO6AB0
意味合い違うものを出すのがおかしいなら807のレスがおかしいんだよ?
見やすいとか関係なくて776がこんな機能ないの?→無いよ→なんで欲しいの?→こういうのしたいんでしょ→見にくくね?気持ち悪くね?
って知るかよw
機能の話してんのになんで見易さの話にシフトすんだよ
見易さの話に変えられたので同じ表記の例示だしただけだし、そもそもlinqではないが採用してるライブラリも例示してんのになんでそこにこだわんの?w
0818デフォルトの名無しさん (アウアウイー Sa45-FRU3)
垢版 |
2019/11/23(土) 11:15:35.39ID:jZmYWOXfa
おおもとの>>776>>793の疑問についてはusingでエイリアスをつけて
『using [別名] = [VeryLongLongClassNameとか別名をつけたいクラス名];』と宣言して、
『[別名] Foo() { return this; }』みたいなメソッドの書き方することはできるし、
その別名に「This」を使ってるようなソースもたまに見かける

なんだけど・・・そもそも戻り値が特にないからとりあえず安易にthisを返すみたいな考え方は間違ってる
戻り値がないならvoidにして無駄な戻り値を返さない
そのクラスがBuilder的な使い方をするクラスである場合に限って、
そういうクラスであることをクラス名ほかで明示したうえで首尾一貫して全voidメソッドでthisを返す
>>782みたいな考え方で戻り値がthisなのか新しいインスタンスなのかブレるかもしれないのは論外
戻り値が後者なメソッドが混ざってると>>807の2種類の書き方で結果が同一にならなくなる
0819デフォルトの名無しさん (ブーイモ MMcb-+o02)
垢版 |
2019/11/23(土) 11:33:01.08ID:fy5uwVSkM
Fluent apiってthisを返すことが目的じゃないからな
メソッドチェインで宣言的っぽくプログラミングするためのアイデアであってthisを返すメソッドはそのサブセットでしかない
世に出てるライブラリを見ればわかるがthis以外もバンバン返してる
だから作法としてとりあえずthisを返すなんてのは何もわかってない全く馬鹿げたことだ
先にFluent apiの設計をしなければならない
その設計に必要ならthisを返すメソッドを加えるだけだ
0821デフォルトの名無しさん (ワッチョイ 6963-+jxl)
垢版 |
2019/11/23(土) 12:07:14.69ID:gK3OO6AB0
>>820
話題を変えたから見た目の話してんのに機能面に難癖つけてるの分かってる?
見た目はこれと一緒、機能はちがうけどね
ってレスしたらそれは機能が違う!って戻してんじゃんw

見た目も機能も同じtweenerという例示
見た目の話に切り替えたので見た目は同じだが機能は異なるlinqという例示
念の為機能は異なることも明記した上での提示に対して機能面についてあーだこーだ言われてもねぇ
0822デフォルトの名無しさん (ワッチョイ 69a0-x9/g)
垢版 |
2019/11/23(土) 12:14:24.40ID:WMLRYpBj0
喧嘩すんなよ。

いろいろな観点から指摘が入って、設計やスタイルに関する考察が深まるのはいいことだ。

揚げ足取りとか噛み付きとか不毛だからやめような。
0823デフォルトの名無しさん (ワッチョイ 9138-4UII)
垢版 |
2019/11/23(土) 12:25:25.02ID:2fNzxcKi0
コードレビューするなら
本質的な機能では無いのに戻り値返すのは利用者の理解を妨げる上に、バグの元にもなるので、余計な事すんなと言うな

あとから戻り値欲しくなった途端に困るやろ
0824デフォルトの名無しさん (ワッチョイ 6963-+jxl)
垢版 |
2019/11/23(土) 12:58:03.05ID:gK3OO6AB0
今までレスしてる中でthis返す設計に肯定的な姿勢なのは元の質問者である782だけ
C#標準にそういう設計は無いからその利用者の多くは否定的になる、俺も含めて

世の中いろんな設計指針があるし他言語の流儀を真似することもある
同じチームで開発することになるならその辺りはできるだけ同じ方向を向きたいけれど、そういうのじゃなければ最終的にはお好きなようにとなるよね
0825デフォルトの名無しさん (ワッチョイ 1301-hZ32)
垢版 |
2019/11/23(土) 13:19:13.45ID:IdTl1qyV0
>>821
バカなの?
> linqはパイプみたいに順次処理して行くからまだ理解できるんだけど
って書いてあるだろ
そういう必然性のない
> 設定が多いものをチェインメソッドで必要な設定を好きな順番で書く
を同一視してるのがおかしいの
わかった?
0827デフォルトの名無しさん (アウアウイー Sa45-FRU3)
垢版 |
2019/11/23(土) 13:39:42.87ID:jZmYWOXfa
揚げ足取りだけど&Javaからの輸入だけど
>C#標準
つStringBuilder

もっとも自分でコード書くなら(変数名が短い前提で)メソッドチェーンにはしないけど
「文字列組み立ての順序を明示する」意図でメソッドチェーンで書くのはまあ理解できる
0828デフォルトの名無しさん (ワッチョイ 6963-+jxl)
垢版 |
2019/11/23(土) 13:44:55.41ID:gK3OO6AB0
linqもtweenerみたなのもメソッドをドットでつなげて表記する
データを加工して流すものとthisを返すものという機能面では全く異なるもの
機能と見た目を完全に切り離せるわけではないので、その見た目から機能面を理解しづらい=可読性に影響があるという議題は残るものの、どちらも利用する上での表記は同じ

ただこれだけで当初から機能は異なることを明記してるのになんで機能違うじゃねーか!みたいなすでに注釈してる内容に噛み付いてくるんだ
0831デフォルトの名無しさん (ワッチョイ 69a0-x9/g)
垢版 |
2019/11/23(土) 14:39:10.21ID:WMLRYpBj0
>>827
fact を提示するのは揚げ足取りではないと思うよ。

return this は言われるほど悪いものではないと個人的には思う。が、メソッドチェーンにする価値は LINQ に比べるとさしてないという意見にも同意。
0832デフォルトの名無しさん (ワッチョイ 6963-+jxl)
垢版 |
2019/11/23(土) 14:40:26.89ID:gK3OO6AB0
>>830
うん、使わなくてよくね?
使うべきとも使ったほうが良いとも書いてない
そういうライブラリがこの世に多少は存在することを例示しただけ
そもそも俺自身がthis返す設計に否定的だって何度も書いてるんだけど読んでる?
0833デフォルトの名無しさん (ワッチョイ 9301-wiXz)
垢版 |
2019/11/23(土) 15:10:38.43ID:8xX8HZu80
他言語だけどスクレイピングでよく使う

browser
.GotoHome()
.Login()
.DoSomething()
.DoAnother()
.SkipSomething()
.PrintResult()

コンテキストのつながりが自分にとって自然で
各メソッドを部品としてチェリーピックして使うような場合は
読みやすくなると思ってる

結局 return thisの是非じゃなく
メソッドチェーンでつないでいくのが適してる用途なのか
そうじゃないのかの話だよねこれ
0837デフォルトの名無しさん (ワッチョイ 1301-hZ32)
垢版 |
2019/11/23(土) 17:56:40.63ID:IdTl1qyV0
>>835
> じゃあなんで絡んだんだよw
ちゃんと書いてあるだろ…

> 必然性の有無にも気づけずにLinqガーとかいうアホがいたって話だしw

見た目の話だけなら個人の好みだから人それぞれでいいけどLinqとかの必然性があるものを持って来られても困る
0838デフォルトの名無しさん (ワッチョイ 6963-+jxl)
垢版 |
2019/11/23(土) 18:13:01.41ID:gK3OO6AB0
>>837
いや、だからなんで俺の意見はどうでも良いはずなのに未だに絡むの?
何を説明しようがどうでもいいで片付けるんだから話にならないじゃんw

もう一回説明しようか?
linqと見た目が一緒、機能は異なる
ただそれだけなんだけど伝わらない?これも意見だからどうでも良いんだと思うけど
ずーっとこう主張してるのになんでlinqは必然性があるから良いんだ!みたいな頓珍漢な絡みするの?
0839デフォルトの名無しさん (ワッチョイ 1301-hZ32)
垢版 |
2019/11/23(土) 18:19:16.92ID:IdTl1qyV0
>>838
まじで日本語の理解力がなさすぎ
(引っ込みつかなくなってるだけかも知れんがw)

> うん、使わなくてよくね?
という君の意見はどうでもいい
Linqは>>811が書いてる通り
> LINQでつなげる場合はLINQメソッドの戻り値を意識しながらつなげるわけだから、話が違うじゃん
ってことな
0840デフォルトの名無しさん (ワッチョイ 6963-+jxl)
垢版 |
2019/11/23(土) 18:31:57.35ID:gK3OO6AB0
>>839
いや、だからそんなことわかりきってるよw
807で君が言った内容に対して表記が同じとしか言ってない
ちゃんと機能が異なることを追記した上で同じ表記だね、って言っただけでしょ?

それに対して延々と同じ内容で煽り続けてるんだよ?
linqは意味が違うよっていう808からの始まった内容に対してlinqは意味が違う!馬鹿なの?って
もっかい始めの方からレス内容確認したほうが良いよ
言葉尻捕まえて煽るだけで引っ込みつかなくなってるのはたぶん君の方だよ
0842デフォルトの名無しさん (ワッチョイ 1301-hZ32)
垢版 |
2019/11/23(土) 18:41:15.69ID:IdTl1qyV0
もう堂々巡りにして引き分けに持ち込もうと必死だな
Linqならメソッドチェーンにする意味があるから
> tweenerみたいな設定が多いもの
と一緒にされても困るって何度書いても同じこと書いてくるんだろうなw
0843デフォルトの名無しさん (ワッチョイ 6963-+jxl)
垢版 |
2019/11/23(土) 18:46:16.32ID:gK3OO6AB0
機能の話から表記の話なってまた機能の話に戻す
表記の話のときに表記が同じ例を提示すると機能が違うんだから同じにすんな!
ってそりゃそうですよね、機能は違うってみんな言ってますもん
機能が同じだなんてレスどこにありました?
0844デフォルトの名無しさん (ワッチョイ 6963-+jxl)
垢版 |
2019/11/23(土) 19:45:54.89ID:gK3OO6AB0
804:機能の話
807:機能から発展した表記の話
808:表記の類似例の提示
811:機能ちげーじゃんというツッコミ
813:そうだよ機能は違うよという返し
ここから延々、表記の類似例に対して機能が違うじゃんというツッコミ
811は807とは違う人だけどね

807でも機能の話をしてたと言うなら俺の読解力が悪かった
表記の話であることを明確にするために808に意味合いが異なると注記したつもりではあった
今見返しても表記に関しての話題転換にしか見えないけど
0848デフォルトの名無しさん (ワッチョイ 1301-hZ32)
垢版 |
2019/11/23(土) 19:59:52.48ID:IdTl1qyV0
まだ言ってるのかよw

> 機能が違うからダメと言うより必要もないのにチェインメソッド使わなくても良くね?
> って話な
って書いてあるのに「機能が違う」を連呼するしかない脳無し乙
0849デフォルトの名無しさん (ワッチョイ 7117-/L9V)
垢版 |
2019/11/23(土) 20:07:04.96ID:Q44dea670
>>1
>なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
>C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください

ID真っ赤にしている人はコレ100回読んでね
0850デフォルトの名無しさん (ワッチョイ 69a0-x9/g)
垢版 |
2019/11/23(土) 20:20:39.76ID:WMLRYpBj0
お互い口汚く罵るのはやめよう。どちらも有益な情報を持ち込み、スレに貢献してると思うよ。

>>844
機能と表記の 2 観点からの考察ありがとう。君の主張は首尾一貫していて妥当だと思うよ。
私は return this 完全否定はしないけどね。

>>842
tweener なるものが何か知らないのだが、設定の手数の観点で C# と比較できるものではないということはわかった。ありがとう。

私が return this を時折使う理由も設定の手数あたりにあるかもしれないと思った。

変数宣言&インスタンス初期化を “本処理とは分けて” ワンライナーで書きたいのだが、初期化の手数が多いときに return this 使うよ。

var a = new ClassA().Init1().Init2().Init3();
var b = new ClassB().Init(a);

// a, b, その他の変数を用いた本処理

という感じで。

初期化と本処理をごちゃ混ぜに書くと本処理の本質が見えづらくなるため好きではないし、if, for などで新しいブロックが出てくるわけでもないのにコンテクストの途中で新規変数宣言するのも好きではない。純粋に表記スタイルの (好みの) 話。
0851デフォルトの名無しさん (ワッチョイ 93bd-AvZR)
垢版 |
2019/11/23(土) 20:21:25.84ID:zU8fto2w0
まあLINQはさておき
前者と後者じゃ後者のほうがスッキリして見える場合もあるんじゃないかなとは思う

hoge.foo();
hoge.bar();
hoge.baz();
hoge.quz();

hoge
  .foo()
  .bar()
  .baz()
  .quz();

セミコロン必須の言語やif文とは相性そんなに良くないけどさ
0852デフォルトの名無しさん (ワッチョイ 6963-+jxl)
垢版 |
2019/11/23(土) 20:27:14.79ID:gK3OO6AB0
>>850
tweenerはたぶんゲーム分野とかで使うことが多いと思うけど表示物のアニメーション制御に使うようなライブラリを指して言った
最近はweb系もアニメーションには富んでるからそっちにも似たようなものはある

表示物のx座標をaからbにc秒かけて移動させる、そのときd秒遅れてアニメーションを開始して終了後にe関数を呼ぶ
みたいな設定をするのに使う
0855デフォルトの名無しさん (アウアウウー Sa9d-927E)
垢版 |
2019/11/23(土) 21:33:29.44ID:TBCDcXkja
まあ罵倒は見てて見苦しいねw

thisを返す手法に違和感を感じる人(自分もその一人)が多いのは、

(1) シグジェチャだけではメソッドが返す値がthisなのか別のインスタンスなのか分からない
(2) チェーンさせる目的でthisを返すのは意味論(メソッド名はそのメソッドの機能を表現する)を破壊する

こんなところか。

本来は必用なら言語レベルで実現すべき機能なんだろうね。
でもC#erってVBのWithブロックには否定的な人が多かったよな
0856デフォルトの名無しさん (ワッチョイ 13b9-0DuE)
垢版 |
2019/11/23(土) 22:00:39.91ID:6Id8VYs40
相談させてください。
以下のようなクラスを作りたいと考えています。

class MyStaticClass1
{
  static double HighCostMethod() { ... }

  public static double X = Math.Sign(HighCostMethod());
  public static double Y = Math.Abs(HighCostMethod());
}

しかし高コストな HighCostMethod を2回も呼びだすのは無駄なので
以下のように改良しました。

class MyStaticClass2
{
  static double HighCostMethod() { ... }

  public static double X, Y;
  static MyStaticClass2()
  {
    var v = HighCostMethod();
    X = Math.Sign(v);
    Y = Math.Abs(v);
  }
}

ところがこのコードは規則 CA1810 に違反すると警告が表示されました。
静的コンストラクターにはパフォーマンス上の欠点があるようなのです。
【CA1810 参照型の静的フィールドをインラインで初期化します - Visual Studio Microsoft Docs】
https://docs.microsoft.com/ja-jp/visualstudio/code-quality/ca1810?view=vs-2019
(続く)
0857デフォルトの名無しさん (ワッチョイ 13b9-0DuE)
垢版 |
2019/11/23(土) 22:01:03.42ID:6Id8VYs40
(続き)
そこでさらに次のように改良したところ、無事警告は表示されなくなりました。

class MyStaticClass3
{
  static double HighCostMethod() { ... }

  public static double X = Initialiser.Instance.X;
  public static double Y = Initialiser.Instance.Y;

  class Initialiser
  {
    public static Initialiser Instance = new Initialiser();

    public double X, Y;
    Initialiser()
    {
      var v = HighCostMethod();
      X = Math.Sign(v);
      Y = Math.Abs(v);
    }
  }
}

ただ、クラス初期化時のパフォーマンス上の問題を解消するために
さらに別のクラスを定義するのは本末転倒な気もします。

私のアプローチは正しいのでしょうか。
それとも素直に CA1810 の警告表示を抑制すべきでしょうか。
もしくは、別のもっとスマートな解決策があるのでしょうか。
アドバイス等をいただけると嬉しく思います。よろしくお願いいたします。
0858デフォルトの名無しさん (ワッチョイ 6963-+jxl)
垢版 |
2019/11/23(土) 22:01:38.76ID:gK3OO6AB0
俺自身もthis返す設計に否定的で813で明確に表明してるんだけどねw
850の初期化の例みたいなのもC#ではメソッドに引数名を指定して呼び出すことができる機能があるからそれで事足りる
引数の数が多くなったりオプション引数使えば更に長くなったり呼び出し側も見た目はスマートとは言えないような書き方になったりするんで多用は避けたいところだけど局所的な利用なら無しでは無い気もする
まぁ設定用の構造体作って渡すとかjson等をシリアライズしたものを渡すとかのほうがいいんじゃない?とは思う
0859デフォルトの名無しさん (ワッチョイ 132c-4eZD)
垢版 |
2019/11/23(土) 22:08:25.71ID:fygFNKSM0
>>856
>高コストな HighCostMethod を2回も呼びだすのは無駄なので

典型的なシングルトン。
データベースマネージャーとか、何かを管理するクラスは、基本的に1回しか実行しない

init( ) みたいな、特別な関数でしかnew できない。
通常の方法では、newできないように、エラーになるように作る
0862デフォルトの名無しさん (ワッチョイ 13b9-0DuE)
垢版 |
2019/11/23(土) 22:25:20.74ID:6Id8VYs40
>>859
レスありがとうございます。
おっしゃるとおり、シングルトンを使えば問題は解決するだろうと考えて
作成したのが MyStaticClass3 なのですが、
MyStaticClass3 が MyStaticClass2 よりも
パフォーマンス的に優れていると考えられなくて
質問させていただきました。

> init( ) みたいな、特別な関数でしかnew できない。
> 通常の方法では、newできないように、エラーになるように作る
ここで説明していただいているお話と
MyStaticClass3 の中身の違いがよく理解できていないので
詳しく教えていただけないでしょうか。
よろしくお願いいたします。

>>860
レスありがとうございます。
HighCostMethod()の結果をキャッシュするための装置として
MyStaticClass3.Initializer を作ったつもりなのですが、
改良点などがあればご指摘いただけると幸いです。
よろしくお願いいたします。

>>861
なるほど!レスありがとうございます。
ただ、一時的に値を保持するためにフィールドを使うのは
少し抵抗があるきもするのですが、よく使われる手法なのでしょうか。
また、一つのクラスを複数ファイルに分けて記述できることを考えると、
フィールドの初期化は必ず上から順に行われることが
保証されているのかということについても少し不安があるのですが、
もし何か参考資料などをご存知なら教えていただけると嬉しく思います。
よろしくお願いいたします。
0863デフォルトの名無しさん (ワッチョイ 1301-hZ32)
垢版 |
2019/11/23(土) 22:40:06.43ID:IdTl1qyV0
>>851
そう、そう言う風に純粋に見た目の話をしてるのにチェインメソッドにするしかない(まあ一旦変数に受けりゃいいんだけど流石にそれはねぇ)Linqを出されてもねぇ
Linqをバカにされたとでも思ったのかな?
それはさておき、たしかに同じ変数を何度も書かされるのはなんとなく冗長な感じがするからWith文みたいなのが欲しいのは理解できる
そのうちオブジェクト初期化子でメソッドが呼び出せるようになったりして
var a = new ClassA().Init1().Init2().Init3();
var b = new ClassB().Init(a);

var b = new ClassB(){
 Init(new ClassA(){ Init1(), Init2(), Init3() })
};
0864デフォルトの名無しさん (アウアウウー Sa9d-927E)
垢版 |
2019/11/23(土) 22:41:20.33ID:TBCDcXkja
VS2015だとCA1810 なんか出ないなw
出るとしても警告を抑止して問題ないケースだと思うけど
0867デフォルトの名無しさん (アウアウウー Sa9d-Q1nT)
垢版 |
2019/11/23(土) 22:50:15.57ID:IgdFxqh4a
>>862
「一つのクラスを複数ファイルに分けて記述できること」はpartial classを指していると思うんだけど、その場合はちょっと分からん
ただpartialでない普通のクラスの場合は、初期化は記述順(上から順)に行われることが保証されている
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/classes#fields
> The static field variable initializers of a class correspond to a sequence of assignments that are executed in the textual order in which they appear in the class declaration
0868デフォルトの名無しさん (アウアウウー Sa9d-927E)
垢版 |
2019/11/23(土) 23:07:33.85ID:TBCDcXkja
これはOKみたい。

static double x;
static double y =
(
  (Func<double>)
  (
    () =>
    {
      var v = HighCostMethod();
      x = Math.Sign(v);
      return Math.Abs(v);
    }
  )
)();

もちろん俺ならこんなことしないw
素直に警告無視or抑止するのが一番いい。
無駄なことして可読性落とすなんて愚の骨頂
0869デフォルトの名無しさん (ワッチョイ 13b9-0DuE)
垢版 |
2019/11/23(土) 23:15:13.03ID:6Id8VYs40
>>864
情報どうもありがとうございます。
Visual Studio のバージョンに依存する話だったのですね。
私は Visual Studio 2019 (Version 16.3.10) を使っています。
情報が後出しになってしまい失礼いたしました。

> 出るとしても警告を抑止して問題ないケースだと思うけど
ご意見ありがとうございます。 >>856 に貼り付けたリンクの先にも
「パフォーマンスが問題にならない場合は、このルールの警告を抑制しても安全です。」
と書いてありますし、やはり抑制が最善の方法であるような気もしてきました。

>>865
> プロパティ
アドバイスどうもありがとうございます。
string.Empty の様に、プロパティである必要がないものは
フィールドにしたほうがパフォーマンス的に有利かと思って
そのようにしていたのですが、確かにプロパティが一番真っ当ですね。

> Lazy<T>
ありがとうございます。ただ、私の考える限り以下のような方法しが思いつかず、
だったら >>861 に書いていただいたもので良いのではと思ってしまうのですが、
もし Lazy<T> を使った別の方法があれば詳しく教えていただけると嬉しく思います。
static Lazy<double> Cache = new Lazy<double>(HighCostMethod);
public static double X = Math.Sign(Cache.Value);
public static double Y = Math.Abs(Cache.Value);
0870デフォルトの名無しさん (ワッチョイ 13b9-0DuE)
垢版 |
2019/11/23(土) 23:15:35.51ID:6Id8VYs40
>>867
おお!情報どうもありがとうございます。大変勉強になります。
そうであるなら、Cache のフィールドが残ることが気にならないか、
もしくは Cache も後々使うなら >>861 に書いていただいた方法が
最善になりそうですね。

>>864
なるほどw 警告も万能ではないとういことですね。
説得力のある面白い例を示していただきどうもありがとうございます。
0873デフォルトの名無しさん (アウアウウー Sa9d-927E)
垢版 |
2019/11/23(土) 23:25:48.76ID:TBCDcXkja
>>871
CA1810のページによると、staticフィールドの初期化はいずれかのstaticフィールドに
最初にアクセスされる前に行われるとなってるから、それはないのでは?

知らんけど
0874デフォルトの名無しさん (ワッチョイ 13b9-0DuE)
垢版 |
2019/11/23(土) 23:40:24.93ID:6Id8VYs40
>>872
サンプルを書いてくださっていたのですね。大変失礼いたしました。
ただ、やはり Lazy<T> を使うメリットが理解できずにいます。
MyStatic が初期化される時点で _highCost が初期化されて、
その後すぐに _highCost.Value が呼び出されるのであれば、
>>861 に書いていただいた方法で十分な気がするのです。

>>873
おっしゃるとおりだとおもいます。
ところで少し考えてみて、場合によっては冗談ではなく

public static double X, Y = InitializeYAndX();
static double InitializeYAndX()
{
  var v = HighCostMethod();
  X = Math.Sign(v);
  return Math.Abs(v);
}

みたいな書き方が選択肢になり得ることもあるような気がしてきました。
もしくは、実際にはフィールドは readonly にしたい場合が多いと思うので

public static readonly double X, Y = InitializeYAndX(out X);
static double InitializeYAndX(out double x)
{
  var v = HighCostMethod();
  x = Math.Sign(v);
  return Math.Abs(v);
}

のような感じとか。
0875デフォルトの名無しさん (ワッチョイ 6963-+jxl)
垢版 |
2019/11/24(日) 00:02:41.75ID:kdnOmkRS0
>>874
個人的に警告を回避するために普段しない書き方をするのは違うと思う
警告の内容を理解し、それが今回のケースでは問題ないと判断できるなら遠慮なく警告を抑制していいと思う

プログラム起動時に自動的に初期化されるstaticとプログラマが初期化タイミングを制御できるsingleton
起動コストが問題なくてstaticが妥当なら警告抑制を選択するかな
0876デフォルトの名無しさん (ワッチョイ 9301-wiXz)
垢版 |
2019/11/24(日) 00:02:47.40ID:ajYX9vGJ0
>>874
LowCostMethodも追加してみた
https://dotnetfiddle.net/Be6wMy

名前の通りLazy LoadingとかLazy Initializationとかいうのをするためのもので
必要になった時に初期化されてなければ初期化して、初期化済みなら初期化済みの値を使う
MyStaticクラスが初期化される時点で_highCostが初期化されるわけではない

getプロパティで
if ( cache == null ) { cache = HighCostMethod(); }
return cache;
するのと意味的には同じでdefaultでthread-safe
詳しくは>>862の2つ目のリンクに書いてある

あともし他人も使うコードなら潜在的に高コストな処理は
フィールドやプロパティじゃなくメソッドにしといたほうが無難
0877デフォルトの名無しさん (ワッチョイ 13b9-0DuE)
垢版 |
2019/11/24(日) 00:26:34.20ID:ilfNxwrd0
>>875
> 個人的に警告を回避するために普段しない書き方をするのは違うと思う
> 警告の内容を理解し、それが今回のケースでは問題ないと判断できるなら遠慮なく警告を抑制していいと思う
アドバイスどうもありがとうございます。確かにおっしゃるとおりですね。
この考え方で、警告を抑制する方向で行こうと思います。

> プログラム起動時に自動的に初期化されるstaticとプログラマが初期化タイミングを制御できるsingleton
static はプログラム起動時に初期化されるんでしたっけ?
ただいずれにしても、コストが非常に高い場合は
明示的に初期化のタイミングを指定できるように気をつけたいと思います。

>>876
詳しいご説明ありがとうございます。
「MyStatic が初期化される時点で _highCost が初期化されて」
という表現は正しくありませんでした。失礼いたしました。

ただ、お書きいただいたコードでは
private static readonly Lazy<double> _highCost = new Lazy<double>(HighCostMethod);
の直後に
public static double X = Math.Sin(_highCost.Value);
public static double Y = Math.Abs(_highCost.Value);
が実行されるので、例えば
private static readonly double _highCost = HighCostMethod();

public static double X = Math.Sin(_highCost);
public static double Y = Math.Abs(_highCost);
に書き換えても同じではないでしょうか?

> あともし他人も使うコードなら潜在的に高コストな処理は
> フィールドやプロパティじゃなくメソッドにしといたほうが無難
アドバイスどうもありがとうございます。言われてみて、確かにそのとおりだと思いました。
コストの高さに応じて適切な書き方が選択できるように勉強したいと思います。
0879デフォルトの名無しさん (アウアウウー Sa9d-927E)
垢版 |
2019/11/24(日) 02:24:11.12ID:8mt5PJRXa
もう誰かとっくに書いてるだろうけど、やっぱり本来は重くなる可能性があるなら
フィールドやプロパティーじゃなくてメソッドにすべきなんだろうね。知らんけど

static double _x, _y;
static Action InitializeXY = () =>
{
  var v = HighCostMethod();
  _x = Math.Sign(v);
  _y = Math.Abs(v); ;
  InitializeXY = null;
};

public static double GetX()
{
  InitializeXY?.Invoke();
  return _x;
}
0883デフォルトの名無しさん (アウアウウー Sa9d-5f43)
垢版 |
2019/11/24(日) 10:25:13.16ID:0nk530rxa
大原則?
オブジェクト指向の原理主義的にはそもそもgetterを作るべきではないんだよ
getterを使うのは上司がタバコを吸いたいときに不器用な部下にしびれを切らして「お前、もういいからお前のライター寄越せ」
と言っているようなもので、オブジェクトから本来担うべき責務を剥ぎ取ってしまっている
火をつけろと命令を投げっぱなしにしておけば勝手に火をつけてくれるのが本来のオブジェクト指向の姿
0891デフォルトの名無しさん (ワイーワ2 FF63-KqLj)
垢版 |
2019/11/25(月) 14:22:13.25ID:pjJuONFZF
負の数混ぜてないか
0892デフォルトの名無しさん (ワッチョイ d901-QS5Z)
垢版 |
2019/11/26(火) 16:49:39.39ID:/t5k7Bse0
フォルダファイルの情報集めてデータベース作りたいんですけど
データベースの種類って何がいいのかな?
3万件ぐらいのレコード、外部に持っていくこともしない
よろちしおねがいします
0897デフォルトの名無しさん (オッペケ Src5-BEIG)
垢版 |
2019/11/26(火) 17:53:20.38ID:GH1P3tUMr
linuxにはlocateコマンドと言うものがあってファイルを高速に検索できる
これはただあらかじめフルパスのファイル名を全部取っておいて一つのテキストファイルにまとめてあるだけ

用途次第で最適な方法は異なる
0899デフォルトの名無しさん (ワッチョイ d901-QS5Z)
垢版 |
2019/11/26(火) 23:01:40.76ID:/t5k7Bse0
>>893
Redisなんてゆうデータベースあるんですね、一般的なのかな
さんくすしらべてみます
>>895
サンクスsqliteよく使われてますよね昔から
今でも普通に使われてるのかな?

>>894>>896-897
何がしたいのかとゆうと、外付けHDDの中身を書き出したい的な事がしたいのです
高性能なフリーウェアがあるとしても、自分でつくりたいのれす
0900デフォルトの名無しさん (ワッチョイ 6963-+jxl)
垢版 |
2019/11/26(火) 23:55:29.19ID:Rjqqllka0
いや、知りたいのはその書き出したファイル情報をどうしたいのか?なんだけど…
自分で作りたいというのが勉強を兼ねてるならsqliteとかでひとまず慣れるのが良いんじゃない?
0901デフォルトの名無しさん (ワッチョイ 9138-4UII)
垢版 |
2019/11/27(水) 00:05:09.92ID:a5fnDquJ0
教会作るのか扉作ってるのか木を切ってるのかっつー話よな

それはさておき
お手軽に使えるのはSQLiteでライブラリやマッパーも豊富
redisは高速でwebクラウド周りでは結構ちやほやされた
けどRDBとNoSQLの区別付いてるかは心配やな

外付けHDDの中身…か…
0903デフォルトの名無しさん (ワッチョイ d901-QS5Z)
垢版 |
2019/11/27(水) 11:14:29.53ID:TFRzaUoP0
>>900
さんくす、SQlite?そんなの古くて誰も使ってないよ?みたいな状態が怖い
>>901
さんくす、とりあえず椅子を作りたい、用途に多少合わなくても使えるから
簡単な検索、重複ファイルの処理とか?
速度は遅くていいので、簡単で扱いやすいのがいいでつね
RDBで作ろうとおもってます
>>902
そんな感じになりそう、さすがにテキストファイルは作らないけど

sqlite使ってみようと思いますが、Microsoft SQL Serverってどうなんでしょう?
定番なんでしょうか?それとも難しいとか使いにくいとか
0904デフォルトの名無しさん (アウアウウー Sa9d-xPlI)
垢版 |
2019/11/27(水) 11:29:33.07ID:IQPQs9eCa
>>903
sqliteはローカルで閉じたお手軽DBとしてはまだまだ現役よ。ローカルDBのデファクトスタンダードと言っていいぐらい。
クライアントサーバのようなシステム作りたいなら不向きだけど。
0906デフォルトの名無しさん (ワッチョイ 7190-HqzV)
垢版 |
2019/11/27(水) 12:04:05.91ID:DM2fL27g0
sqliteは組み込みDBではメジャーだろ。androidアプリの標準ローカルDBがsqliteだし。iosのcoredbだって内部はsqlite使ってるだろ?
モバイルアプリでsqlite使われまくりだろ。

まぁ、最近はrealmだのあるが
0910デフォルトの名無しさん (ワッチョイ 9138-4UII)
垢版 |
2019/11/27(水) 15:28:58.26ID:a5fnDquJ0
>>903
win環境ならSQL Serverは最有力選択肢だよ
C#前提ならVisualStudioとも統合されてるし、簡単に扱えるので取り回しもしやすくて情報も多い

気になるのはやろうとしてることに対して、若干大げさな構成かなという点かな
RDBの経験積みたいのが目的に含まれるなら全然アリよ
0911デフォルトの名無しさん (オッペケ Src5-/L9V)
垢版 |
2019/11/27(水) 17:33:31.24ID:0UC6xAmXr
インストールとかもSQLServerのインストールと設定込みになるから大げさだよ
インストール先でSQLserverの管理も必要になる(セキュリティーホールに対するアップデートなど)

sqliteがいいと思うよ
0914デフォルトの名無しさん (ワッチョイ d901-QS5Z)
垢版 |
2019/11/27(水) 22:24:42.73ID:TFRzaUoP0
>>904
さんくすです、現役なら今から勉強しても無駄にはならなそうですね
>>905
Microsoftはたまに、それ誰得よってのがあるから怖い
>>906
さんくす、androidに使われてたらしばらく安泰でつね
>>908
ちょと調べてみたけど、きびしい、頭の片隅に
>>910,912
さんくす、SQLServerも間違ってはいないのですね
DB使うまでもなくオーバスペックっぽいけど、練習になるから
>911
導入がメンドイのと保守もいると、さんくすね
>909
firefoxで使ってるのみました、でもFFは設計古いままきてるからどうなのかなって
>913
VisualStudioにsqliteいれといてくれたらいいのにね

みなさんさんくす、現在のDBの立ち位置がわかって、方向性がだいたい決まりました
まずはsqlite導入してみようかな
0915デフォルトの名無しさん (エムゾネ FFb2-Qbqw)
垢版 |
2019/11/28(木) 15:03:25.97ID:1U78x1XWF
SQLiteって導入するほどのもんでもない
っていうか導入とかせんでも使えるし
0922デフォルトの名無しさん (ドコグロ MM71-MhVQ)
垢版 |
2019/11/28(木) 19:31:57.14ID:jLfyQeMzM
>>914
> VisualStudioにsqliteいれといてくれたらいいのにね
2019は知らんけど2017はVisual Studioのインストール時にSQL-Server LocalDBを入れるかどうかを聞いてきたような気がする
LocalDBは外部からの接続できないだけで中身はほとんどSQL-Server
Visual Studioからテーブル開いてデータを弄ることもできるしそこそこ便利よ
0930デフォルトの名無しさん (ワッチョイ f538-CTFU)
垢版 |
2019/11/28(木) 23:52:03.59ID:A6hZkiU20
>>927
nugetを入れると言う以前にVS使ってソリューションて作るとすぐ使える状態にあるし

SQLiteを始めとして外部ライブラリを導入するならnuget使うのはc#では基本ツールと言えるので、使えたほうが良い
パッケージ管理にnugetが最適かは置いておくとして
0933デフォルトの名無しさん (ワッチョイ 9242-3RYV)
垢版 |
2019/11/29(金) 08:44:50.30ID:k2xfmaZa0
sqliteやるとして、Dapperを使うかEF使うかは意見が分かれるところだね
ついでにSQLから始めるってことでDapperをお薦めしますが
EFはSQLを知らなくてもなんとかなるが、そのうち壁にぶち当たるだろうからね
0934デフォルトの名無しさん (アウアウウー Sacd-e3ak)
垢版 |
2019/11/29(金) 08:52:58.95ID:buffyidfa
SQLiteとEFの組み合わせはテスト専用だ
EFはサーバー用のフレームワークなのでSQLiteを使うようなスタンドアロンなアプリで使用されることは基本的にないし、
EFなんか被せたら軽量なSQLiteが台無し
0935デフォルトの名無しさん (アウウィフ FFcd-Qbqw)
垢版 |
2019/11/29(金) 12:06:03.16ID:N/f9f1S7F
SQL-Server Local DB って MSDE のこととちゃうんけ
0938デフォルトの名無しさん (アウウィフ FFcd-Qbqw)
垢版 |
2019/11/29(金) 12:30:30.51ID:N/f9f1S7F
間違ってなくて安心した
0940デフォルトの名無しさん (アウウィフ FFcd-Qbqw)
垢版 |
2019/11/29(金) 13:03:59.73ID:N/f9f1S7F
ありがとう
SQLite とは関係無いことは判った
SQLite の簡単さとは比べ物にならない
0942デフォルトの名無しさん (ドコグロ MM71-MhVQ)
垢版 |
2019/11/29(金) 19:40:54.65ID:/qBs46JEM
>>939
> Local DBはそれとインターフェイス互換性を持たせた別製品
> ExpressとCompactのあいのこみたいなもの
お前もテキトーなこと書くなよw
LocalDBはエンジンはExpressとほぼ同じで外部からの接続ができないだけ
Compactは全く別物で使えるSQLも異なる
0949デフォルトの名無しさん (ワッチョイ 0901-R3ru)
垢版 |
2019/11/29(金) 23:16:39.14ID:Z1Tig2XP0
>>930
さんくす、Nugetすごく簡単だねえ、ただ多すぎて迷う、coreにしてみた
>>931
わざわざさんくすね、LocalDBも入れてみるお
>>933
Dapperとゆう新たな単語が、、頭の片隅に

他の人もサンクス、あとは勉強してコード書くだけだね
0952デフォルトの名無しさん (ワッチョイ 0d7d-nO0S)
垢版 |
2019/12/01(日) 16:07:57.01ID:r7b9vkne0
ASP.NET Webフォームでオブジェクト指向な作りって出来ますか?Pageクラスを継承した画面ごとのクラスが基本となると思うんですが、それらとは別にドメインオブジェクトを定義すればいいんでしょうか?
古いフレームワークのせいか、参考になる情報がWeb上で見つからず困っています
0956デフォルトの名無しさん (アウウィフ FFcd-Qbqw)
垢版 |
2019/12/01(日) 17:30:22.41ID:zxgavQqmF
mdb は Access 無くても作れるし使える
wsh からも作れるし
python からでも win32com とか adodb とかで生成も操作も可能
0964デフォルトの名無しさん (ワッチョイ 2590-8b9h)
垢版 |
2019/12/02(月) 21:29:05.38ID:TV8SuK+L0
組み込みっていったっていまどきマルチスレッド当たり前で、要は
マルチユーザーでアクセスするのと同じなんだが、組み込みDBは行ロックが
ないのが痛すぎる。大きめのバッチ走らせると行ロックないから
他から更新できなくなるし。
0966デフォルトの名無しさん (ワッチョイ a22d-Mdr6)
垢版 |
2019/12/02(月) 23:30:52.06ID:kOdIgETi0
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メソッドに匿名のオブジェクトを作成して渡すのであれば、宣言を含めきちんと作成した後者のコードになるような気がしてしまいますが・・・・一体どういうことなのですか?
0969デフォルトの名無しさん (ワッチョイ a22d-Mdr6)
垢版 |
2019/12/03(火) 00:00:10.26ID:joV0JnEl0
>>967=968
ありがとう、こういうものだったのか
全然知らなかった助かったよ
0970デフォルトの名無しさん (ワッチョイ a54f-MSc7)
垢版 |
2019/12/08(日) 19:26:34.55ID:NRgw7da20
WindowsフォームのListBoxのアイテムの順番を
マウスでドラッグして移動出来たりはしないでしょうか?
0972デフォルトの名無しさん (ワッチョイ a54f-MSc7)
垢版 |
2019/12/08(日) 21:37:23.18ID:NRgw7da20
ありがとう!やってみる
0978デフォルトの名無しさん (ワッチョイ 1524-Fgt1)
垢版 |
2019/12/11(水) 11:18:11.21ID:mMKqVbip0
WPFのStack、WrapPanelなどのコンテナ上の余白クリック時にイベントを追加したいのですが、Background="#00000000"とすることでそれ自体は達成することが出来ました
しかし該当コンテナ上に配置されてるButtonなどのコントロールをクリックしたときもコンテナに追加したクリックイベントを拾ってしまいます
あくまで余白クリック時のみ発生させたいのですが、何か方法はないでしょうか?
0984デフォルトの名無しさん (ワッチョイ f050-RbSw)
垢版 |
2019/12/28(土) 00:46:39.13ID:oR/9kMuC0
めちゃくちゃ初歩的な話で恐縮ですが…
Visual Studio 2019でWPFアプリを作ってみようとして最初の最初でつまづきました
参考にしたURLは↓
C# で WPF を使った Hello World アプリ - Visual Studio | Microsoft Docs
https://docs.microsoft.com/ja-jp/visualstudio/get-started/csharp/tutorial-wpf?view=vs-2019

1.新プロジェクトを作成(WPF App(.NET Core))
2.ツールボックス > コモンWPFコントロールからTextBlockをデザインサーフェイス上に配置
3.配置したTextBlockを削除
4.再度、ツールボックスからTextBlockを配置
5.このスコープで重複する名前 'textBlock' を登録することはできません。 と言われエラーになる

コントロールの名称を変更すれば良いのだとは思いますが、
表面上は1つ目のコントロールなのにtextBlock2のような名前に変更しなければならないのは気持ちが悪いです
そもそも先に配置したコントロールを削除したのに重複エラーと言われてしまうのがよく解りません
一旦配置してしまうと、削除してもどこかにデータが残ってしまうのでしょうか?
0985デフォルトの名無しさん (ドコグロ MM46-BCWm)
垢版 |
2019/12/28(土) 09:45:41.95ID:pvVVcNyyM
XAMLを見て必要なら手で直せとしか
WPFのデザイナは貧弱であり、基本的にはデザイナは補助と割り切って手でXAMLを弄る必要があるし、それが認められている
WPFは既にメンテナンスモードに入っており、今後改善される見込みもない
あとWinFormsと異なりWPFではどうしても必要な場合を除きコントロールのNameは指定しないのが基本
0986デフォルトの名無しさん (ワッチョイ f050-RbSw)
垢版 |
2019/12/28(土) 11:07:45.18ID:oR/9kMuC0
>>985
おっしゃっている"手で直す"とは、どこのことでしょうか?
例として、
1.TextBlockをデザイナに追加
2.TextBlockタグのx:Nameを"textBlock5"に変更
3.TextBlockを削除(マークアップ側のTextBlockタグも消える)
4.再度TextBlockをデザイナに追加(マークアップ側にTextBlockタグが追加される)
5.TextBlockタグのx:Nameを"textBlock5"に変更
6.重複エラー
このようになるのですが、やはり textBlock5 がどこに残っているのか見つけられません
現在のプロジェクトを対象に"textBlock5"を検索してみましたが見つかりませんでした

プロジェクト作成時はxamlが↓のようになっており
<Window x:Class="HelloWPFApp.MainWindow"
中略
Title="MainWindow" Height="450" Width="800">
<Grid>

</Grid>
</Window>
コントロールを追加するとGridタグ内にタグが追加されます↓
<Grid>
<TextBlock x:Name="textBlock" HorizontalAlignment="Left" Margin="159,236,0,0" Text="TextBlock" TextWrapping="Wrap" VerticalAlignment="Top"/>
</Grid>

参考URLのマークアップでは x:Name="textBlock" が記述されていなかったため、その部分を削除したところエラーは消えました
>コントロールのNameは指定しないのが基本
というのは、ここのx:Nameのことでしょうか?

ただ、上記の通り重複している名前がどこに残っているのか解らないため
根本的な解決になっていません
0987デフォルトの名無しさん (ワッチョイ 2fad-eHIc)
垢版 |
2019/12/28(土) 11:15:27.00ID:rkUgfi/c0
xaml は xml(テキスト)ファイルだから、テキストエディタで開いてその名前で検索してみれば見つかるんじゃないの。
見つけたら余計な設定があるはずなので、それを読み取って自力で削除すれば。
ってことでは。
0988デフォルトの名無しさん (ワッチョイ f050-RbSw)
垢版 |
2019/12/28(土) 11:24:05.48ID:oR/9kMuC0
>>987
986の書き方では良くなかったでしょうか
xamlファイルの中身は
<Window x:Class="HelloWPFApp.MainWindow"
中略
Title="MainWindow" Height="450" Width="800">
<Grid>

</Grid>
</Window>
となっていて、コントロールを追加するとGridタグ内にタグが追加されます↓
<Grid>
<TextBlock x:Name="textBlock" HorizontalAlignment="Left" Margin="159,236,0,0" Text="TextBlock" TextWrapping="Wrap" VerticalAlignment="Top"/>
</Grid>
コントロールを削除すると、TextBlockタグも消えます
コントロールの追加/削除で変更があるのはこの行だけです
その後、現在のプロジェクトを対象としてx:Nameに指定してあった値を検索しても見つからなかったんです
xamlファイルをテキストエディタで開き直しても中身は同じです
0989デフォルトの名無しさん (ワッチョイ 4624-K0SF)
垢版 |
2019/12/28(土) 11:31:09.48ID:iFSWdOZd0
>>986
XamlデザイナではC#エディタと違ってどこで重複してるのかまでは教えてくれないね確か
でもエラー箇所は下線が付くはずだからそれで見つけられるはず
x:Name=""やName=""は名指しでのアクセスが必要にならない限りは指定しないのが普通
そのコントロールでのイベントからのアクセスなら、例えば<Button Click="buttonClick" />なら下記のようにsenderをキャストすることによってアクセス出来るので、Name属性はそうそう必要にならないはず
private void buttonClick(object sender, RoutedEventArgs e)
{
var button = (Button)sender;
}
0990デフォルトの名無しさん (ワッチョイ f050-RbSw)
垢版 |
2019/12/28(土) 14:57:45.16ID:oR/9kMuC0
「x:Name="" は基本的には不要」という話は解りました
何度も書いていますが、デザイナにコントロールを配置した時点で自動生成されるコードにx:Nameが存在しているのであって
私が追記したものではありません

それはそれとして、重複エラーになってしまうことの根本的な解決法が知りたいのです
0991デフォルトの名無しさん (ワッチョイ f050-RbSw)
垢版 |
2019/12/28(土) 16:10:36.19ID:oR/9kMuC0
自己解決しました
恐らくデザイナに追加した時点でメモリにロードされ
コードを削除してもメモリ上にデータが残っているので重複とされてしまうようです
一旦xamlファイルを閉じ、開き直してからコントロールを追加するとエラーになりませんでした
0994デフォルトの名無しさん (ワッチョイ e2ad-SvJ4)
垢版 |
2019/12/29(日) 00:55:27.84ID:wQPPCmQj0
>>992-993
既存の開発終えるならそう書くしかなかろう
そんでもってあなたが入門者にMSがそう書いていたら使うでしょう
そもそも既存のWPFが完成品なのかと言われると・・・
0997デフォルトの名無しさん (ドコグロ MM36-BCWm)
垢版 |
2019/12/29(日) 16:33:44.41ID:J2Lmqp1KM
それを言ったらWPF自体が…
だいたい、既存のWPFアプリケーションをSCDで塩漬けにすることでMSや開発者がメンテから解放されるというのが.NET Core移植の目的なわけで、
そもそも新規に使うもんじゃないんだよ
デザイナなんか本来要らないの
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 83日 13時間 18分 29秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

ニューススポーツなんでも実況