X



ふらっと C#,C♯,C#(初心者用) Part137
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ドコグロ MM07-2FKJ)
垢版 |
2018/04/06(金) 17:40:19.48ID:oKXVP34zM
「どんなにくだらない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
0130デフォルトの名無しさん (ササクッテロラ Sp3b-0nT5)
垢版 |
2018/04/22(日) 21:23:13.30ID:AB//w8nmp
c#勉強始めたての者です。
indexofで文字列を検索しようとしているのですが、長文を検索するとエラーが出てしまいます。

MSDNを見ると戻り値がint32とあり、戻り値がintの範囲を超えるとlongエラーになるように推測していますが対応方法はあるのでしょうか。
0132デフォルトの名無しさん (ワッチョイ 4703-goBS)
垢版 |
2018/04/22(日) 21:30:18.18ID:PsQCMKRd0
そう言われるともうlongしか見えない
0133デフォルトの名無しさん (ワッチョイ 3aac-im5j)
垢版 |
2018/04/22(日) 21:37:33.88ID:hhQLBFvv0
文字数がintに収まるように文字列を切り出しながら検索すればいいんじゃないか
もちろん切れ目に検索対象の文字列が有るときの対策して切り出さなきゃならんけど
0134デフォルトの名無しさん (ワッチョイ b3e3-0nT5)
垢版 |
2018/04/22(日) 22:10:29.71ID:VNNE7LSc0
ありがとうございます。
matchメソッドというのを見つけました。
全然見つからなかったのに投稿し出来すぐ見つかるものですね。
matchで出来なかったらint分割にトライしようと思います。
0135デフォルトの名無しさん (ワッチョイ 3bc3-9jjH)
垢版 |
2018/04/22(日) 22:23:25.89ID:f9F/Sp5R0
フォーム上のコントロールを、プログラムから参照するいい方法はないでしょうか

SplitContainer上に配置した合計20個のチェックボックスについて、textをファイルから
読み込んだものに動的に変更したいと考えています

