そもそも定数って何? どうして必要なの?
constを使うときの注意点も知っておきたいな
こんにちは。文系出身で今年現役8年目エンジニアになる佐藤です。
みなさんはC#でconstを使って正しく定数を宣言できていますか?
そもそも「定数」ってなんだろう……という初心者の方も多いのかもしれませんね。プログラミングをしていく中で「定数」も非常に大切な要素です。
この記事では、どんなレベルの人にも分かりやすい言葉で「C#で定数を宣言するためのconstの使い方」「定数の意味」そして「constを使うときに気を付けること」をまとめて解説していきます。
まだまだC#でのプログラミングを始めたばかりという方は最初から、もう定数の事は知ってる!という方は使い方からぜひご覧ください。
それでは、最初はconstの概要、定数の意味を解説していきます。
constの概要
この章では、constの概要を解説してきます。まずは基礎知識をつけて、土台を作っていくことから始めましょう!
constを使えば定数を宣言できる
C#で定数を宣言する時にはconstというキーワードを使います。宣言する時から定数だということも分かるので、非常に見やすくなります。
ですが「そもそも定数って何?」という疑問をお持ちの方もいらっしゃるでしょう。
定数の意味や必要性も理解してconstを使って行けるよう、次に定数に関しても学習していきます。
定数の意味と必要性
定数は名前の通り「固定の数」で、一度決めたら変えない値を格納するモノです。変数はプログラムが動いていく中で値が変わっていきますが、定数は変わりません(変えられません)。
と思ってしまいがちですが、全て変数で作ってしまうと次のような問題が発生しやすくなります。
値を変えたく無かったのに手違いで変わってしまった
例えば、税率を入れる変数「tax」をつくり、値を「0.08」と決めていたとします。
いろいろプログラミングする中で知らぬ間に「tax」の値が「5」に置き換わってしまっていて、結果の値が予想しないものになっていた……なんてことになったら困りますよね。
定数は置き換わることがないので、非常に安全に使うことが出来ます。絶対に変えたくない、変わらない値を格納する時は定数を使いましょう。
開発者以分からない謎の数字・言葉がプログラムに乱立してしまう
例えば、あなたが他人の作ったプログラムを読むことになった時、次のような変数や式があったらどうでしょうか?
double t = 0.08; int p = 1000; int result; result = p * t;
いったい何の「0.08」なのか、変更しても良い数値なのか? 値の意味が分かりませんよね。そして、どんな意味のある式なのかも分かりません。
せめてコメントがあれば……と思いますが、それでも変数の意味を思い出す時間がかかったりして効率的ではありませんよね。
このようにプログラム内に直接書かれた値で、意味や意図が開発者本人にしか分からないモノは「マジックナンバー」と呼ばれます。マジックナンバーはあまり良いものではないので、値には意図が伝わるよう意味を持たせましょう。
定数なら、意味を持たせることも簡単にできます。しかも、変更ができない値という意味も自動で付与することが出来るので一石二鳥なんです。
先程の例でtを「TAX」という定数、pを「price」という変数にすれば式がとってもわかりやすくなりますよね。
result = price * TAX;
税の計算をしているのかな? と推測することができます。そして、定数はよく大文字で宣言されることも多いので、見た目でも分かりやすいようエンジニアは工夫してプログラミングしています。
このように定数を正しく扱えるようになれば、プログラミングスキルがまた一つ向上するほどの大切な要素だという事がお分かりいただけたでしょうか?
次の章では、constを使い定数を宣言する方法を解説します。
constの使い方
この章ではconstの具体的な使い方を解説していきます。
constを使って定数を宣言する方法はとっても簡単です。先程の税の計算を、constを使い詳しく書いてみましょう。
namespace test { class Program { static void Main(string[] args) { const double TAX = 0.08; int price = 1000; double result; result = price * TAX; } } }
変数を宣言する時とほぼ同じように記載します。データ型の前に「const」を付けると定数として宣言出来るんです。これでTAXは変更できなくなりました。
試しにTAXに値を代入しようとしてみます。
ローカル「定数」と表示されていますね。このように代入するとエラーになるので、すぐ気付くことができます。
また、値を使用したい時は変数と同じように使うことが出来ます。
思ったより簡単に定数が宣言できましたが、いくつか注意して欲しい点もあります。次の章で、そちらを確認していきましょう。
constで定数を宣言する時の注意点
この章ではconstを使って定数を宣言する時の注意点を紹介していきます。慣れてきたらこの注意点を意識してプログラミングしてみてくださいね。
本当に今後変更されない値か確認しよう
privateな定数をconstで宣言しているうちなら、定数に変更があってもその部分を直すだけで問題ありません。問題はpublicな定数をconstで宣言してしまった時です。
実は、「constのバージョニング問題」と呼ばれる問題がありpublicな定数を宣言する時はreadonlyというキーワードを用いて宣言することが望ましいとされています。
いずれかの時点で変わることが予想される情報を表すために定数を作成してはなりません。
(中略)
これらの値は時間の経過とともに変更される場合があります。コンパイラは定数を伝達するため、ライブラリでコンパイルされた他のコードを再コンパイルして、変更点を反映することが必要になってしまいます。引用元:Microsoft Docs const (C# リファレンス)
publicな定数を宣言したライブラリを別プロジェクトのプログラムから参照しているという状況で、定数に変更があった場合には利用元、利用先どちらも再コンパイルが必要になってしまうという問題です。
まだプログラミングを始めたばかり、という方にとっては難しい内容かと思いますが、とにかく「今後本当に変更されないかどうか」には気を付けてconstで定数を宣言すれば問題ありません。
整数型の定数を宣言したい時には「enum」を使う
実は整数型の定数をまとめて宣言する用に列挙型(enum)と呼ばれるデータ型があります。男なら0、女なら1という定数にしたいなという時などに使えます。
この列挙型を使えば次のようなとき、別の値が入ってしまうという問題を防ぐことが出来ます。
namespace test { class Program { static void Main(string[] args) { const int MAN = 0; const int WOMAN = 1; int sex; sex = MAN; sex = 4; } } }
性別の変数sexには0か1しか入ってほしくないのに4が格納されてしまいました。
enumを使って書き直してみます。
namespace test { enum SexType { MAN, WOMAN }; class Program { static void Main(string[] args) { SexType sex; sex = SexType.MAN; sex = 4; } } }
性別の変数sexのデータ型が作った列挙型の名前になっているのが分かります。これにより、0と1以外の数値が入らないようになるんです。上のコードは以下のようなエラーが出るので、すぐ異変に気付くことが出来ます。
このように、決まった数値しか入ってほしくないという場合にはenumを使用するようにしましょう。
enumの使い方を詳しく知りたい方は、こちらの記事で徹底解説していますので合わせてご覧ください。
まとめ
C#でconstを使って定数を宣言する方法と定数の意味を解説しました。
定数はプログラミングする上で必ず関わるものなので、理解を深めて自分でも使って慣れていってくださいね。
それでは、次の解説で!