1 名前:デフォルトの名無しさん mailto:sage [2018/04/06(金) 17:40:19.48 ID:oKXVP34zM.net] 「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。 他のスレッドでは書き込めないような低レベルな質問、 質問者自身なんだか意味がよく分からない質問、 ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。 内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。 なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。 C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください >>980 を踏んだ人は新スレを建てて下さい。 >>980 が無理な場合、話し合って新スレを建てる人を決めて下さい。 ■関連スレ C#, C♯, C#相談室 Part95 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 mevius.5ch.net/test/read.cgi/tech/1520057345/ ■コードを貼る場合は↓を使いましょう。 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 referencesource.microsoft.com/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
152 名前:デフォルトの名無しさん mailto:sage [2018/04/23(月) 08:16:30.00 ID:C4a+50u5M.net] >>147 ちがくね? お前がやりたいのって別のデータとid(?)が一致する項目にデータを入れていきたいんじゃねーの? でもそれってコントロールを特定する必要があるんだよね? コントロールとデータを紐付ける何かはあるの?
153 名前:デフォルトの名無しさん mailto:sage [2018/04/23(月) 08:33:16.26 ID:KdhM7QliM.net] GetAllControlsのカウント取るとかそういう?
154 名前:デフォルトの名無しさん mailto:sage釣 [2018/04/23(月) 08:37:13.12 ID:+9lDlXeaM.net] Type.GetPropertiesの方かな
155 名前:デフォルトの名無しさん mailto:sage [2018/04/23(月) 09:14:18.74 ID:y08K2+qf0.net] VB6はコントロール配列があったけどなー。.Netの世界にはないからの。
156 名前:デフォルトの名無しさん mailto:sage [2018/04/23(月) 12:01:51.66 ID:joGGyVH30.net] ttps://dobon.net/vb/dotnet/control/findcontrolbyname.html 名前で探せばいいのでは?
157 名前:デフォルトの名無しさん mailto:sage [2018/04/23(月) 12:30:43.09 ID:b1ST+81Ba.net] だから配列に突っ込めば済む話を何でわざわざより面倒な方法で解決しようとするのw
158 名前:デフォルトの名無しさん mailto:sage [2018/04/23(月) 12:34:22.72 ID:HUKatAJtr.net] >>150 いや、単純にファイルから読み込んだ名前で、チェックボックスの文字を変えたいだけです 例えばファイルの中身が 犬,猿,雉だったら?CheckBox1-3の文字をそれぞれ犬、猿、雉にしてCheckBox4-20は「使用不可」にでもするような だから機械的に参照できればよかったのです >>154 これでほぼ解決です、ありがとうございます
159 名前:デフォルトの名無しさん mailto:sage [2018/04/23(月) 12:39:13.94 ID:HUKatAJtr.net] >>155 まあ一言でいうと、わざわざ自分で配列を作らなくても、それを実現する方法はすでに存在するだろうと思ってたのです 配列作ったら「そんなことしなくてもこう書けば一発で参照できるのに」って言われる方法があるんじゃないかと
160 名前:デフォルトの名無しさん mailto:sage釣 [2018/04/23(月) 12:39:38.75 ID:+9lDlXeaM.net] >>156 その下にインデクサによる説明もあるだろw
161 名前:デフォルトの名無しさん [2018/04/23(月) 13:33:10.44 ID:48XgAlPp0.net] public partial class Form1 : Form { public Form1() { InitializeComponent(); this.checkBoxes = this.Controls.OfType< CheckBox >().OrderBy( x => x.Name ).ToArray(); } private CheckBox[] checkBoxes; }
162 名前:デフォルトの名無しさん mailto:sage [2018/04/23(月) 17:06:56.96 ID:FWk6fNJV0.net] public class B : private A { } みたいなこと C# じゃ出来ないんだっけ?
163 名前:デフォルトの名無しさん mailto:sage [2018/04/23(月) 17:10:12.77 ID:BY7S8wKYd.net] >>160 継承元をprotectedにすれば継承したクラスからしかアクセスできないようにはできる
164 名前:デフォルトの名無しさん mailto:sage [2018/04/23(月) 17:25:36.44 ID:b1ST+81Ba.net] >>160 何言ってるのかわかりませんw
165 名前:デフォルトの名無しさん mailto:sage [2018/04/23(月) 18:05:17.14 ID:BY7S8wKYd.net] そのクラス経由でしかアクセスできないようにしたいってことじゃないの?
166 名前:デフォルトの名無しさん mailto:sage [2018/04/23(月) 18:18:07.68 ID:CCSIsfHWM.net] ゆとりしか居ないのかなぁ C#はprivate継承はサポートしてないよ フィールドに持たせて移譲メソッド書くしかない
167 名前:デフォルトの名無しさん mailto:sage [2018/04/23(月) 18:31:05.83 ID:VMRJeQmYd.net] >>164 ゆとりなんてもうオッサンやでおじいちゃん?
168 名前:デフォルトの名無しさん mailto:sage [2018/04/23(月) 18:38:07.42 ID:BY7S8wKYd.net] これ参考にすればいいのかな ufcpp.net/study/csharp/oo_conceal.html protected internal 同一プロジェクト内のクラス内部、または、派生クラスの内部からのみアクセス可能 private protected (C# 7.2 以降)同一プロジェクト内のクラス内部、かつ、派生クラスの内部からのみアクセス可能 こういうこと?
169 名前:デフォルトの名無しさん mailto:sage [2018/04/23(月) 18:52:13.60 ID:Xa6TKCtV0.net] >>156 それで解決しねーだろ バラっバラにくんじゃね? 俺はてっきりコントロールの 座標でソートして名前付けたいのかと思った
170 名前:135 mailto:sage [2018/04/23(月) 21:02:25.52 ID:wp3u/AuE0.net] 皆様いろいろありがとうございました >>159 書いてくださった方法が、ほぼ私が求めていたものを完璧に実現しています 抱かれてもいいくらい惚れました ただ、試してみたところピックアップされる順番は必ずしもコントロールを配置した 順番通りではなく、はっきりした法則性も見いだせませんでした テストプログラムを書いて、インデックスと見た目を一致させるようデザイナで コントロールを並べ替えようかとも思いましたが、後日コントロールを追加した際 悩むことになりそうなのでやめておきました >>154 結局この方法でコントロールを検索し、発見したコントロールをリストに追加するという 方法で対応することにしました >>155 配列に突っ込むにも、コード上に直接 checkBox1 とか checkBox2 とかのリテラルを 埋め込みたくなかったので、検索した上で配列を作ることにしました >>149 , 150, 151 実は書いていることがわからないレベルなので、これから勉強します 「作って覚える」は一通りやったので、「独習c#」を紐解いてみます >>167 これで解決しました 158の方法で解決するかと思っていたのですが、やってみたところバラバラの順番でした 皮肉でもなんでもなく、コントロールの座標でソートとか、なぜそういう操作をしたいのだろうと 推測したのか教えていただけると嬉しいです 今後も質問すると思いますので、疑問点がわかりやすい文章を意識する必要があるので
171 名前:デフォルトの名無しさん [2018/04/23(月) 21:07:14.52 ID:QriAiZTC0.net] 今日からC#勉強し始めたけど、 結構ネスト深くなる言語っぽいね、これ。こんな… namespace ConsoleApp1 { class Program { static void Main(string[] args) { try { checked { sbyte a = 64; sbyte b = 65; sbyte c = (sbyte)(a + b); } } catch (OverflowException ex) { Console.Write(ex.Message); } } } }
172 名前:デフォルトの名無しさん mailto:sage [2018/04/23(月) 21:09:42.34 ID:b1ST+81Ba.net] >>168 いやいやいやcheckBox1 とか checkBox2 とかはリテラルじゃないってw ただの識別子(フィールド名) コードにリテラルを埋め込むというか、コンパイル時に誤りを検出できない (普通の理解では)お行儀の悪いコードになるのはむしろ>>154 みたいな方法だってw
173 名前:デフォルトの名無しさん [2018/04/23(月) 21:09:53.25 ID:QriAiZTC0.net] namespaceとかcheckedがブロックなのが何かなぁ…
174 名前:デフォルトの名無しさん mailto:sage [2018/04/23(月) 21:27:15.55 ID:wp3u/AuE0.net] >>170 おっと・・・ どうやら根本的なところで間違っていたようです 書いてあるとおりだとすると、質問とレスが噛み合っていない理由がわかりました わざわざ行儀の悪い書き方を探していたのか
175 名前:デフォルトの名無しさん [2018/04/23(月) 21:37:46.50 ID:48XgAlPp0.net] >>168 >>159 はOrderBy()でチェックボックスの名前(Name)順にソートしてる。 Nameの代わりに、TabIndexかTagを設定してそれを利用しても良い。 というか、Nameだとチェックボックスが10個以上になるとソートが望むようにならないか。
176 名前:デフォルトの名無しさん mailto:sage [2018/04/23(月) 21:45:21.31 ID:Xa6TKCtV0.net] >>168 おそらく配置したコントロールから欲しい情報は座標とサイズぐらいしかない それらの特定情報は別ファイルにある なのでコントロールが上から もしくは左からか順番に取得できれば 別ファイルに記述した通りの順番で情報を並べることができる Controlsで取得できる順番はよく知らないけど 作った順かあるいわなんの特徴もなくランダムか何かを保証するものではないのかな?と
177 名前:デフォルトの名無しさん mailto:sage [2018/04/23(月) 22:10:47.18 ID:48XgAlPp0.net] >>174 Controlsが返す順番は保証されてないけど、自分でソートすれば良い。 (1)TabIndex順 (各CheckBoxにタブオーダー(TabIndex)を設定しておく) this.checkBoxes = this.Controls.OfType< CheckBox >().OrderBy( x => x.TabIndex ).ToArray(); (2)Tag順 (各CheckBoxのTagに数値を設定しておく) this.checkBoxes = this.Controls.OfType< CheckBox >().OrderBy( x => x.Tag ).ToArray(); (3-1)Location順(左から) this.checkBoxes = this.Controls.OfType< CheckBox >().OrderBy( x => x.Location.X ).ThenBy( x=> x.Location.Y ).ToArray(); (3-2)Location順(上から) this.checkBoxes = this.Controls.OfType< CheckBox >().OrderBy( x => x.Location.Y ).ThenBy( x=> x.Location.X ).ToArray();
178 名前:デフォルトの名無しさん mailto:sage [2018/04/23(月) 22:33:20.75 ID:fnmaDcrK0.net] >>156 そういう使い方なら、チェックボックスを先に作っておくんじゃなくて ファイルから読んだ内容で動的に作っていった方が手っ取り早い どうせチェックボックスは全部等間隔に並べるんじゃろ?
179 名前:デフォルトの名無しさん mailto:sage [2018/04/23(月) 22:53:14.98 ID:pYJnxPYX0.net] WPFのサンプルでありそうな話だ
180 名前:デフォルトの名無しさん mailto:sage [2018/04/23(月) 23:04:57.82 ID:0nhwdYRFa.net] >>127 ,>>129 >>124 です SetPrinter関数を使用することで実現できました。ありがとうございました。
181 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 00:40:53.09 ID:U7B9av/W0.net] >>169 そのtry意味ないんだけど。。
182 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 00:55:02.77 ID:P/LpDfjz0.net] >>179 ネストのイメージ書きたかっただけだろうよ
183 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 06:02:26.80 ID:PLNFE8AC0.net] >>174 なるほど、コントロールから情報を取得する必要があると思えたのですね 実際はそれ以前の段階でしたが >>176 それも考えたのですが、デザイナで画面を確認したいので、静的に用意して おきたいという結論になりました 動的に置くほうが難易度高そうだ、と思ったのもありますが
184 名前:デフォルトの名無しさん [2018/04/24(火) 11:44:27.10 ID:MJ0NRymv0.net] >>179-180 「意味無い」って、どういう意味?
185 名前:デフォルトの名無しさん [2018/04/24(火) 12:45:33.19 ID:MJ0NRymv0.net] うぇぇ、C#、goto文使えるし…
186 名前:デフォルトの名無しさん [2018/04/24(火) 13:15:16.40 ID:MJ0NRymv0.net] うーん、string x = "10"; に対して x.toString(); するんじゃなくて、int.Parse(x); するのか…。 xオブジェクトにintegerを吐き出させるのではなく、 integerオブジェクトにxオブジェクトを与えてintegerを吐き出させる…。 これは初めての体験だな…。
187 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 13:18:45.32 ID:Ajvhvjmq0.net] 何もかも間違っててワロタw
188 名前:デフォルトの名無しさん [2018/04/24(火) 13:34:52.91 ID:MJ0NRymv0.net] なにゆえ?
189 名前:デフォルトの名無しさん [2018/04/24(火) 13:45:01.31 ID:MJ0NRymv0.net] expression-bodied関数は、なんかエロいな…
190 名前:デフォルトの名無しさん [2018/04/24(火) 13:46:08.52 ID:MJ0NRymv0.net] やってる事は違うけど、考え方的にはCのマクロに近いのかな…
191 名前:デフォルトの名無しさん [2018/04/24(火) 13:50:59.68 ID:MJ0NRymv0.net] LINQ…、エロいな…。
192 名前:デフォルトの名無しさん [2018/04/24(火) 13:53:53.94 ID:MJ0NRymv0.net] 関数名がアッパーキャメルなのは感心せんなぁ…
193 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 14:00:18.73 ID:a0zqzGgA0.net] ここ質問スレなんで日記は他所でな
194 名前:デフォルトの名無しさん [2018/04/24(火) 14:04:20.23 ID:MJ0NRymv0.net] なんだよ、ToString()メソッドあるじゃねぇかよ…。
195 名前:デフォルトの名無しさん [2018/04/24(火) 14:05:02.22 ID:MJ0NRymv0.net] >>191 ごめん。 質問です。なんだよ、ToString()メソッドあるじゃねぇかよ…
196 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 14:39:12.39 ID:5gRbnpaG0.net] VisualStudioでC#のフォームアプリを開発するときに プロジェクトのプロパティから 出力の種類を「コンソールアプリ」にして デバッグ用のConsole.WriteLineを出力できるようにしてるんだけど リリースするときは、種類を「Windowsアプリ」にするだけで コード中のConsole.WriteLineはコメントアウトとかしなくても 大丈夫ですか?
197 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 15:12:41.47 ID:aRAC41/V0.net] >>194 デバッグ用に文字列を出したいなら、using System.Diagnostics;して、Debug.WriteLine()とか使うべき。 これならリリースビルドにするだけで無効になるからコメントアウトも不要。 リリースビルドでも使いたいなら、Trace.WriteLine()。
198 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 17:00:53.50 ID:Le/zmSZT0.net] >>194 パイプで繋ぐとみえちゃうよ
199 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 17:22:41.52 ID:5gRbnpaG0.net] >>195 おお、ちゃんとデバッグ用のがあるんだ 聞いてよかった ありがとう >>196 なるほど 別に見られて困るようなものでも無かったけど 無知を晒す所だった・・・ てか、独学でやってると気づかずおかしなことやってそうで怖いわ たまたま、ネット上で解説見つかるか 質問して教えてもらえるかの 綱渡りで進んでるw
200 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 19:15:00.82 ID:QP8ofl3+M.net] >>193 おまえ出身言語化どこだよw レヴェルが低すぎるぞ
201 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 20:32:35.47 ID:AF96232m0.net] 引数の文字列が、データグリッドに含まれていない場合だけ追加したいんですが、追加されません。 何が原因でしょうか? void AddToDataGrid(string[] strs) { bool exists = false; foreach(string str in strs) { for(int i = 0; i <= view.Rows.Count; i++) { if(str == view[0, i].Value.ToString()) exists = true; } if(!exists) { view.Rows.Add(str); } } }
202 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 20:43:20.78 ID:Ajvhvjmq0.net] >>199 >view.Rows.Add(str); これじゃね
203 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 20:48:40.81 ID:AF96232m0.net] >>200 view.Rows.Add(str); だけだと正常に追加されるので、条件判定かループあたりに原因があると思っています。 フラグの位置がおかしいので以下に修正してもダメでした。 void AddToDataGrid(string[] strs) { foreach(string str in strs) {
204 名前:bool exists = false; for(int i = 0; i <= view.Rows.Count; i++) { if(str == view[0, i].Value.ToString()) exists = true; } if(!exists) { view.Rows.Add(str); } } } [] [ここ壊れてます]
205 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 20:53:14.94 ID:ZpST366k0.net] >>201 exist=trueでブレークポイントを置いてデバッグ実行すればわかるのでは?
206 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 20:54:05.17 ID:UZOTbxqf0.net] そもそも exists = true; の行に到達してないというオチな気がする
207 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 20:55:27.49 ID:UZOTbxqf0.net] >>202 とかぶってしまった >>202 の方が指摘として親切だからそっちだけ読めばいいよ
208 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 21:00:23.35 ID:PfeXTBpB0.net] >>201 for(int i = 0; i < view.Rows.Count; i++)//Rows.Count以下じゃなく未満 { bool exists = false;//ここに移動 if(str == Convert.ToString(view[0, i].Value))//ToString()だとValueがnullのときエラー
209 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 21:12:02.89 ID:UZOTbxqf0.net] >>205 はとってもそれっぽい で、例外が握りつぶされるような場所でAddToDataGridが使われてるせいで気づけてないとか こういう場合自分はtry{...}catch(Exception exception){throw;}で囲って throwの直前にブレークポイントを置いたりしてるけどもっとうまい方法があったら誰か教えてちょ
210 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 21:26:25.44 ID:UZOTbxqf0.net] >>205 はそれっぽいと言ったけど よく読むと bool exists = false;//ここに移動 の部分は自分には理解できなかった >>205 の勘違い?
211 名前:デフォルトの名無しさん [2018/04/24(火) 21:31:25.92 ID:zd8+57fN0.net] 全一 FXきた
212 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 21:36:01.31 ID:PfeXTBpB0.net] >>207 フラグよく見ていないからとりあえず if(str == Convert.ToString(view[0, i].Value)) {exists = true;break} に変更で
213 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 21:38:44.73 ID:AF96232m0.net] みなさん本当にありがとうございます。 結局原因はわからず仕舞いでしたが、最終的に以下の方法で打開しました。 void AddToDataGrid(string[] strs) { foreach(string str in strs) { bool exists = false; for(int i = 0; i < view.Rows.Count; i++) { if(Convert.ToString(view[0,i].Value) == str) exists = true; } if(!exists) { view.Rows.Add(name); } } }
214 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 21:49:35.82 ID:UZOTbxqf0.net] >>209 それなら納得 existsの宣言の位置を移動するとif(!exists)がスコープから外れちゃうもんね >>210 >>205 の方法で解決したんなら>>205 の指摘が正しかったんでしょうよ で、それに気づかなかったんならやっぱり例外が握りつぶされてたんでしょ なら今後のためにも原因は分からずで片付けず例外の名前くらい確認しといたほうが良いと思うよ
215 名前:デフォルトの名無しさん [2018/04/25(水) 15:12:14.28 ID:lzwohvOS0.net] オブジェクト指向のプログラミングでは 変数じゃなくてプロパティにアクセスさせるべき みたいな事をよく聞くんだけど ・プログラムの開始時にあるフラグ(true/false)を決めて、その後一切変更されることがない ・そのフラグには、コード中の様々な所からアクセスがある って場合は、プロパティじゃなくてpublicな変数でフラグを定義してもいいんですか? オブジェクト指向がよくわかってないせいか プロパティを経由するのがどうしても遠回りというか 一つ余分な作業を挟んでるように感じてしまう・・・
216 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 15:30:51.28 ID:eqJJBtIM0.net] 変数は、公開しちゃダメ その変数に、誰かが代入するかも知れないと考えると、 その変数に代入しているか、すべての場所を確かめないといけなくなるから、 プログラミングできなくなる だから、プロパティで代入禁止に設定する ただし、絶対に代入できない定数なら、公開してもよい
217 名前:デフォルトの名無しさん [2018/04/25(水) 16:03:36.81 ID:lzwohvOS0.net] >>213 後から書き換えられるのを確実に防止するために プロパティを使うってことか なるほど 1人でコード書いてるからそういう発想が無かったけど 自分も後から絶対変な値を代入しない保証ないもんな てことは、>>212 の例だと ・引数付きのコンストラクタを使って、フラグの状態をインスタンス化 ・そのフラグのプロパティはgetのみ設定 ってすればいいのか? でもこれだと、そういうフラグを立てるタイミングがたくさんあったら その分だけクラスを準備しとくことになると思うんだけど そういうもんなの?
218 名前:デフォルトの名無しさん [2018/04/25(水) 16:12:23.29 ID:lzwohvOS0.net] あ、いや クラスを複数準備する必要はないな >>214 の後半の話は無しで
219 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 16:13:38.42 ID:VelEInRI0.net] >>212 212は読まなくていい フィールドだってreadonly修飾子で代入禁止できるが、212はそんなことも分かってないから プロパティがフィールドと違う点は大ざっぱに * 派生クラスでオーバーライドできる * プロパティから構造体を返すとコピーされる の2点 この2つの特性が必要ない(または避けたい)場合にフィールドを選択してよい 判断できないならプロパティを選択する
220 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 16:15:28.83 ID:ym3YbVtBd.net] IOption使っとけ
221 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 16:51:44.20 ID:I8kFq/qw0.net] >>212 >>216 はどこかのコピペじゃないならすごい分かりやすくて尊敬 一つだけ補足すると、↓のようなこともあるからクラスがpublicの場合は 現状だけでなく将来の変更の可能性も考えてフィールドかプロパティか判断したほうが良い public フィールドをプロパティに変える (2016/05/16追記) https://qiita.com/chocolamint/items/f04665ce2db211abb2d2#public-%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%82%92%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%81%AB%E5%A4%89%E3%81%88%E3%82%8B-20160516%E8%BF%BD%E8%A8%98 あと>>213 も善意で答えてるのは分かるんだけど 代入できるかどうかだけを判断基準にしてる時点でズレてて 定数の説明も参考にならない気がするから割と真面目に>>213 は読まないほうが良いと思う すまぬ>>213
222 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 17:43:22.74 ID:lzwohvOS0.net] >>216 >* プロパティから構造体を返すとコピーされる これが、全然分からんのだけど classの代わりにstructを使った場合の話であってる? 今の自分が考えたところで、どうせちゃんと理解出来ない気もするけど
223 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 17:44:09.08 ID:EO6K8yEq0.net] >>213 は別に全く問題ないだろ。 >>212 の要はカプセル化の質問に対して、>>213 はカプセル化の話として一般論として答えただけじゃん。 それに対して>>216 と>>218 はここはC#のスレだからC#特有のreadonlyなフィールドあるよとか言語依存の情報 つけ足してるだけじゃん。
224 名前:212 mailto:sage [2018/04/25(水) 17:48:51.21 ID:eqJJBtIM0.net] オブジェクト指向では、変数は公開しない。 公開できるのは、処理(関数)だけ クラス内を開発する人と、そのクラスを使う人は、別の会社・人を想定しているから、 変数にアクセスさせたら、絶対にダメ クラス内を作っている開発者は、後で付け加えられる処理を予想できないから。 クラス内を開発した後に、別人が変数にアクセスして、動きを変えたらバグる 異なる会社間での開発を可能にする、 オブジェクト指向の大原則・カプセル化
225 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 17:50:35.02 ID:ClmIY1xNa.net] プロパティから構造体を返すとコピーってのは意味わかんないね コピーされるのは右辺がプロパティだろうがフィルドだろうが同じだよw >>212 少なくともパブリックなメンバーに関しては、あえてフィールドを使う理由はないって 理解でいいと思うよ。例外はアンマネージドコードの呼び出しで使う型を定義する場合ぐらい。 フォールドのプロパティーに対して優位な点は (1) 軽量である (2) 簡潔に書ける このぐらいしかない。 (1)が重要なケースなんかまずない。 (2)については、古いC#はともかく今のC#は儒分簡潔に書けるようになって来てる。
226 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 17:59:38.62 ID:ClmIY1xNa.net] >>221 カプセル化っていのは、触る必要がないもの、触られては困るものを隠すこと。 この質問にはほとんど関係ない話w フィールドをプロパティにしようが、触る必要がない文脈で触られることを防げるわけじゃないw せいぜいセッターで値が適切かどうかチェックできる程度
227 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 18:00:19.55 ID:EO6K8yEq0.net] まぁ、むしろ>>212 のカプセル化などの話に対して、考え方説明せずに 初心者にいきなり言語仕様の詳細を羅列する>>216 の方が教え方としてははぁーー??だわww
228 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 18:04:12.14 ID:EO6K8yEq0.net] >>223 質問者は >オブジェクト指向のプログラミングでは >変数じゃなくてプロパティにアクセスさせるべき >みたいな事をよく聞くんだけど で書いて始めてんじゃん。だから、カプセル化の説明した方がまずいいんじゃねぇか??
229 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 18:09:53.61 ID:ClmIY1xNa.net] >>225 何が「だから」なのかよくわかりませんw 質問は外部に見せるデータをプロパティとして実装すべきかフィールドでもよいのか。 カプセル化(余分なものを外に見せるな)は何も関係ないってw
230 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 18:14:14.76 ID:EO6K8yEq0.net] >>225 >オブジェクト指向のプログラミングでは >変数じゃなくてプロパティにアクセスさせるべき >みたいな事をよく聞くんだけど を質問者が引き合いに出した以上、質問者はここからはしっかりわかってなくて、色々ごちゃ混ぜになってると 思われる。だから、そっから説明しなきゃ、おそらく習得できない。
231 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 18:17:11.69 ID:lzwohvOS0.net] 自分はオブジェクト指向じゃない言語をちょっとだけやってたんだけど そういう言語では、コードの最初の方に public bool JudgFlag = true って1行書いて、それにどこからでもアクセスするみたいな感じだと思うんだ (全部独学だからこれも正解なのか知らんけど) でも、オブジェクト指向ではこれやったらダメなんだよね? ってのが知りたい 後、俺マジで初心者だから 質問文で聞きたいことが正確に表現できてる保証ないwすまん
232 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 18:20:06.19 ID:EO6K8yEq0.net] >>226 だった・・
233 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 18:22:03.13 ID:ClmIY1xNa.net] >>228 別にダメじゃないよw 何度も言うけど、あえてフィールドを使う理由があんまりないだけw フィールドをプロパティにしたらバグが減らせるとか可読性が上がるとか、 ほとんどの場合そんなことはない
234 名前:212 mailto:sage [2018/04/25(水) 18:26:03.04 ID:eqJJBtIM0.net] >変数じゃなくてプロパティにアクセスさせるべき これが異なる会社間での開発を可能にする、 オブジェクト指向の大原則・カプセル化 どの教科書にも書いてある その理由は、クラス内を開発している会社・人と、 そのクラスを使う会社・人は、異なっているから オブジェクト指向では、これらの2つの立場からの見方が大切。 君はどちらの開発者ですか? クラスを作る方・使う方? クラス内を開発しているのは、過去だから、 そこから未来の、クラスを使う人の動きを予測できない だから、変数に直接触らせたらダメ。 そこまで予測して、クラス内を作れないから
235 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 18:31:21.63 ID:lzwohvOS0.net] >>230 そうなのか・・・ でも、解説サイト見てると 「ダメ」的な雰囲気で書いてあるとこばっかりじゃない? 俺の理解が間違ってるのかもしれないが 俺的には現状>>230 に書いてある事が正解に思えちゃうんだよな 俺が1人で小規模な開発してるだけだから いまいちオブジェクト指向のメリットを感じる場面が少ないのかな
236 名前:212 mailto:sage [2018/04/25(水) 18:31:24.51 ID:eqJJBtIM0.net] >>228 >public bool JudgFlag = true 変数を公開したら、ダメ。 カプセル化にならない 理由は、 >>213 に書いてある
237 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 18:36:43.91 ID:Y4/R4Zt40.net] >俺が1人で小規模な開発してるだけだから >いまいちオブジェクト指向のメリットを感じる場面が少ないのかな まあこれだな >>213 の言ってる事は、OOPの「思想」としては間違いなく正しい 但し、単独での小規模開発という状況を前提にするなら「現実的なメリット」は無いに等しい
238 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 18:37:15.31 ID:EO6K8yEq0.net] >>228 うん。君のケースだとダメだね。それだと、クラスの内部状態JudgFlagが誰でも自由に書き換えられちゃう。 だから、まずは君は基本、>>221 のようなC#とか言語関係ない一般的なカプセル化について勉強しよう。 で、君のケースだと自分で書いてるが >・引数付きのコンストラクタを使って、フラグの状態をインスタンス化 >・そのフラグのプロパティはgetのみ設定 ってやるか、 getプロパティ書くの嫌なら>>216 が書いたようにC#にはreadonlyフィールドというのがあるのでそれで代用できる。
239 名前:デフォルトの名無しさん [2018/04/25(水) 18:47:02.51 ID:yqUO4I2d0.net] おまえら変数は公開しちゃだめだけど、プロパティやgetter/setterなら公開してもいいって思っとるやろw
240 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 18:48:12.94 ID:ClmIY1xNa.net] >>232 どこの世界でも教条的(思い込みが激しいともいう)人はいるからねw 外部から取得/設定してもらう必要がある値をフィールドではなくプロパティにしたからって ヒューマンエラーを減らす効果なんかないのは事実 ただ機能がより少ないフィールドをあえて使うことないでしょってだけの話 オブジェクトの公開するデータは必ずしもいつも変数に入っているわけではなく、 何らかの処理の結果を返す場合もあって、その場合はプロパティになるから、 だったら全部プロパティの方が統一感があるという考え方はあるかもしれない
241 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 18:49:19.77 ID:s99z6Kr1M.net] >>234 嘘おしえるなよ
242 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 19:04:09.02 ID:lzwohvOS0.net] まとめると 「1人で小規模なコード書いてるだけなら public bool JudgFlag = true を書き換えたらダメなことぐらい自明だから、フィールドに1行書いて終わりでいい 若干雑だけど楽」 って考え方と 「いや、自分で決めたルールを自分で忘れることもあるから ちゃんとプロパティにして触れない様にすべき 多少面倒でもコストを払うメリットがある」 って考えの対立なのかな get;set;とか全く意味がわからなかった頃の嫌なイメージのせいで プロパティを書く事が、「面倒・難しい」って体が拒否反応しちゃうんだよね 自動プロパティとか実装されてる今の時代に 何言ってんだって笑われそうだけど まあ、でも色々モヤモヤしてた所がスッキリしました ありがとう
243 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 19:24:43.78 ID:q/XXvHKQd.net] >>237 処理の結果を返すならメソッドにしろよ
244 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 20:11:47.21 ID:ClmIY1xNa.net] >>240 具体例 https://msdn.microsoft.com/ja-jp/library/system.drawing.rectangle.right.aspx
245 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 20:30:49.45 ID:XWOG1WtT0.net] フォーム間のデータ受け渡しのやり方について教えてください プログラムを起動して、最初にForm1でパラメータなどを設定、次にForm2で設定した パラメータを元にデータを編集したいとします (Form1で編集済みのデータをForm2に表示する、でもいいです) このときにデータを受け渡すのは、program.cs で Application.Run(new Form1()); と 呼び出す前に 1. Form2 のインスタンスを作っておいて、それを Form1 の引数として与えてやる 2. 必要なデータのインスタンスを Main() 内に用意しておいて、そのインスタンスを Form1 と Form2 のそれぞれに送る 3. どっちもダメで他の方法がある のどれが良いのでしょうか。 Form1 の中で Form2 のインスタンスを作成して、Form2 に送るという方法も考えましたが、 そうすると Form1 が不要になったときに Dispose() すると Form2 も落ちてしまいます。
246 名前:デフォルトの名無しさん [2018/04/25(水) 20:44:39.30 ID:3+niHUT+0.net] 【マイトLーヤとPS4】 FFとDQの最新作、VR開発は危険、プレーヤーの日常感覚を損なうおそれ rosie.5ch.net/test/read.cgi/liveplus/1524621704/l50
247 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 21:00:51.62 ID:q/XXvHKQd.net] >>241 それは右座標を計算して返しただけであって処理を実行するのとは違う 面倒だからここ読んで https://msdn.microsoft.com/ja-jp/library/ms229054(v=vs.100).aspx
248 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 21:06:28.54 ID:XHhjs7vi0.net] >>242 Form2にプロパティを追加 Form1の該当メソッド内でForm2を宣言&インスタンス化してプロパティにパラメータをセット Show(Dialog)メソッドで呼び出し
249 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 21:09:48.37 ID:ckNZ5jJB0.net] メッセージキューを勉強中なんですが、 MSMQとMessageQueueクラスって何が違うんでしょうか?
250 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 21:17:11.34 ID:XWOG1WtT0.net] >>245 ありがとうございます この場合、もう二度と Form1 を使わないという状況であれば、Form2 の ShowDialog を 呼び出す前に this.Hide(); で隠しておいて、戻ってきたら this.Dispose(); でしょうか Hide() だけで処理を抜けるコードを書き忘れて、いつまでもプログラムが残り続けるバグを やったので、二度と戻ってこないフォームは Dispose() したいのです
251 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 21:18:56.58 ID:XWOG1WtT0.net] 今思ったのですが、そういう使い方だとむしろ Form2 を非表示で実行しておいて、 その中で Form1 を呼び出すべき? で、Form1 を抜けたら this.Show(); とか
252 名前:デフォルトの名無しさん mailto:sage [2018/04/25(水) 21:20:04.33 ID:ClmIY1xNa.net] >>244 頭悪そうだけど、単にバッキングフィールドの値をそのまま返すのではないケースを 「何らかの処理の結果を返す」と言っている。 処理 = 高価な処理ではない。 重かろうが単なる足し算だろうが処理は処理だ