手元の書籍(作って覚えるc#)では、forループの中で

splitContainer1.Panel2.Controls[i].Text = mistakeText;

という形でやっていましたが、今回自分で用意したフォームはほかにもテキストボックスや
ラベルがあり、うまくチェックボックスを対象としてくれません
デザイン画面で配置した順番にやや依拠しているようですが、最後においたものほど添字が
小さそうだ、程度しかわかりません
今後デザインを変更する、あるいはチェックボックスを増やす可能性を考えると、何らかの
プロパティで順番を指定できるといいなと思いますが、発見できませんでした

Form1.Designer.cs のメンバ変数宣言欄に記載がある順番のように思えますが、IDEが
自動生成したコードを並べ替えるのも何やら気持ち悪く、今の所手を出していません

今回はチェックボックスですが、ほかにもラベルを順に参照するとか、テキストボックスを
順に参照する方法などあれば、教えていただけると助かります

なお、今回のフォームでは、とりあえずチェックボックスの名前は初期値(checkBox1など)に
なっています
0137デフォルトの名無しさん (アウアウエー Sa52-PKj8)
垢版 |
2018/04/22(日) 22:43:50.37ID:VtQV/Dmoa
>>135
根本的に考え違いをしてると思う。
たぶんありもしないものをあるはずだと勝手に思い込んでる。

コントロールをテーブル参照したいなら自分で明示的にテーブル(配列)を
宣言しましょう。

デザイナには君が欲しいと思っているものを忖度して自動で作ってくれるような
都合のいい機能は存在しない。
0138デフォルトの名無しさん (ワッチョイ 3bc3-9jjH)
垢版 |
2018/04/22(日) 23:18:57.35ID:f9F/Sp5R0
>>136
とりあえずチェックボックスだけを選択することは可能になりました
順番はやはり思っているとおりにいきませんが、これは実行結果を見つつ、デザイナで
並べ替えるしかないかなと思い始めました

>>137
デザイナが忖度してくれるとは思っていないので、プロパティか何かで明示的に選択する
事ができないかな、と思ったのです
以前VBAで似たようなものを作った際は、
Controls("CheckBox" & i).Caption = Cells(i, 1)
こんな選択の仕方ができたので、c#でもなにか方法はあるのではないかと思いました
0140デフォルトの名無しさん (ワッチョイ 3bc3-9jjH)
垢版 |
2018/04/22(日) 23:50:44.34ID:f9F/Sp5R0
>>139
例えば
Panel.Controls.CheckBox[i]
みたいな形で指定できればいいなと思ってるんですが、残念ながらそうできないですね

>>137
が書いている、自分で明示的にテーブルを宣言するというのは、例えば
cbox[1] = CheckBox1;
cbox[2] = CheckBox2;
とかいうコードを予め書いておく、ということでしょうか?
0141デフォルトの名無しさん (ワッチョイ b7e3-i2qG)
垢版 |
2018/04/23(月) 00:02:33.07ID:Xa6TKCtV0
>>140
意味がわからない
何がしたいの?

@コントロールを特定する必要がある
A複数のコントロールに共通の処理がしたい

Aにしか目が行ってないけど@をやらなきゃいけない時点で
Aの方法なんてエレガントにできたってウンコブリブリじゃん
0143デフォルトの名無しさん (アウアウエー Sa52-PKj8)
垢版 |
2018/04/23(月) 03:09:44.29ID:0OUySOiKa
>>140
だから、配列が欲しいなら配列を自分で作ろうよ。

配列が欲しい、でもなんだか自分で配列を書くのは嫌だ。
この発想がおかしい。

var cbs = new[] {CheckBox1, CheckBox2, ...};

これ書くのがそんなに面倒?
変な方向に努力する方が余程面倒でしょ
ローカル変数じゃなくてメンバ変数かプロパティとして実装する場合だって手間は大差ないよ
0144デフォルトの名無しさん (ワッチョイ 3bc3-9jjH)
垢版 |
2018/04/23(月) 06:08:01.85ID:wp3u/AuE0
>>143
配列を書くのは別に面倒でもなんでもないです
コピペしてちょっと直せば済むので

ただ、コピペで済む内容なら、コードで表現する方法があるのではないかと思ったのです
「新しくなにかプロパティを実装する」のではなく、「このプロパティを参照するとわかる」
という情報が存在するのかと考えました

>>137
が書いてくれたように、「ありもしない物をあるはずだと思い込んでる」のかもしれません
0146デフォルトの名無しさん (ワッチョイ 3bc3-9jjH)
垢版 |
2018/04/23(月) 07:30:25.22ID:wp3u/AuE0
>>145
自動でやってくれると言うか、Controls[n] の n に相当する部分を、何らかのプロパティで
持っているのではないかと思ったのです
それがわかれば、IDEでプロパティを書き換えてやればそれで済むな、と

あるいはそれがなければ、例えば

for (int i = 0; i < CBOX_ELEMENTS; i++) {
string s = "checkBox" + (i+1).ToString();
Controls(s).Text = ...
}

みたいな形で指定できないかな、と思っていたのですが、これは無理そうですし
0147デフォルトの名無しさん (アウアウカー Sa43-AqIk)
垢版 |
2018/04/23(月) 07:45:09.58ID:7CTglbRxa
配列作って突っ込んどくのが何より簡単だし自由だろ
0149デフォルトの名無しさん (ドコグロ MM83-i2qG)
垢版 |
2018/04/23(月) 08:16:30.00ID:C4a+50u5M
>>146
ちがくね?
お前がやりたいのって別のデータとid(?)が一致する項目にデータを入れていきたいんじゃねーの?
でもそれってコントロールを特定する必要があるんだよね?
コントロールとデータを紐付ける何かはあるの?
0155デフォルトの名無しさん (オッペケ Sr3b-ceek)
垢版 |
2018/04/23(月) 12:34:22.72ID:HUKatAJtr
>>149
いや、単純にファイルから読み込んだ名前で、チェックボックスの文字を変えたいだけです
例えばファイルの中身が 犬,猿,雉だったら?CheckBox1-3の文字をそれぞれ犬、猿、雉にしてCheckBox4-20は「使用不可」にでもするような
だから機械的に参照できればよかったのです

>>153
これでほぼ解決です、ありがとうございます
0156デフォルトの名無しさん (オッペケ Sr3b-ceek)
垢版 |
2018/04/23(月) 12:39:13.94ID:HUKatAJtr
>>154
まあ一言でいうと、わざわざ自分で配列を作らなくても、それを実現する方法はすでに存在するだろうと思ってたのです
配列作ったら「そんなことしなくてもこう書けば一発で参照できるのに」って言われる方法があるんじゃないかと
0158デフォルトの名無しさん (ワッチョイ 9a7f-fvqh)
垢版 |
2018/04/23(月) 13:33:10.44ID:48XgAlPp0
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.checkBoxes = this.Controls.OfType< CheckBox >().OrderBy( x => x.Name ).ToArray();
}

