1. 定数
定数っていうのは、宣言した後で値を変えられない(てか変える必要もない!)「魔法の」変数みたいなもんだよ。たとえば自分のマグカップに「お茶だけ」って超強力なシールを貼った感じ。そんなシール貼ったら、もうコーヒーに変えることはできない(少なくともC#の中ではね)。
const int DaysInWeek = 7;
const string HelloMessage = "ようこそ!";
この例だとDaysInWeekはずっと7だし、HelloMessageは変わらず挨拶メッセージだよ。一度定数の値を決めたら、もう変更できないんだ。
なんで定数が必要なの?
- コードの分かりやすさ: const double Pi = 3.14159;って書いてあったら、これは誰かが途中で変えちゃう変数じゃなくて定数だってすぐ分かるよね。
- 安全性: 誰も(数ヶ月後の自分ですら!)うっかり定数の値を書き換えたりできない。
- パフォーマンス: C#のコンパイラは定数の値を直接使う場所に埋め込むから、ちょっとだけプログラムが速くなる。
宣言の構文
const 型 名前 = 値;
- 型 — どんなプリミティブ型でもOK(int, double, string, char、それにenumやリテラルも)。
- 名前 — CamelCaseかPascalCaseスタイルが一般的。「マジック」な定数には全部大文字+アンダースコア(DAYS_IN_WEEK)を使うこともあるけど、C#では必須じゃないよ。
例:
const double GRAVITY = 9.81; // 自由落下の加速度, m/s^2
const char DELIMITER = ',';
const string DEVELOPER_NAME = "イワン・ペトロフ";
定数の特徴と制限
- 値はコンパイル時に分かってないとダメ。 つまり、プログラム実行中に計算される値は定数にできないよ。
const int NowYear = DateTime.Now.Year; // コンパイルエラー!
- 使えるのはシンプルな型、string、enumだけ。
- 配列、オブジェクト、メソッドの戻り値とかは定数にできない。
- 数学的に「簡単そう」に見えても、コンパイラが計算できないとダメ。
例えば、こういうのはダメ:
const string FullGreeting = "こんにちは、" + userName; // userNameは変数、ダメだよ!
こういうのはOKだし、むしろ推奨:
const string DefaultGreeting = "こんにちは、ユーザー!";
定数はどこに宣言する?
- クラス(またはファイル)の先頭、メソッドの上。
- 定数専用クラス(例:public static class Constants)にまとめる。
- そのクラスだけで使うならクラス内。
コンソールアプリの例:
class Program
{
const string Welcome = "私たちのアプリへようこそ!";
static void Main(string[] args)
{
Console.WriteLine(Welcome);
}
}
定数とスコープ
定数も普通の変数と同じスコープルールに従うよ:宣言した範囲でしか見えない。
2. キーワード var
varキーワードは新しい型じゃなくて、コンパイラに変数の型をコンテキストから自動で決めさせる便利な方法だよ。
これはただのシンタックスシュガーで、魔法じゃない。コンパイル後は普通の型になるだけ。
var age = 23; // コンパイラはageがintだと分かる
var name = "アンナ"; // コンパイラはstringだと分かる
var price = 99.99; // コンパイラはdoubleだと分かる
なんでvarができたの?
- 読みやすさ: Dictionary<string, List<int>>みたいな長い型を書かなくて済む。
- 柔軟性: 右側の型を変えたら、左側のvarは自動で合わせてくれる。
- モダンなスタイル: 最近のC#プロジェクトは、初期化で型が分かるときはだいたいvarを使ってる。
いつvarを使うべき?
- 右側を見れば変数の型が一目瞭然なとき。
- 型が明らかなとき(var price = 100;ならintだって分かる)。
- 型が長すぎたり複雑なとき(LINQの結果とか)。
var numbers = new int[] { 1, 2, 3, 4 };
var input = Console.ReadLine(); // inputはstring(メソッドがstring返すから)
varを使わない方がいいとき
右側だけじゃ型が分かりにくいときは、コードが分かりづらくなる。1ヶ月後に自分も同僚も「これ何型?」ってなるなら、ちゃんと型を書こう。
var mystery = DoSomethingVeryComplicated(); // お前は誰だ、mystery???
ここは型を明示した方がいい:
string result = DoSomethingVeryComplicated();
黄金ルール: varは読みやすさを損なわない範囲で使おう!
varはローカル変数専用
varはメソッドの中だけで使えるローカル変数専用。以下には使えないよ:
- メソッドのパラメータ
- クラスのプロパティ
- 定数
varの「中身」ってどうなってる?
- C#のコンパイラがコンパイル時に正しい型を入れてくれる。
- コンパイル後はvarなんて残ってない。
- パフォーマンスの損失はゼロ:これはプログラマーのための便利機能。
var year = 2025; // コンパイル時には: int year = 2025; になる
varでよくあるミス
- 初期化してない変数:
var a; // エラー: 型を推論できない!
- 曖昧な初期化:
var list = null; // エラー: nullの型は分からない!
- 違う型で変数を再利用しようとする:
var value = 5; // valueはint
value = "ゴ"; // エラー: valueはもうintだよ!
比較:明示的な型とvar
| シナリオ | 明示的な型 | var |
|---|---|---|
| 型が明確な場合 | |
|
| メソッドが複雑な型を返す場合 | |
|
| 配列 | |
|
最近のプロジェクトではローカル変数にはvarを使うのが主流。パラメータ、プロパティ、定数には明示的な型を使おう。
3. 罠とアドバイス
C#ではよく「マジックナンバー」をコードに直接書いちゃうことがある("7"、"3.14159"、"0.15"とか謎の数字たち)。これは良くない!もし値が変わったら、プロジェクト中の全部を探して直さなきゃいけない。定数を使おう!自分も楽だし、同僚にも感謝されるよ…
varの場合は逆に、全部varだらけで型が全然見えないと、コードがすぐ分かりにくくなる。だからvarは文脈的に分かりやすいときだけ使って、それ以外は型をちゃんと書こう!
GO TO FULL VERSION