お世話になります。
初歩的な質問なのですがよろしくお願いします。
getアクセサーsetアクセサーについてなのですが
私の解釈だと
クラス内でprivateに設定した変数を参照できるようにするためのプロパティだと思っています。
この場合、変数をpublicにした場合も同じではないのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
ベストアンサー
こんにちは。
変数をpublicにした場合も同じ
この点については、その通りです。
プロパティのget/setアクセサはコンパイルされるとただのメソッドとなります。C#の記述上特別な方法でアクセスできるというだけなのです。
クラス内でprivateに設定した変数を参照できるようにするためのプロパティ
この解釈については、プロパティにはその一面もありますが、それだけが全てではないです。
プロパティはその名の通り、オブジェクトを外から見た場合に、そのオブジェクトが持つ情報、状態を表現するためのものです。
その中身は変数への参照である必要もなく、自分が持つ「状態」を表すために、特定の計算を含むことも可能です。
プロパティは、基本的にはgetのみを実装するもの(オブジェクトの状態を「見せる」ためのもの)であると考えると、プロパティと変数の違いが見えてくると思います。実際の変数の中身をそのまま公開する場合もあれば、見栄え良く「加工」して見せたい場合もあるはずです。
setは変数のセットではなく、「オブジェクトの形態に外から手を加える」ものであると考えましょう。与えられたパラメータをそのまま変数にセットする必要はないのです。
よって、プロパティは単なる変数とは違い、「どのように自身の状態を公開するかを自分で決められる高機能な変数のようなもの」であると理解しておけばまずは良いでしょう。オープンソースなライブラリのソースを見てみると、プロパティがどのような概念で、どのように使われるのかが分かってくると思います。
投稿2017/03/10 03:13
総合スコア4103
0
クラス内でprivateに設定した変数を参照できるようにするためのプロパティだと思っています。
それはかなり昔の話で、今は EF Code First でデーターベースを生成するときの Model での定義、
新しいデータベースの Code First
https://msdn.microsoft.com/ja-jp/data/jj193542.aspx
ASP.NET MVC などでのデータの受け渡し、データアノテーションによる検証などにも不可欠です。
投稿2017/03/10 03:54
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
こんにちは。
setとgetの両方を実装する場合、おっしゃる通り隠蔽機能はなくなります。
getだけをpublicに実装して、外部からはRead Onlyとするような使い方もあります。
ブレークを張ることができるので、デバッグの時便利な場合もあります。
しかし、そもそもの目的はturbgraphics200さんの回答のように何か処理を仕込むことですね。
GUIフレームワークで、Widthプロバティを変更しただけで当該ウンドウの幅が変わるといった使い方が発祥だったと思います。(at Visual Basic)
ところで、プロパティの実装が「getアクセサーsetアクセサー」です。
プロパティと「getアクセサーsetアクセサー」を別物と捉えられているように読み取ったので補足しておきます。もし、私の読み取り損ないでしたらすいません。
投稿2017/03/10 03:22
編集2017/03/10 04:51総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/10 04:22
2017/03/10 04:28
2017/03/10 04:47
2017/03/10 05:26
0
オブジェクト指向における実装の隠蔽(カプセル化)に基づいたものだからじゃないでしょうか。
https://msdn.microsoft.com/ja-jp/library/ms173118.aspx
MSDNでも
「// public field (Generally not recommended.)」
と書かれている通り、publicなフィールドは非推奨ですし。
投稿2017/03/10 03:16
総合スコア559
0
それもそうですが、それよりもプロパティにアクセスしたときに実行する処理を追加できたり、別にprivate変数でなくてもその時点の値を加工して取得設定できたりといろんのが大きいと思いますが。
c#
1string hoge { 2 get { 3 return this.fuga + this.piyo; // fuga と piyo を連結したものを返す。 4 }, 5 set (value){ 6 if(value == null) { 7 // nullが代入された時、bar()を実行する 8 bar(); 9 } 10 this.fuga = null; 11 this.piyo = null; 12 } 13}
投稿2017/03/10 03:06
総合スコア4267
0
private なメンバ変数は(通常は)setter を経由しないと変更できないように作ります。
ということは、例えばおかしなデータ(誕生日が15月36日とか)を設定しようとしても、setter の中で処理をして弾くことができます。
もし public になっていれば、どこからでも変更できてしまい、ガードできないのです。
本質的にはメンバ変数はすべて private であり、必要に応じて getter/setter でアクセスを公開する、という考え方(get/set のメッセージを受け付ける)ですね。
投稿2017/03/10 03:34
総合スコア13703
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/10 04:19
2017/03/10 04:53 編集
2017/03/10 05:27