private CheckBox[] checkBoxes;
}
0165デフォルトの名無しさん (スップ Sd5a-lyLw)
垢版 |
2018/04/23(月) 18:38:07.42ID:BY7S8wKYd
これ参考にすればいいのかな
http://ufcpp.net/study/csharp/oo_conceal.html

protected internal 同一プロジェクト内のクラス内部、または、派生クラスの内部からのみアクセス可能

private protected (C# 7.2 以降)同一プロジェクト内のクラス内部、かつ、派生クラスの内部からのみアクセス可能
こういうこと?
0167135 (ワッチョイ 3bc3-9jjH)
垢版 |
2018/04/23(月) 21:02:25.52ID:wp3u/AuE0
皆様いろいろありがとうございました

>>158
書いてくださった方法が、ほぼ私が求めていたものを完璧に実現しています
抱かれてもいいくらい惚れました
ただ、試してみたところピックアップされる順番は必ずしもコントロールを配置した
順番通りではなく、はっきりした法則性も見いだせませんでした
テストプログラムを書いて、インデックスと見た目を一致させるようデザイナで
コントロールを並べ替えようかとも思いましたが、後日コントロールを追加した際
悩むことになりそうなのでやめておきました

>>153
結局この方法でコントロールを検索し、発見したコントロールをリストに追加するという
方法で対応することにしました

>>154
配列に突っ込むにも、コード上に直接 checkBox1 とか checkBox2 とかのリテラルを
埋め込みたくなかったので、検索した上で配列を作ることにしました

>>148, 150, 151
実は書いていることがわからないレベルなので、これから勉強します
「作って覚える」は一通りやったので、「独習c#」を紐解いてみます

>>166
これで解決しました
158の方法で解決するかと思っていたのですが、やってみたところバラバラの順番でした
皮肉でもなんでもなく、コントロールの座標でソートとか、なぜそういう操作をしたいのだろうと
推測したのか教えていただけると嬉しいです
今後も質問すると思いますので、疑問点がわかりやすい文章を意識する必要があるので
0168デフォルトの名無しさん (ワッチョイ 47c9-8E8L)
垢版 |
2018/04/23(月) 21:07:14.52ID:QriAiZTC0
今日から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);
}
}
}
}
0169デフォルトの名無しさん (アウアウエー Sa52-PKj8)
垢版 |
2018/04/23(月) 21:09:42.34ID:b1ST+81Ba
>>167
いやいやいやcheckBox1 とか checkBox2 とかはリテラルじゃないってw
ただの識別子(フィールド名)

