【C#】プロパティについて勉強した【記録】

C#

 

どうも。

C#勉強の途中。

今はオブジェクト指向とその特徴的な機能を勉強していますが、今回はプロパティについて少し書いてきます。

 

プロパティの基本

 

私のプロパティの認識を書いておきます。

 

C#を含む多くのプログラミング言語には、アクセス修飾子という機能があります。

 

アクセス修飾子にはよく使うもので、private、public、protectedなどがあり、これを変数に付けることで変数を好き勝手に操作できないようにすることができます。

 

private修飾子は、同じクラス内にあるメンバーしかアクセスすることができません。

 

つまり、「private string name;」というstring型のname変数は、name変数のあるクラス内にあるメンバーしかアクセスできないため、変更、削除などをすることができません。

 

制限と聞くと、変数を扱いにくくなるprivateを使うのは少しためらわれるかもしれません。

 

しかし通常プログラムを扱う人間にとっては、そのことよりも、publicのような「クラス外のどこからでも勝手にいじることができてしまう」ことのほうがリスクが高いのです。

 

そこで使うのがプロパティです。

 

プロパティを使うことで、本来アクセスすることができないクラス外のprivateな変数にアクセスすることができます

 

また、プロパティはそのほかにも「クラス利用者からは変数を扱っているように利用できる」という利点があります。

 

書いているだけではしょうがないので、いかにプロパティのサンプルコードを載せます。

 

 

これはとても基本的なプロパティの例です。

 

今回のプロパティ名はName(自由に決められます)です。

プロパティを呼ぶ際は、プロパティのあるクラスをインスタンス化してから「p.Name = “山田”」のようにまるで変数に値を代入しているように利用できます。

 

プロパティの構文として、set、get という機能があります。

 

上のプロパティ内の処理分を見てもらえばわかりますが、setブロック内には「this.firstname = value」と書かれています。

 

プロパティが呼び出された時の引数はvalueに渡されるので、要は「プロパティに渡されたvalue変数内の値をクラス内のfirstname変数に代入する」というコードになります。

 

プロパティ自体がfirstnameと同じクラス内にいるので、この代入は問題はありません。

 

このようにして、本来メイン関数からではアクセスすることができない、privateなfirstname変数に値を代入することができました。

 

直接ではなく、間接的に変数を代入しているわけです。

 

firstnameに代入された値を呼び出すには、getブロックを実行します。値を代入した値は「p.Name」としてすることでgetブロック内のreturn文が実行されて、呼び出すことができるのです。

 

自動プロパティ

 

自動プロパティは先ほどのプロパティを簡略化したものです。

 

例えば、先ほどのprivateな変数が増えると、同じような「valueを使って代入して、get内でreturn分を書いて値を返す」というプロパティを何個も書くことになります。

 

これだとめんどくさいので、「代入して返す」という処理を自動化する「自動プロパティ」が追加されました。

 

自動プロパティは簡単に書くことができ、

のように書きます。

 

実際に使ったときのプログラムを書いておきます。

 

呼び出し方は普通のプロパティとまったくかわらず、プロパティ定義がかなり簡単化されました。setやgetの{}がいらなくなり、自動的に代入とreturnがされています。

 

具体的には以下のようなコードが内部で自動生成されているイメージです。

 

 

これなら、プロパティを書くのもあまり面倒になりません。

 

自動プロパティの意味

 

ここで、「自動プロパティって普通にpublicな変数を宣言するのと何が違うの?」とふと疑問に思いました。

 

プロパティは「privateな変数に間接的にアクセスするための機能」です。

 

しかし、以下のような自動プロパティだと、プロパティ自体が文字通り変数のようになり、publicなので当然クラス外からもアクセスできます。

 

これは「public int Age;」のように宣言するのと同じことです。

 

値の代入や出力もまったく同じコードでできてしまいます。

 

その後、自動プロパティの意味を考えて自分なりに意味を考えてみました。

 

  • そもそも全ての変数は間接的にいじるべき
  • 後から機能の拡張、修正ができる
  • なにはともあれ保守性

 

プロパティの本来の機能は、「直接操作されるべきではない変数を間接的に操作する」です。

 

この観点から考えると、たとえpublicな変数と同じに見えても「間接的に操作する」ことを重視して自動プロパティを使う意味はあります。

 

また、後々仕様の変更などがあった際にも自動プロパティなら通常の変数の代入ではできない操作を加えることができます。

 

要は代入するときのsetブロック何に必要な処理を加えるだけでいいのですから。

 

また、以上の理由から、保守性の点からも自動プロパティを使うメリットはあると考えられます。

 

保守性は、要はコードの管理のしやすさです。自動プロパティを使うことで、先ほども書いた仕様変更の際のコード変更がやりやすいのです。

 

という風に自分なりに、自動プロパティを使うメリットを考えてみましたが、いかんせん、実践的なアプリやアルゴリズムを書く機会なんてないので、いまいちその時間がわきません。

 

なので、自動プロパティを使うメリットがほかにあったり、それは違う、という点がったらコメントして教えてくれると助かります。

 

では。

コメント