【C#】get/setの使い方
get、setの使い方がよくわかりません。どういうときに使うのですか?
基本的に、メンバ変数へクラス外部から直接アクセスするのはあまり好ましくありません。メンバ変数とのやりとりはメソッドを活用するようにする事が望ましいとされています。その際に活用できるのがプロパティです。
get/setは、C#のプロパティである

プロパティは、そのクラス(実装側)からはメソッドのように扱える。
利用する外部のクラスからは、メンバー変数のように見える。

getは値の取得、setは値の設定をするもの。

getには値の読み取りがあったときの動作を記述する。
必ずreturn文で値を返す必要がある。
「return 変数;」と記述すれば、フィールド変数の値を返される。

setには値の書き込みがあったときの動作を記述する。
「変数 = value;」と記述すれば、アクセス元から渡された値(value)が書き込まれる。
クラスのメンバ変数をpublicにすると、外部からメンバ変数の値を変更できてしまうので、 privateで実装し、隠蔽化する場合に利用する機能である。

プロパティの中にあるgetとsetはアクセサーと呼ぶ。

また、下記の例19行目のように、setアクセサに設定する値の制限をすることも可能です。

プロパティの使用例)

// 実装する側
class Sample
 {
   static void Main()
   {
     // 変数
     × public  int code; ←メンバ変数を公開すると外部から変更されてしまう
     ○ private int code; ←メンバ変数をプロパティとして隠蔽化する

     // プロパティ
     public int Code ←メンバ変数と同じ名前で記述することが多い。
                        修飾子はpublicにして、外部からのアクセスを可能にする。
     {
        get{
              return this.code; //値を取り出す
           }

        set{  // 0~1000までの整数を設定
              if(0 <= value && value <= 1000)
              {  this.code = value; //値を書き換え }
           }
     }
   }
 }

// クラス利用側
class Sample2
{
   public void Test()
   {
      int sam = new Sample(); //Sampleクラスのインスタンス生成

      // Sampleクラスのcodeプロパティから値を取得する場合
      int aaa = sam.Code;

      // Codeプロパティにアクセス
      // Sampleクラスのcodeプロパティに値を設定(書き込み)する場合
      sam.Code = 100;
   }
}


get/setを利用するメリット

・変数では、外から自由に値を書き換え可能だが、メソッドなので書き換える前に、 チェックすることができる。

・実際はメソッドなのに、変数を操作しているように見せられる

・変数をprivateにしてプロパティを使うと、他のクラスから変数の値を誤って変更することを防いだりし、データの保護に役立つ

自動実装プロパティ

自動実装プロパティは、getやsetの処理を書かずに、簡潔に書ける方法です。

自動的にフィールドが作られ、値の読み書きが可能になります。
また、初期値を与えることも可能。

// 実装する側
class Sample
 {
     // プロパティ
     int Code{ get;set; } 
 }

※以下の実装と同じ

// 実装する側
class Sample
{
     // 変数
     private int code; 

     // プロパティ
     public int Code
    {
         get{ return code; }
         set{ code = value; }
     }
}

初期値あり

// 実装する側
class Sample
 {
     // プロパティ
     int Code{ get;set; } = 1;
 }
get/setで異なるアクセスレベルを設定可能

プロパティの set/get アクセサーそれぞれ異なるアクセスレベルを設定することができる。

アクセス制限を個別に設定する場合は、先頭に与えたアクセス修飾子よりも狭い範囲のものしか使用できない。

また、getとsetの両方にアクセス修飾子を与えることは不可。

例)

 class A
 {
   private int n;
   public int N // publicにして外部からアクセス可能にする
   {
      // 外部からアクセス可能
      get{ return this.n; }

      // 値の設定は同じクラスからしかできない
      protected set{ this.n = value; }
   }
 }


getのみ記述する

getのみ記載した場合は、値の設定はできず、同クラス内からでも設定はできません。

初期値もしくはコンストラクタでのみ値を初期化できます。

// 実装する側
class Sample
 {
     // プロパティ
     int Code{ get;} 
 }

今日はここまで。