コードにリテラルを埋め込むというか、コンパイル時に誤りを検出できない
(普通の理解では)お行儀の悪いコードになるのはむしろ>>153みたいな方法だってw
0170デフォルトの名無しさん (ワッチョイ 47c9-8E8L)
垢版 |
2018/04/23(月) 21:09:53.25ID:QriAiZTC0
namespaceとかcheckedがブロックなのが何かなぁ…
0171デフォルトの名無しさん (ワッチョイ 3bc3-9jjH)
垢版 |
2018/04/23(月) 21:27:15.55ID:wp3u/AuE0
>>169
おっと・・・
どうやら根本的なところで間違っていたようです
書いてあるとおりだとすると、質問とレスが噛み合っていない理由がわかりました
わざわざ行儀の悪い書き方を探していたのか
0172デフォルトの名無しさん (ワッチョイ 9a7f-fvqh)
垢版 |
2018/04/23(月) 21:37:46.50ID:48XgAlPp0
>>167
>>158はOrderBy()でチェックボックスの名前(Name)順にソートしてる。
Nameの代わりに、TabIndexかTagを設定してそれを利用しても良い。
というか、Nameだとチェックボックスが10個以上になるとソートが望むようにならないか。
0173デフォルトの名無しさん (ワッチョイ b7e3-i2qG)
垢版 |
2018/04/23(月) 21:45:21.31ID:Xa6TKCtV0
>>167
おそらく配置したコントロールから欲しい情報は座標とサイズぐらいしかない
それらの特定情報は別ファイルにある
なのでコントロールが上から
もしくは左からか順番に取得できれば
別ファイルに記述した通りの順番で情報を並べることができる
Controlsで取得できる順番はよく知らないけど
作った順かあるいわなんの特徴もなくランダムか何かを保証するものではないのかな?と
0174デフォルトの名無しさん (ワッチョイ 9a7f-fvqh)
垢版 |
2018/04/23(月) 22:10:47.18ID:48XgAlPp0
>>173
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();
0175デフォルトの名無しさん (ワッチョイ 179b-Jtac)
垢版 |
2018/04/23(月) 22:33:20.75ID:fnmaDcrK0
>>155
そういう使い方なら、チェックボックスを先に作っておくんじゃなくて
ファイルから読んだ内容で動的に作っていった方が手っ取り早い
どうせチェックボックスは全部等間隔に並べるんじゃろ?
0180デフォルトの名無しさん (ワッチョイ 3bc3-9jjH)
垢版 |
2018/04/24(火) 06:02:26.80ID:PLNFE8AC0
>>173
なるほど、コントロールから情報を取得する必要があると思えたのですね
実際はそれ以前の段階でしたが

>>175
それも考えたのですが、デザイナで画面を確認したいので、静的に用意して
おきたいという結論になりました
動的に置くほうが難易度高そうだ、と思ったのもありますが
0181デフォルトの名無しさん (ワッチョイ 47c9-8E8L)
垢版 |
2018/04/24(火) 11:44:27.10ID:MJ0NRymv0
>>178-179

「意味無い」って、どういう意味?
0182デフォルトの名無しさん (ワッチョイ 47c9-8E8L)
垢版 |
2018/04/24(火) 12:45:33.19ID:MJ0NRymv0
うぇぇ、C#、goto文使えるし…
0183デフォルトの名無しさん (ワッチョイ 47c9-8E8L)
垢版 |
2018/04/24(火) 13:15:16.40ID:MJ0NRymv0
うーん、string x = "10"; に対して
x.toString(); するんじゃなくて、int.Parse(x); するのか…。
xオブジェクトにintegerを吐き出させるのではなく、
integerオブジェクトにxオブジェクトを与えてintegerを吐き出させる…。

これは初めての体験だな…。
0185デフォルトの名無しさん (ワッチョイ 47c9-8E8L)
垢版 |
2018/04/24(火) 13:34:52.91ID:MJ0NRymv0
なにゆえ?
0186デフォルトの名無しさん (ワッチョイ 47c9-8E8L)
垢版 |
2018/04/24(火) 13:45:01.31ID:MJ0NRymv0
expression-bodied関数は、なんかエロいな…
0187デフォルトの名無しさん (ワッチョイ 47c9-8E8L)
垢版 |
2018/04/24(火) 13:46:08.52ID:MJ0NRymv0
やってる事は違うけど、考え方的にはCのマクロに近いのかな…
0188デフォルトの名無しさん (ワッチョイ 47c9-8E8L)
垢版 |
2018/04/24(火) 13:50:59.68ID:MJ0NRymv0
LINQ…、エロいな…。
0189デフォルトの名無しさん (ワッチョイ 47c9-8E8L)
垢版 |
2018/04/24(火) 13:53:53.94ID:MJ0NRymv0
関数名がアッパーキャメルなのは感心せんなぁ…
0191デフォルトの名無しさん (ワッチョイ 47c9-8E8L)
垢版 |
2018/04/24(火) 14:04:20.23ID:MJ0NRymv0
なんだよ、ToString()メソッドあるじゃねぇかよ…。
0192デフォルトの名無しさん (ワッチョイ 47c9-8E8L)
垢版 |
2018/04/24(火) 14:05:02.22ID:MJ0NRymv0
>>190

