LoginSignup
icoke
@icoke

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

プロパティで分からない所

プロパティで一部、想定された用途がいまいち分からない所があります。

プロパティの想定された使い方がイマイチ分かりません。
とりあえず

private int _field;
public int Field {
    get { return _field; }
    set { if( value >= 0 ) _field = value; }
}

で設定できる値を自然数のみに絞れるように、if文や演算子を使って、入力や出力に何らかの操作を持たせられるところまでは分かっています。これの有用性などは分かります。

ただ、

// 1
private int _field;
public int Field {
    get { return _field; }
    set { _field = value; }
}

// 2
public int Field { get; set; }

// 3
public int Field;

の違いが分かりません。
2が自動プロパティで、1のコードをコンパイラが自動生成してくれる事は知ってます。

上記の1,2と3で
スコープ範囲って変わらないと思うのですが、色んな説明を読んでると、アクセスを制限出来るみたいな説明がなされるのを見かけます。

もしかしてスコープ範囲以外の目的なのでしょうか?

*スマホから質問しているのでコードミスとかあればすみません

(追記)
つまり何が聞きたいかというと、{ get; }で読み取り専用にしたいみたいな意図がないなら{ get; set; }を付ける意味あるの?って事です。

0

1Answer

プロパティへのアクセスは、使う側からは一見フィールドへのアクセスと同じように見えますが、実質的にはメソッドの呼び出しです。

メソッドは抽象化・継承が可能で、実装時には何もしていないプロパティでも後から処理を追加したり、継承してプロパティのアクセス時にする何らかの処理を実装する事ができます。フィールドではそのようなことはできません。
インターフェースを使用した抽象化プログラミングをしていると、ありがたみが分かってきます。

また、一般的にフィールドをpublicにするのは非推奨とされていますので、クラスメンバをpublicで公開する場合、プロパティ等を使用することになります。

一般に、フィールドに対する private または protected のアクセシビリティを宣言する必要があります。 型からクライアント コードに公開するデータは、メソッド、プロパティ、インデクサーを使用して提供する必要があります。

2

Comments

  1. @icoke

    Questioner

    すごく分かりやすかったです

Your answer might help someone💌