項目2 コンパイル時定数と実行時定数

2019年1月10日

前回 項目1:varについて

Effective C# 6.0/7.0 項目2

題は「constよりもreadonlyを使用すること」ですね。

先日の講習のときに、講師の方が興味深い話をしており、それは「初期化が行われるタイミングを意識しなさい」という事でした。

その話がここに繋がっているのではないかな、と思います。

パフォーマンス重視…const使用でガチガチコーディング

柔軟性重視…readonlyで実行時に決まるようにしておきなさい

という事を意識しておくだけでよいと思いました。

またconst値の初期化はプリミティブ型でないとできない、というのは、何となくエラーが出て記憶には残っていましたが知りませんでした。

プリミティブ型についてはこちらを参照してください。

飛躍的にパフォーマンスが上がるわけではない

constにすると実行速度が速いみたいですが、どうやらそこまで飛躍的に上がるわけではないみたいですね。

一回読み込んでずっと使える物なのか、毎回起動時に読むものなのか、の違いなので、起動時に読み込む量が増えれば顕著に実行速度が変わりそうですね。

ただ、実行速度が目に見えて遅くなるほど実行時定数を使用するようなプログラムってそんなになさそうですよね…。

あるとしたら、設計か仕様が甘すぎると怒られそうです。

柔軟性を取る方がメリットが多い

私自身、C#を勉強し始めたころに「どちらがいいのだろう」と疑問に思い調べてからはreadonlyを使うようになりました。

ただ、半永久的に変わらないような値についてはconstを使うようにしていますね、円周率のような。

スピード云々より、変更があるかどうかで判断してどちらを使うかに主眼を置いた方がいいと、個人的には思います。

今作っているソフトなんかは実験的に使ったり、設定を変更して使う機会が多いため、ハードコーディングにあまり頼らないような造りになっています。

そのため、実行ファイル以外から読む情報が多いため、起動時に一度だけ設定を読み込むなどの処理部分についてはstatic readonlyで受けている部分がほとんどです。

作る側としても使う側としても「柔軟に色々とできる(使い方次第でこちらが提示したもの以上の使い方ができる)」というのは嬉しいと思います。

あまり柔軟に作りすぎると原型がなくなったり、変に変更を加えられて動かなくなる可能性もありますが、そこは設計の見せ所ですね(設計とは便利な言葉である)。

この項での教えは「プログラミングにおいて、適当な柔軟性を持っている事は重要である。よってreadonlyを使うべし」だと考えます。

実装者が「どちらを使うべきか」という事を、論理的に説明ができる上で使用するのが一番重要だと思いました。