ごめん。

質問です。なんだよ、ToString()メソッドあるじゃねぇかよ…
0193デフォルトの名無しさん (ワッチョイ 9a98-9jjH)
垢版 |
2018/04/24(火) 14:39:12.39ID:5gRbnpaG0
VisualStudioでC#のフォームアプリを開発するときに
プロジェクトのプロパティから
出力の種類を「コンソールアプリ」にして
デバッグ用のConsole.WriteLineを出力できるようにしてるんだけど
リリースするときは、種類を「Windowsアプリ」にするだけで
コード中のConsole.WriteLineはコメントアウトとかしなくても
大丈夫ですか?
0194デフォルトの名無しさん (ワッチョイ 9a7f-fvqh)
垢版 |
2018/04/24(火) 15:12:41.47ID:aRAC41/V0
>>193
デバッグ用に文字列を出したいなら、using System.Diagnostics;して、Debug.WriteLine()とか使うべき。
これならリリースビルドにするだけで無効になるからコメントアウトも不要。
リリースビルドでも使いたいなら、Trace.WriteLine()。
0196デフォルトの名無しさん (ワッチョイ 9a98-9jjH)
垢版 |
2018/04/24(火) 17:22:41.52ID:5gRbnpaG0
>>194
おお、ちゃんとデバッグ用のがあるんだ
聞いてよかった
ありがとう

>>195
なるほど
別に見られて困るようなものでも無かったけど
無知を晒す所だった・・・

てか、独学でやってると気づかずおかしなことやってそうで怖いわ
たまたま、ネット上で解説見つかるか
質問して教えてもらえるかの
綱渡りで進んでるw
0198デフォルトの名無しさん (ワッチョイ 0e8a-xhTL)
垢版 |
2018/04/24(火) 20:32:35.47ID:AF96232m0
引数の文字列が、データグリッドに含まれていない場合だけ追加したいんですが、追加されません。
何が原因でしょうか?

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);
  }
 }
}
0200デフォルトの名無しさん (ワッチョイ 0e8a-xhTL)
垢版 |
2018/04/24(火) 20:48:40.81ID:AF96232m0
>>199
view.Rows.Add(str);
だけだと正常に追加されるので、条件判定かループあたりに原因があると思っています。
フラグの位置がおかしいので以下に修正してもダメでした。
void AddToDataGrid(string[] strs)
{
 foreach(string str in strs)
 {
  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);
  }
 }
}
0204デフォルトの名無しさん (ワッチョイ 4e9a-9jjH)
垢版 |
2018/04/24(火) 21:00:23.35ID:PfeXTBpB0
>>200
  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のときエラー
0205デフォルトの名無しさん (ワッチョイ 1aa6-wlRc)
垢版 |
2018/04/24(火) 21:12:02.89ID:UZOTbxqf0
>>204はとってもそれっぽい
で、例外が握りつぶされるような場所でAddToDataGridが使われてるせいで気づけてないとか

こういう場合自分はtry{...}catch(Exception exception){throw;}で囲って
throwの直前にブレークポイントを置いたりしてるけどもっとうまい方法があったら誰か教えてちょ
0207デフォルトの名無しさん (ワッチョイ 4ee8-9jjH)
垢版 |
2018/04/24(火) 21:31:25.92ID:zd8+57fN0
全一
FXきた
0209デフォルトの名無しさん (ワッチョイ 0e8a-xhTL)
垢版 |
2018/04/24(火) 21:38:44.73ID:AF96232m0
みなさん本当にありがとうございます。
結局原因はわからず仕舞いでしたが、最終的に以下の方法で打開しました。

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);
  }
 }
}
0210デフォルトの名無しさん (ワッチョイ 1aa6-wlRc)
垢版 |
2018/04/24(火) 21:49:35.82ID:UZOTbxqf0
>>208
それなら納得
existsの宣言の位置を移動するとif(!exists)がスコープから外れちゃうもんね

>>209
>>204の方法で解決したんなら>>204の指摘が正しかったんでしょうよ
で、それに気づかなかったんならやっぱり例外が握りつぶされてたんでしょ
なら今後のためにも原因は分からずで片付けず例外の名前くらい確認しといたほうが良いと思うよ
0211デフォルトの名無しさん (ワッチョイ 9a98-9jjH)
垢版 |
2018/04/25(水) 15:12:14.28ID:lzwohvOS0
オブジェクト指向のプログラミングでは
変数じゃなくてプロパティにアクセスさせるべき
みたいな事をよく聞くんだけど
・プログラムの開始時にあるフラグ(true/false)を決めて、その後一切変更されることがない
・そのフラグには、コード中の様々な所からアクセスがある
って場合は、プロパティじゃなくてpublicな変数でフラグを定義してもいいんですか?

オブジェクト指向がよくわかってないせいか
プロパティを経由するのがどうしても遠回りというか
一つ余分な作業を挟んでるように感じてしまう・・・
0212デフォルトの名無しさん (ワッチョイ 4e80-c0HJ)
垢版 |
2018/04/25(水) 15:30:51.28ID:eqJJBtIM0
変数は、公開しちゃダメ

その変数に、誰かが代入するかも知れないと考えると、
その変数に代入しているか、すべての場所を確かめないといけなくなるから、
プログラミングできなくなる

だから、プロパティで代入禁止に設定する

ただし、絶対に代入できない定数なら、公開してもよい
0213デフォルトの名無しさん (ワッチョイ 9a98-9jjH)
垢版 |
2018/04/25(水) 16:03:36.81ID:lzwohvOS0
>>212
後から書き換えられるのを確実に防止するために
プロパティを使うってことか なるほど
1人でコード書いてるからそういう発想が無かったけど
自分も後から絶対変な値を代入しない保証ないもんな

てことは、>>211の例だと
・引数付きのコンストラクタを使って、フラグの状態をインスタンス化
・そのフラグのプロパティはgetのみ設定
ってすればいいのか?

でもこれだと、そういうフラグを立てるタイミングがたくさんあったら
その分だけクラスを準備しとくことになると思うんだけど
そういうもんなの?
0214デフォルトの名無しさん (ワッチョイ 9a98-9jjH)
垢版 |
2018/04/25(水) 16:12:23.29ID:lzwohvOS0
あ、いや
クラスを複数準備する必要はないな

>>213の後半の話は無しで
0215デフォルトの名無しさん (ワッチョイ 4bbb-txNp)
垢版 |
2018/04/25(水) 16:13:38.42ID:VelEInRI0
>>211
212は読まなくていい
フィールドだってreadonly修飾子で代入禁止できるが、212はそんなことも分かってないから

プロパティがフィールドと違う点は大ざっぱに
* 派生クラスでオーバーライドできる
* プロパティから構造体を返すとコピーされる
の2点
この2つの特性が必要ない(または避けたい)場合にフィールドを選択してよい
判断できないならプロパティを選択する
0217デフォルトの名無しさん (ワッチョイ 1aa6-wlRc)
垢版 |
2018/04/25(水) 16:51:44.20ID:I8kFq/qw0
>>211
>>215はどこかのコピペじゃないならすごい分かりやすくて尊敬
一つだけ補足すると、↓のようなこともあるからクラスが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

あと>>212も善意で答えてるのは分かるんだけど
代入できるかどうかだけを判断基準にしてる時点でズレてて
定数の説明も参考にならない気がするから割と真面目に>>212は読まないほうが良いと思う
すまぬ>>212
0218デフォルトの名無しさん (ワッチョイ 9a98-9jjH)
垢版 |
2018/04/25(水) 17:43:22.74ID:lzwohvOS0
>>215
>* プロパティから構造体を返すとコピーされる
これが、全然分からんのだけど
classの代わりにstructを使った場合の話であってる?
今の自分が考えたところで、どうせちゃんと理解出来ない気もするけど
0219デフォルトの名無しさん (ワッチョイ 1a1e-fvqh)
垢版 |
2018/04/25(水) 17:44:09.08ID:EO6K8yEq0
>>212は別に全く問題ないだろ。

>>211の要はカプセル化の質問に対して、>>212はカプセル化の話として一般論として答えただけじゃん。

