C#開発における落とし穴~プロパティ編~
技術担当の大林です。
前回に引き続き、C#の開発における落とし穴、所謂うっかりやらかしたり勘違いしやすい部分について少し書こうと思います。
※当記事はVisualStudioでの開発を想定して執筆しております。
開発環境次第では当てはまらない事もある事を、あらかじめご了承ください。
さて、今回はプロパティについて触れようと思います。
C#では、わざわざgetter、setterのような形で新たに関数を定義しなくても、メンバごとにget(値挿入)set(値取得)を設定できるようになっています。
↓こんな感じ↓
public int SampleProperty { get; set; } = 0;
また、アクセスレベルを個別に設定したりも出来ます。
↓こんな感じ(クラス外からは取得のみ可能)↓
public int SampleProperty { get; private set; } = 0;
get、setごとにそれぞれアクセサー関数のような形で処理を入れ込むことも出来ます。
こうして記述した場合でも、特に気にせず「hoge.SampleProperty=1」みたいな感じで、見た目変数と全く同じように使用できます。
(「hoge.SampleProperty()」みたいな呼び出し方はしない)
↓こんな感じ↓
1 2 3 4 5 6 7 8 9 10 11 12 | private int _SampleProperty; public int SampleProperty { get { return _SampleProperty; } private set { _SampleProperty = value; } } |
アクセスレベルの調整までの形で使ってる分には、あまり大きな問題は起きないのですが、関数として実装するとなると話は大きく変わってきます。
様々な処理が内部でされている可能性があるという事は、変数のつもりで気軽に何度も使うと非常に処理が重くなったり、メモリを大量に使用する等の弊害が起きる可能性が出てきて来る可能性があるからです。
(例:取得・設定時にチェックやロックがかかる、全データの中を検索して特定のデータを抽出する・元の値を変えられないようにクローンして渡すetcetc…)
そのため、うっかり1連の処理内で何度も「hoge.SampleProperty」みたいな感じで扱ってしまうと、知らず知らずのうちに重い処理を作ったりしてしまう危険があります。
なので、C#では特に毎回参照しなければいけないような理由が無い場合、処理の最初等で「var sampleproperty = hoge.SampleProperty」みたいな形で、ローカル変数等に取得した結果を一度移したあと、使いまわす事を徹底するのが、この手の問題を将来にわたって防ぐために重要になってきます。
他言語でもコードのメンテナンス性を高めたり、参照にかかるコストを排除して高速化のためにローカル変数に最初に結果を移すようなコードを書くケースがありますが、徹底されてなくても極端に動作が遅くなったりといった事はあまりありません。
ただし、C#のプロパティでは変数と変わらない使用感で関数として使えてしまうが故に、より一層注意する必要があります。
では!
見ていただき、ありがとうございました!