【C#】「プロパティ」getとsetを使ってデータを保護する

プロパティとは、変数の宣言と初期化をした後に、その変数にGet(取得する値)とSet(代入する値)を設定することです。
変数をprivateにしてプロパティを使うと、他のクラスから変数の値を誤って変更することを防いだりし、データの保護に役立ちます。

プロパティではなくインスタンス変数でアクセス例

プロパティではなくクラスにインスタンス変数を作ってpublicにすると、どこからでも値の書き込みと読み込みができます。
ですので、誤って変数の値を変えてしまいバグにつながることがります。

class Program1
 {
  static void Main()
  {
  Program2 obj = new Program2();
  obj.a = "おはよう"; //Program2クラスの変数aに"おはよう"を代入
  Console.WriteLine("{0}", obj.a);
  }
} class Program2 { public String a; //クラスで文字列型の変数aを宣言 }

program1クラスでProgram2クラスのオブジェクト「obj」をつくっています。
「obj.a = “おはよう”」でProgram2クラスの変数aに”おはよう”を代入しています。
このように、Program2のインスタンス変数aはpublicになっているので、どこからでも書き込みと読み込みができます。
しかし、どこからでもアクセスできると誤って変数aの値が変わってエラーになってしまったり、ユーザーに負の値を入力させたくない場合などがあります。
プロパティを使うとそういった問題が回避できます。

アクセス修飾子 データ型 プロパティ名
{
 get
 {
  return 値を取得するフィールドの変数名;
 }
set { 値を代入するフィールドの変数名 = value; //value(予約語)はユーザーの入力を表す } }

プロパティの中にあるgetとsetはアクセサと呼びます。
値を取得するときはgetアクセサが呼び出されます。
値を代入するときはsetアクセサが呼び出されます。
value(予約語)はユーザーが入力した値を示します。
プロパティ自体にvalueをしまっておくことはできないので、フィールドに変数名を指定してvalueを代入しています。

プロパティにアクセスする構文

プロパティにアクセスして値を取得するには以下の構文になります。

オブジェクト名.プロパティ名

インスタンス変数にアクセスするような感じで値を取得できます。

class Program1
{
  static void Main()
  {
   Program2 obj = new Program2();
   Console.WriteLine("{0}", obj.Msg); //obj.MsgでプロパティMsgの値を取得
  }
}
class Program2 { private String msg = "おはよう";
public String Msg { get { return msg; } set { msg = value; } } }

例を実行するとコマンドプロントに「おはよう」と表示されます。
変数msgはprivateなので、Program2以外からはアクセスできません。
なので、他のクラスからProgram2の変数msgの値を変えられないようになっています。
プロパティで静的な値を設定、取得する構文
プロパティで静的な変数の値を取得することができます。

アクセス修飾子 static データ型 変数名 = 値; //変数の宣言と初期化
アクセス修飾子 static データ型 プロパティ名 //プロパティの指定 { get { return 値を取得するフィールドの変数名; }
set { 値を代入するフィールドの変数名 = value; } }

アクセス修飾子の後にstaticをつければいいだけなので簡単です。

プロパティで静的な値を設定、取得する例

class Program1
{
  static void Main()
  {
   Console.WriteLine("{0}", Program2.Msg);
  }
}
class Program2 { private static String msg = "おはよう";
public static String Msg { get { return msg; } set { msg = value; } } }

例を実行するとコマンドプロントに「おはよう」と表示されます。
staticなので、「class Program2」をオブジェクト化しなくても「Program2.Msg」だけで「変数msg」の「おはよう」が取得できています。