ふらっと C#,C♯,C#(初心者用) Part137
■ このスレッドは過去ログ倉庫に格納されています
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。 他のスレッドでは書き込めないような低レベルな質問、 質問者自身なんだか意味がよく分からない質問、 ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。 内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。 なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。 C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください >>980 を踏んだ人は新スレを建てて下さい。 >>980 が無理な場合、話し合って新スレを建てる人を決めて下さい。 ■関連スレ C#, C♯, C#相談室 Part95 http://mevius.5ch.net/test/read.cgi/tech/1508180530/ C#, C♯, C#相談室 Part93 https://mevius.5ch.net/test/read.cgi/tech/1492818720/ ■前スレ ふらっと C#,C♯,C#(初心者用) Part136 http://mevius.5ch.net/test/read.cgi/tech/1520057345/ ■コードを貼る場合は↓を使いましょう。 http://ideone.com/ https://dotnetfiddle.net/ ■情報源 https://msdn.microsoft.com/ja-jp/library/gg145045.aspx https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index https://msdn.microsoft.com/en-us/library/gg145045.aspx http://referencesource.microsoft.com/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured 静的に呼びだすなら5つのAPI FindResource() LoadResource() SizeofResource() LockResource() FreeResource() 動的に更新するなら更に3つ BeginUpdateResource() EndUpdateResource() UpdateResource() >>701 こういう奴が頻繁に現れるのを見るとYAGNIの罪は大きいなって思う 別に複数でもそんな多くなければイベントでも問題ないんじゃねぇかな >>714 ありがとうございます、それぞれのAPIについて調べてみます 結局バランスの問題だな。もちろん人によってバランス違うけど。 イベントによって結果再利用性あがるけど、 >イベントで実装した方がずっとコンパクトかつ可読的に書けることが分かると思うよ。 の通り、可読性の観点からしてもイベントの方が分かりやすいと思う。 これぐらいもYAGNIとかいってるようじゃ、極端すぎてバランス感覚おかしいんじゃねぇかな。 >>718 極端なのは君だと思うぞ まさかクラス間の依存関係に全部いちいちイベントを噛ましてるってわけではないよね その上で、この例において特にイベントを使うのが適切だと判断した合理的な根拠は? 少なくとも>>697 のレスからはそれを具体的に読み取れないから、根拠のない仮定に基づいた無駄な拡張性だと言ってるんだけど >>691 ( ゚д゚) ありがとうございます。 その通りです。 一晩見直したのに気づかなかった・・・。 >>697 です みなさん色々なご意見ありがとうございます 基本的にはイベント等で疎結合にしたクラス作りが望ましいが、ケースバイケースで状況に応じてどちらの実装でも問題はないといったところでしょうか レスして頂いた内容は非常に参考になり、まさにその両者のいい分で自分もどちらが最適解なのか悩んでいましたが、結局状況を判断出来る私が決めて実装するしかないのかなと思いました 途中インターフェースをかましてすれば良いとのレスがありましたが、どういった実装をすればいいのか全くわかりませんでした。この方法でも検討してみたいので、すみませんが具体的な実装を教えて頂けないでしょうか >>721 interface IAlert { void Set(Severity severity); void Unset(); } たとえば、あるアラートに対してこういうインターフェイスを定義する クラスAはこれをコンストラクタで受け取り、温度センサーの値が閾値を超えたら危険度に応じた引数でSetメソッドを呼ぶ 温度が低下して閾値を割ったらUnsetを呼んで解除する このIAlertインターフェイスを、具体的な実装、たとえばパトランプを操作するクラスが実装するわけ こうしておけば、 パトランプじゃなくて画面でアラート状態を表示したくなったときにAに手を入れずにIAlertを実装するだけで済む もちろん、パトランプしか想定しなくていいなら直接パトランプクラスのメソッドを呼んでもいいし、Unsetが必要ないならイベントでもいいかもね ただしイベントの場合はBからAへの密結合が発生するとか、それを避けるなら追加で橋渡しのコードが都度必要になるといった懸念点もある >>722 早速ありがとうございます ちょっとまだピンときませんが、じっくり検討してみたいと思います BASICしか経験がないど素人がC#始めたんだけど、 クラス間の参照の受け渡しというのが難しいです・・・。 クラスの参照を配列に入れて、それを受け渡しするとか動くコードはなんとかかけてるんだけど、 自分で一体何をしているのか分からなくなる時がある。 >>725 真っ先に直さなきゃならないのは、「スコープの広い配列にインスタンスを入れておけば、どこからでも全てのデータにすぐにアクセスできていいじゃん!」と思っちゃう点でさあ C#のスキルの無さから設計までメチャクチャにしてるんじゃないのかねえ BASIC系って悪い習慣を覚えちゃうよね 特にVBAはひどい >>722 それだと温度センサーがアラートをコントロールしているように解釈される 常識的に考えてアラートのコントロールは温度センサーの仕事ではないだろう これは名前の問題であってインターフェースよりイベントを使えと言ってるわけではない >>726 その通りです。 すべての変数をどこからでもアクセスしたい衝動にかられます。 Aのクラスの機能がA1とA2に分化できるから分けようと思うと、 AはCを参照してたからA1とA2両方にCのインスタンス参照を渡そうとなり、 結局機能は分けれたものの、どのクラスがどのクラスを参照してるのかがよくわからなくなってきました。 値1、2個を渡すのは簡単なんですけど、 クラスのインスタンスを100個つくるためにその参照を配列にいれる 参照の入った配列をreturnで返す とかしてるとなんの値をいじってるのかわけわかめです。 これまで値と参照の区別をして思考してこなかったからなのかなぁ。 >>730 オブジェクト指向で参照を共有することは少ない 共有するとしてもイミュータブル、ステートレスにして共有によるデメリットを消した上で共有する 長時間生存するインスタンスがあちこち参照しあって状態を刻々と変化させていくような設計が最悪のパターン >>719 それは君が経験値不足なだけ。>>697 である程度は想像できる。 >>731 なるほどCを参照しているA1、A2はCと独立したオブジェクトじゃなくなってしまいますものね。 Target[] target = new Target[Constants.MaximumNumberOfTarget]; public Target[] InitializeTarget() { for (int i = 0; i < Constants.MaximumNumberOfTarget; i++) { target[i] = new Target(); target[i].x = 100; target[i].y = 100; } } こういうふうにForm1のクラスでターゲットの座標100個発生させて表示させます。 ターゲットをクリック出来たら消す 一定時間クリックできなかったら点滅させる ゲーム終了後にターゲットの座標をテキストファイルに書き出す などの処理がすべてForm1上に存在することになるのですが、 それでもいいのでしょうか? これらの作業を無理にクラスに分けようとすると ターゲットクラスインスタンスの参照100個を渡さなくてはいけなくなります。 >>736 何が駄目なのかわからない 何か縛りプレイしているのならその前提から出してもらわないと たとえば特定のデザインパターンの勉強が目的だとか どうせこの人は一生治んないよ ただプログラムなんてちゃんと動けば目的達成できるんだし、まあ、これでも良いんじゃないの listやdictionaryを使ってないのかな だったらまだそのアプリを作る段階まで届いてない target class にx,y,timeなどメンバ変数7個程度を入れてます。 このターゲットを表示するためForm1上にクラスのインスタンスを参照する配列を置くと、 表示とゲームのコントロールすべてがForm1上におくことになって見苦しいのかと思いました。 でもテトリスとか他のミニゲームみても同じような設計になってるんですね。 無理して別クラスにするよりもtargetクラスの配列に関連した、表示、ゲーム処理はForm1上に置いてみます。 (というか実際に配列を別クラスに切り分けたら、余計読みづらくなった・・・) >>738 縛りはなかったのですが、見やすいコードということを考えすぎてました。 まずは動くコード書いて、人の書いたプログラムも見ながら勉強していきます。 >>740 最初Dictionay使うつもりだったのですが、 構造体かクラスに変数をまとめたほうがよさそうだったので今の形になりました。 >>736 何故そのような結論になるかわからない提示された仕様からだとテキスト出力クラスを作ろうって気になるかな targetの渡し方はコンストラクタやメソッド引数にするかは自由 Hoge hoge = new Hoge(); bool Output(){ hoge.Set(target); return hoge.Output(); } >>742 複数のTargetを管理する専用のクラスを書くんだよ Formが全てのTargetを管理するのはオーバーワークだろ >>729 貴様にはpublicを禁止する呪いを掛ける そしてinternalを使い始めた! ゴミグラマの出来上がり と、すでに出来あがったゴミグラマが申しておるようですが >>746 はい。 それやってみたのですが、フォーム2から初期設定値を初期値格納クラスに入れていて、 初期値格納クラスの参照、Targetクラスの参照、Targetクラス管理クラスの参照が入り乱れて書いている自分でもわけわかめになりました。 二つのプログラムを見比べた結果Form1でTarget管理させたほうがまだましなのかと・・・。 もっと規模の大きなプログラムだと違ってくるのかもしれないのですが。 >>751 小さいの組み合わせてでかいの作るんだから でかいと組み方が変わるなんて言ってるやつは そもそも下手クソなんだよ 素人が責務に応じたクラスの分割を理解するなんて 一朝一夕どころか数ヶ月単位の時間が掛かると思うが、このやり取りそこまで続けるの? >>754 素人でも初心者でもわかる奴は最初からわかってるけど? むしろ数ヶ月も時間をかけてわかって気になってるおまえが何もわかってないよ >>754 理解しやすい構造になるわけだから素人も安心 >>755 猿には聞いてねえから飼育員さんとママゴトしてな >>756 んでいつまで続けるの? ウザくなってきたからスレ潰しするのもいいかなと思ってる バカ、スレ潰し宣言wwwww これはさすがの俺も意表をつかれた度と超えたバカwwwww リストボックスの値を取得するのって string Gender = this.Gender.SelectedItem.ToString(); の一文だけじゃだめなの? なぜか値が取得できない。 >>761 まず「Gender」が2つ出てくることに違和感はないのか ListBoxは使ったことないけど https://msdn.microsoft.com/ja-jp/library/system.windows.forms.listbox.selecteditem (v=vs.110).aspx string GenderStr = this.Gender.SelectedItem.ToString(); にでも変えれば動かないか? >>761 すいません。 自己解決しました。 大分疲れてきたようです。 寝ます・・・。 >>763 すいません。 ご親切にありがとうございます。 値を出力するクラスにwriteline書き忘れてました・・・。 値の取得は上のコードでOKでした。 朝から一日プログラミングして悪い頭が限界を超えているようです。 今日はもう寝ます。 >>714 いろいろ調べてみましたが、私が探している解決策とは異なったようです 一番知りたいのは、埋め込みリソースに対し、通常のファイルアクセスのように アクセスする方法はないのか、という点です (XLWorkbookのコンストラクタには、ファイルパスを与えますので) 今回のデータは参照のみ必要ですので、リソースとして埋め込んだ場合に 変更が効かなくなっても問題ないと考えました 712で書かれた内容は、「自分でファイルフォーマットを定義して、それを読んで 切り貼りするコードを自分で書くべし」、ということでしょうか そのために有用なのが714のAPIということですか ないよ 一回テンポラリファイルに出力すればいい 使いたいライブラリがストリームを受け取るバージョンをサポートしてるならそっちを使ってテンポラリファイルは要らない >>768 ありがとうございます 少し調べてみた限りですと、closedXMLはストリームからの読み込みはサポートして いないようなので(当然の気もしますが)、テンポラリファイル等別の手段を考えます >>769 「リソースにアクセスしたい」ではなく、「ファイルにアクセスするメソッドにリソースを 渡したい」でした 768のおかげでそのまま実現するのは無理とわかりましたので、疑問としては解決です Json保存すると漢字が化ける。なぜばけるの? Jsonの問題なのか、StrreamReader の問題なのか、StrreamWriterのもんだいなのか? 取り合えず、Read、Writeともに shift_jisでEncode指定したら化けないようになったが、意味がよくわからない。 普通に考えるとStringにShift_JIsが入っていて、それを認識しているなら、Read WirteにShift_jisを指定する必要はないと思うのだ。だからStringにはそういう情報は 入ってない筈だ。ファイルにSHiftJIsの属性がはいっているなら、Write側だけに指定 すればよいはずだ。ReadにもSHIFT_JISを指定しなければならないということはファイルにも その属性は保存されていないということだ。Stringに属性を保存しておけばすべて丸く 収まるとおもうのだが、なぜそうしないのだろうか? 文字列の実装には内部的にUnicodeで扱うものとバイト列として扱うものとがある。 前者は入出力時にそれぞれバイト列->UnicodeとUnicode->バイト列をどのようにマッピングするか(i.e. エンコーディング)を指定する必要がある。 後者であればその必要はない。 一方で前者は外部から文字列を読み込んでも内部的にはUnicodeだから読み込んだ文字列に対して処理を行う際に文字コードに悩む必要はない。 後者はプログラムを書いている時の文字コード, 入力された文字コードを常に意識せねばならん。 一長一短だからどっちの実装もあり得るが.NETは内部Unicodeが標準的だということだ 文字列自身に自分のエンコーディング情報を埋め込むのはやめておけ 禄でもないことにしかならん JSON はJavaScript だから、UTF-8 Ruby, Python もそう。 ネット上に流れるテキストも同じ SHIFT_JIS を使う言語は、まずない。 PowerShell も、UTF-16 ここ数年は、Unicode に統一された。 それ以外の、SHIFT_JIS, EUC-JP は使わない >>773 何言っても通じないとは思うが、お前の愛するRubyの文字列の扱いは他と異なっている Rubyの文字列は内部的にはエンコーディング情報を持ったバイト列だ 特にWin環境では非常にトラブルの原因になりやすいゴミ仕様である Ruby は各文字列に、エンコードを持てるから、すごい 例えば、文字列a がSHIFT_JIS で、b がUTF-8 として、 a + b みたいに、文字列を連結すると、エンコードエラーになる >>775 うん。何一つメリットのないカス仕様だね。 >>770 ClosedXML.Excel.XLWorkbookコンストラクタにはStream取るのもあるんだけど >SHIFT_JIS を使う言語は、まずない。 エクセルファイルをCSVにEportしたファイルだけど、 var sr = new StreamReader(fs, Encoding.GetEncoding("shift_jis")) これでなら正常に読める。ということはエクセルはshift_jisだと思うが、、 >一方で前者は外部から文字列を読み込んでも内部的にはUnicodeだから読み込んだ文字列に対して処理を行う際に文字コードに悩む必要はない。 >後者はプログラムを書いている時の文字コード, 入力された文字コードを常に意識せねばならん。 前者はDefault unicode 後者はDefault bytecode ということであれば、shift_jisなど他にもたくさんの文字コードが来る可能性があるのだから、コードを意識することにあまり違いはない と思うが、、 >>775 その考え方の方が正しいと思う。 そもそもunicoeをディフォールトにするんだったら、漢字はそのまま表示できるんじゃないの? 其れなのにXcelは何でわざわざSHIFT_JISをつかうんだろ。 Windows も内部的には、UTF-16 だろ。 PowerShell, ブラウザも、UTF-8 保守費用が掛かるから、MS も、SHIFT_JIS を辞めたいはず Excel など、長年使っている人が多いから、やめられないだけ >>780 Stringのエンコーディングが固定なら、IOのときだけ文字コードを意識すれば済む 素人のちょっとしたツールのレベルならともかく、一般的にはIとOの間(P)の部分がプログラムの殆どを占めるんだよ Dictionaryのキーの文字コードが混在してて、存在するはずのキーの検索に失敗するとか悪夢だろ >>778 Excelは言語じゃない。 日本語版のExcelのCSV出力時の文字コードがShiftJISなのは単に過去との互換性のため。 ちなみにBOMが付いていればUTFのCSVでも読み込める。 漢字が文字化けするのは保存した文字コードと読み込んだ文字コード指定が違うから それだけ つまりやった側の間違い どこで間違えたか手順を順に見直すべし sqliteとの連携に関して質問です なんらかのクライアントで先にテーブルを作り、レコードもinsertしておいて、それを読み込むプログラムを作りたいのですが、既存のdbファイルはどこに配置すればよいのでしょうか デバッグしてみたらno such tableと言うようなエラーが出たので、どうやら実行時に新たにdbファイルを作ってそれを読もうとしてしまっているようです >>787 どこもクソも決めるのはお前 SQLiteはDBのファイルパス指定して開けるだろ SQLiteは普通のDBMSと違って、システムのどこかに共通のデータストアがあるみたいな考え方をしないんだよ ファイルを名指しするのが基本 >>785 「文字コードなんて意識する必要はない。機械に任せたほうがいい。」とは考えないのだろうか? そもそもテキストとは文字コードによって表現された文字の集合体だ。テキストを保存するIOに たいしてわざわざ文字コードの情報を削除して保存するのは何故なのだ。正気の沙汰とは思えんな。 >Dictionaryのキーの文字コードが混在してて、存在するはずのキーの検索に失敗するとか悪夢だろ 文字コードなんて本質的なことじゃない。だから混在してもかまわない。 それを人手でやろうとするから「混在する悪夢」が発生する。 そういう場合にこそ機械に自動的にやらせるべきだろう。 >日本語版のExcelのCSV出力時の文字コードがShiftJISなのは単に過去との互換性のため。 >ちなみにBOMが付いていればUTFのCSVでも読み込める。 互換性のためならもっとほかの方法がある。アプリのためにコードを弄るなんて最悪の方法だろう。 ここにきて.NET CoreがWPF, Windows Formsを救済ってか >>790 >>791 >>792 屁理屈言っても誰にも認められない x=x+1は式としておかしいと言い張ってプログラムが全くできなかった人がいたけど その人と同じ 文字コードがいろいろあるのは仕方ない それぞれの都合で整数に文字を割り当てる方式がちがうので文字化けする 文字コードの情報というものがそもそもないので削除なんてしてない 自動判定は単なる憶測にすぎない その自動判定だって誰かが書いたコードが判定してるんであって 機械に任せると言うのは言ってることがおかしい public double Re { get; set; } ってプロパティを省略して書くと見やすくていいんですが、 他クラスから参照するだけの変数だと、 Reは使用されていませんって警告がずっと出てうっとうしい。 何かいい手はないでしょうか? 別に文字列を文字セット/エンコーディングごと抽象化するライブラリとか作ってくれて良いのよ? 既存文字列と互換性があって使い勝手, 拡張性と統一性と性能が担保されるなら普及もするだろう でも曲がりなりにもそれ続けられてるのってRubyくらいで他に思い浮かばない なんで無いのかと言うけど試されてないわけないんだよ, 現実的じゃないから普及してない >>796 { get; private set; } とか?できないんだっけ? WPFで WindowStyle="None" AllowsTransparency="True" Background="#01FFFFFF" でほぼ透明だけどマウスイベントを受け取るウィンドウを作ったのですが これとおなじことをFormでやりたいのですがやりかたがわかりません どのようにすればいいですか? >>798 できると思います。 データ格納フォルダB:Aフォームから値を取得 Cクラス:Bから値を取得 となってるのでsetもpublicでないと困るんですよね。 データ格納フォルダBの値はAから値取得した後なにも処理がないので、 「Reは使用されていません」って正しい警告なんですけどねぇ。 格納しているデータが10個あって警告10個もでるとさすがにうっとうしい。 >>790 BOM付きのUTF以外は、文字コードの情報なんてものは最初から存在しない。 また、文字コードの自動判別も完璧ではなく、場合によっては全く判別出来ない。 BのコンストラクタにAからの値を受け付けて public readonly double Reに渡すとかじゃだめなんね? >>799 Formはウィンドウ全体のアルファはOpacityで指定できるけど、 背景だけ透過させるとかは簡単にはできなかったような http://yellow.ribbon.to/ ~azumaya/doc_dotnet_uplayeredwnd.php >>800 そもそも>>796 みたいな告なんか出ないと思うけど... 何か盛大に勘違いしてる予感... >>803 WPFだと簡単にできたけどだめですか。。 背景透明なウィンドウとOpacity≒0で全体をほぼ透明化したウィンドウを重ねて代用します >>803 勘違いなのかなぁ・・・。 すいませんもうちょっといろいろ実験してみます。 もともとスタートアップだったform1からform2にスタートアップを変更したいと考えています。 Program.csの static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new InitialSettingForm1()); } のForm1をForm2に変更したのですがどうもうまくいきません。 form1が出てからform2が表示されているような…。 試しに public ExaminationForm1() { InitializeComponent(); MessageBox.Show("a"); } と入れてみると メッセージボックスが表示→okをクリック→form2が表示 となります。 他にも設定しなければいけないところがあるのでしょうか・・・。 InitialSettingなのかExaminationなのかどっちだよ ExaminationForm1のコンストラクタにブレークポイントおいて実行 ブレークしたら呼び出し履歴を確認する >>809 Debugで確認していったらどうもインスタンスの参照を渡せていないようです。 public partial class Form1 : Form { Form2 form2; Class1 class1; public Form1() { InitializeComponent(); form2 = new Form2(); form2.Show(); class1 = new Class1(); form2.Pointer = class1; } } public partial class Form2 : Form { Class1 class1; public Class1 Pointer { set { class1 = value; } } public Form2() { InitializeComponent(); int i = class1.fuga(); MessageBox.Show(i.ToString()); } } public class Class1 { public int hoge = 2222; public int fuga() { return hoge; } } ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる