C#プログラミングにおける変数宣言
C#は静的型付け言語であり、変数を使用する際にはその変数がどのようなデータ(数値、文字列、真偽値など)を保持するかをコンパイラに伝える「型」を宣言する必要があります。従来は型名を明示的に記述する方法が一般的でしたが、C# 3.0でvarキーワードによる型推論が導入されて以降、コード記述の選択肢の一つとして広く利用されています。
この記事では、varキーワードの正しい使い方と、C#で扱われる主要な数値型について、その範囲やサイズを含めて詳しく解説します。
型推論キーワード「var」とは
varは、メソッド内でローカル変数を宣言する際に、コンパイラが代入される値から自動的に変数の型を決定する(型推論する)ために使用されるキーワードです。
var自体が「動的な型」になるわけではなく、あくまでコンパイラが型を推論するための一時的な目印です。一度型が推論されると、その変数の型はコンパイル時に固定され、以降は変更できません。これはC#の静的型付けの原則を維持しています。
var の使用ルール
varを使用するには、以下のルールを守る必要があります。
- ローカル変数でのみ使用可能: メソッドやループ、
usingステートメントの内部など、ローカルスコープでのみ使用できます。クラスのフィールド(メンバー変数)には使用できません。 - 宣言と同時に初期化が必須: コンパイラが型を推論できるよう、必ず宣言と同時に値を代入(初期化)する必要があります。
var settingValue = 100;(有効:int型と推論される)var settingValue;(無効:コンパイルエラー)
nullでの初期化は不可:null自体は型を持たないため、var data = null;のように初期化することはできません(ただし、var data = (string)null;のように型を明示すれば可能です)。
var を使用したコード例
varは、特に右辺の式(代入する値)から型が明確にわかる場合に使用すると、コードの冗長性を減らし、可読性を向上させることがあります。
型を明示する場合の例
従来の方法では、以下のように型名を明記します。
using System;
using System.Collections.Generic;
// 型を明示的に宣言
int gameScore = 12500;
string userName = "AdminUser";
bool isActive = true;
DateTime eventTime = new DateTime(2025, 11, 20, 10, 0, 0);
List<string> userRoles = new List<string> { "Admin", "Editor" };
var を使用する場合の例
varを用いると、以下のように記述できます。コンパイラは右辺の値を見て、適切な型を自動的に推論します。
using System;
using System.Collections.Generic;
// var を使用した型推論
var gameScore = 12500; // int と推論されます
var userName = "AdminUser"; // string と推論されます
var isActive = true; // bool と推論されます
var eventTime = new DateTime(2025, 11, 20, 10, 0, 0); // DateTime と推論されます
var userRoles = new List<string> { "Admin", "Editor" }; // List<string> と推論されます
// サフィックスによる型指定
var processID = 101L; // 'L'サフィックスにより long と推論されます
var itemPrice = 19.99M; // 'M'サフィックスにより decimal と推論されます
var defaultMargin = 0.05; // サフィックスなしの小数は double と推論されます
var rate = 0.5F; // 'F'サフィックスにより float と推論されます
// 数値区切り文字 (C# 7.0以降)
var largePopulation = 120_000_000; // int (読みやすさのため _ を使用)
varを使用しても、gameScore変数はint型として厳密に扱われ、string型の値を代入しようとするとコンパイルエラーが発生します。
C#の主要な数値型
C#には、扱う数値の範囲や精度に応じて、多種多様な数値型が用意されています。これらは大きく「整数型」と「浮動小数点数型」に分類されます。
整数型
整数(小数点の付かない数値)を扱う型です。sが付く型(sbyte)は符号付き(マイナスの値が扱える)、uが付く型(uint)は符号なし(0とプラスの値のみ)を意味します。
| 型名 | サイズ(ビット) | 説明 | 範囲(最小値 ~ 最大値) |
sbyte | 8 | 符号付き整数 | -128 ~ 127 |
byte | 8 | 符号なし整数 | 0 ~ 255 |
short | 16 | 符号付き整数 | -32,768 ~ 32,767 |
ushort | 16 | 符号なし整数 | 0 ~ 65,535 |
int | 32 | 符号付き整数 | -2,147,483,648 ~ 2,147,483,647 |
uint | 32 | 符号なし整数 | 0 ~ 4,294,967,295 |
long | 64 | 符号付き整数 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
ulong | 64 | 符号なし整数 | 0 ~ 18,446,744,073,709,551,615 |
一般的に、整数の計算にはintが標準的に用いられます。intの範囲を超える非常に大きな数値を扱う場合にlongが使用されます。
浮動小数点数型とdecimal
実数(小数点を含む数値)を扱う型です。floatとdoubleは高速な科学技術計算に適していますが、計算過程で微小な誤差(丸め誤差)が生じる可能性があります。decimalは金融計算など、絶対的な精度が求められる場面で使用されます。
| 型名 | サイズ(ビット) | 説明 | おおよその精度 | サフィックス |
float | 32 | 単精度浮動小数点数 | 6~9桁 | F または f |
double | 64 | 倍精度浮動小数点数 | 15~17桁 | D または d (通常不要) |
decimal | 128 | 高精度10進数 | 28~29桁 | M または m |
数値リテラルとサフィックス
コード内に数値を直接記述する方法(数値リテラル)において、サフィックス(接尾辞)はvarと共に使う際に特に重要です。サフィックスは、その数値がどの型であるかをコンパイラに明示的に伝えます。
var number = 100;- サフィックスがない整数は、自動的に
int型として扱われます。
- サフィックスがない整数は、自動的に
var number = 100.5;- サフィックスがない小数は、自動的に
double型として扱われます。
- サフィックスがない小数は、自動的に
var largeNumber = 100L;Lを付けるとlong型になります。intの範囲を超える数値を扱う場合や、long型であることを明示したい場合に使用します。
var unsignedNumber = 100U;Uを付けるとuint型になります。ULでulong型です。
var price = 100.5M;Mを付けるとdecimal型になります。金融計算などで必須です。
var ratio = 0.5F;Fを付けるとfloat型になります。
varを使用する場合、var price = 100.5; と記述するとdouble型と推論されてしまいます。金融計算などでdecimal型が必要な場合は、必ずvar price = 100.5M; のようにサフィックスを付ける必要があります。
まとめ
varキーワードは、C#において型が右辺から明らかな場合にコードを簡潔にし、可読性を高めるための有効な手段です。コンパイラによる型推論を正しく理解して利用することが重要です。
また、数値を扱う際は、そのデータが取りうる値の範囲(マイナスを含むか、どれほど大きな値か)や、小数点以下の精度がどれだけ必要か(誤差が許容されるか)を考慮し、int, long, double, decimalなどの適切な型を選択することが、正確で効率的なプログラムを作成する鍵となります。