それに対して>>215>>217はここはC#のスレだからC#特有のreadonlyなフィールドあるよとか言語依存の情報
つけ足してるだけじゃん。
0220212 (ワッチョイ 4e80-c0HJ)
垢版 |
2018/04/25(水) 17:48:51.21ID:eqJJBtIM0
オブジェクト指向では、変数は公開しない。
公開できるのは、処理(関数)だけ

クラス内を開発する人と、そのクラスを使う人は、別の会社・人を想定しているから、
変数にアクセスさせたら、絶対にダメ

クラス内を作っている開発者は、後で付け加えられる処理を予想できないから。
クラス内を開発した後に、別人が変数にアクセスして、動きを変えたらバグる

異なる会社間での開発を可能にする、
オブジェクト指向の大原則・カプセル化
0221デフォルトの名無しさん (アウアウエー Sa52-PKj8)
垢版 |
2018/04/25(水) 17:50:35.02ID:ClmIY1xNa
プロパティから構造体を返すとコピーってのは意味わかんないね
コピーされるのは右辺がプロパティだろうがフィルドだろうが同じだよw

>>211
少なくともパブリックなメンバーに関しては、あえてフィールドを使う理由はないって
理解でいいと思うよ。例外はアンマネージドコードの呼び出しで使う型を定義する場合ぐらい。

フォールドのプロパティーに対して優位な点は

(1) 軽量である
(2) 簡潔に書ける

このぐらいしかない。

(1)が重要なケースなんかまずない。
(2)については、古いC#はともかく今のC#は儒分簡潔に書けるようになって来てる。
0222デフォルトの名無しさん (アウアウエー Sa52-PKj8)
垢版 |
2018/04/25(水) 17:59:38.62ID:ClmIY1xNa
>>220
カプセル化っていのは、触る必要がないもの、触られては困るものを隠すこと。
この質問にはほとんど関係ない話w

フィールドをプロパティにしようが、触る必要がない文脈で触られることを防げるわけじゃないw
せいぜいセッターで値が適切かどうかチェックできる程度
0224デフォルトの名無しさん (ワッチョイ 1a1e-fvqh)
垢版 |
2018/04/25(水) 18:04:12.14ID:EO6K8yEq0
>>222
質問者は
>オブジェクト指向のプログラミングでは
>変数じゃなくてプロパティにアクセスさせるべき
>みたいな事をよく聞くんだけど
で書いて始めてんじゃん。だから、カプセル化の説明した方がまずいいんじゃねぇか??
0225デフォルトの名無しさん (アウアウエー Sa52-PKj8)
垢版 |
2018/04/25(水) 18:09:53.61ID:ClmIY1xNa
>>224
何が「だから」なのかよくわかりませんw

質問は外部に見せるデータをプロパティとして実装すべきかフィールドでもよいのか。
カプセル化(余分なものを外に見せるな)は何も関係ないってw
0226デフォルトの名無しさん (ワッチョイ 1a1e-fvqh)
垢版 |
2018/04/25(水) 18:14:14.76ID:EO6K8yEq0
>>224
>オブジェクト指向のプログラミングでは
>変数じゃなくてプロパティにアクセスさせるべき
>みたいな事をよく聞くんだけど
を質問者が引き合いに出した以上、質問者はここからはしっかりわかってなくて、色々ごちゃ混ぜになってると
思われる。だから、そっから説明しなきゃ、おそらく習得できない。
0227デフォルトの名無しさん (ワッチョイ 9a98-9jjH)
垢版 |
2018/04/25(水) 18:17:11.69ID:lzwohvOS0
自分はオブジェクト指向じゃない言語をちょっとだけやってたんだけど
そういう言語では、コードの最初の方に
public bool JudgFlag = true
って1行書いて、それにどこからでもアクセスするみたいな感じだと思うんだ
(全部独学だからこれも正解なのか知らんけど)
でも、オブジェクト指向ではこれやったらダメなんだよね?
ってのが知りたい

後、俺マジで初心者だから
質問文で聞きたいことが正確に表現できてる保証ないwすまん
■ このスレッドは過去ログ倉庫に格納されています

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