アプリ版:「スタンプのみでお礼する」機能のリリースについて

プログラム初心者です。
いきなりC#から勉強するのは難度が高いかもしれませんが、
克服しないといけません。
分からないことがあります。
教えていただけますでしょうか。

例えばC#のプログラミングで使用する
getterとsetterについて初心者でも分かりやすく教えていただけないでしょうか。

"C#では変数に「プロパティ」を作ることができます…"とか
"フィールド(クラスのインスタンス変数)というのは、クラスの内部で持っている値です。
この内部の値に直接外部からアクセスさせてはいけません。
カプセル化では、フィールドへの読み書きは、必ずそのクラスのコードを経由して行います。
つまり、間接的に読み書きします。"とか書かれているものがありました。
この値はいかなるどういう値で、それを取得したい場合に使うのか
分かりません。正確にイメージできません。

あと以下の例文があったのですが、
valueというのはもともとどういう値が入っていて代入しているのですか?

宜しくお願いします。

public class Person
{
private string name;

public string Name;
{
get { return this.name; }
set { this.name = value; }
}
}

A 回答 (5件)

あまりいい例ではないのだが:



例えばあなたの所持金を, あなたの「プロパティ」と考えてみましょうか. 何らかの事情でほかの人があなたの所持金を知らなければならないかもしれません. そのとき, あなたはほかの人があなたの所持金を自由に知ることができるようにしていますか? それとも, 「あなたに尋ねる」など一定の方法で知ることができるようにしていますか?

あるいは, 場合によってはあなたの所持金が変化することもあるでしょう. そのとき, ほかの人が勝手にあなたの所持金を増減させることができるようにしていますか? それとも, あなたの許可によって増やしたり減らしたるするようにしていますか?

下の例の value は setter のデフォルトの引数でしょう.
    • good
    • 0

本来のオブジェクト指向の考え方では、「オブジェクトの状態を表すもの」をプロパティと呼称します。



例: オブジェクト「ファイル」の状態「最終更新日」

オブジェクト指向のプログラム言語において、このプロパティを実現するために「オブジェクト内の変数」の形式で使うのが一般的です。

 File o = new File();
 Date d = o.LastUpdateDate; // ここ

ですが、変数では正確な状態を取得できないケースがあるとします。

 Date d = o.LastUpdateDate; // だれかに更新されたら古い情報になる
 Date e = o.GetLastUpdateDate(); // 取得する処理が必要

そこで C# には「変数の様に操作できるオブジェクト」という機能があります。

 public Date LastUpdateDate {
  get { return this.GetLastUpdateDate(); }
 }
 Date d = o.LastUpdateDate; // 実は GetLastUpdateDate() の結果を取得している

この「変数の様に操作できるオブジェクト」を、プログラミング言語では「プロパティ」と呼びます。
区別する為に「オブジェクト内の変数」は「フィールド」となります。

しかし変数のように使うには、変数の「設定」と「参照」の二通りの使い方を真似しなければなりません。そのためプロパティには、設定を担当する getter メソッドと、参照を担当する setter メソッドが存在します。


まとめ

 フィールド: オブジェクト内の変数
 プロパティ: オブジェクト内の変数の様に操作できるオブジェクト
 setter: プロパティにおける「変数の設定」を担当するメソッド
 getter: プロパティにおける「変数の参照」を担当するメソッド

例題の name ですが、これは記述が省略されていますが setter メソッドの第一引数のことです。
    • good
    • 0

#2で書いたアクセス元で判定…は出来なかったかも。


そういう意味ではイマイチな例になっていたと思われます。
まあ、だいたいのイメージということで……。
    • good
    • 1

長々書いていたらカブった。


# アクセス制御の例で財布の例が使われる…なんてのまでカブりましたな。
# 「直接的に」わかりやすい例になるから…でしょうけど。
    • good
    • 0

>この値はいかなるどういう値で、それを取得したい場合に使うのか


>分かりません。正確にイメージできません。

想定外の値を勝手に書き換えられたり、秘密にしたい内容(相手)に勝手に見られないように……。
ってところでしょうかね。
変数の内容を覗いたり書き換えたりできる対象を制限したい場合とか。

入力の時点でエラーになる値を弾くようにしておけば、以降の処理を簡略化することができます。
たとえば日付を扱いたい時に西暦-6000年16月889日とかの入力をエラーに出来る。とか。

机の上に貴方の財布が置いてあります。
他人が勝手に財布を開けて飲み会の代金を徴収していった場合、貴方の知らないウチにお金が減っている事になります。
貴方に請求して貴方が財布からお金を取り出し払った場合なら、財布から幾らの現金が出ていったのかについては把握できますよね?
# seter相当。自前で処理しているのだから、収支については把握できます。
貴方に手持ちの金額を尋ねて(geter相当)、飲み代分が足りないとかなら「後日徴収する」とか対応も可能ですよね?
# 問い合わせ部分がgeter相当。財布内の現金額を知られたくない相手ならば答えない(あるいは嘘の金額を言う)などの制御が可能です。


>あと以下の例文があったのですが、
>valueというのはもともとどういう値が入っていて代入しているのですか?

seterの呼び出し元が設定した値を一時的に受け取る変数です。
よって、どんな値が入っているかは(呼び出し元)コード次第でしょう。
# その値が不正なのかどうかを判定してフィールドメンバに値を適用するかどうかを制御します。
# 掲示された例では未チェックですけどね。

外のクラスからはnameというフィールドには直接アクセスできません。(privateですから)
そんなワケで間接的にアクセスする為のseter/geterとしてNameというプロパティが用意された。
ということになります。
# もちろん、publicなフィールドも作れますけどね。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!