C#でプログラムを書くとき、最初に習得すべき基礎が 変数 と データ型 です。変数は「データを入れる箱」、データ型は「その箱に入れられるデータの種類」を意味します。
C#は静的型付け言語なので、変数を宣言するときにデータ型を決める必要があります(ただし var で省略も可能)。型を間違えると計算精度の誤差やバグにつながるため、各型の特性を正しく理解しておくことが重要です。本記事では全主要データ型の使い分けから型変換・命名規則まで解説します。
変数の宣言と初期化
C#の変数宣言は「型名 変数名 = 初期値;」が基本形です。
// 宣言と同時に初期化 int age = 25; string name = "Taro"; bool isActive = true; // 宣言だけして後から代入 int score; score = 100; // 複数変数を同時に宣言(同じ型のみ) int x = 10, y = 20, z = 30;
ローカル変数(メソッド内の変数)は宣言しただけでは読み取れません。使用前に必ず値を代入してください。初期化せずに読み取ろうとするとコンパイルエラーになります。フィールド変数(クラスのメンバー)は型ごとのデフォルト値(int は 0、bool は false、参照型は null)に自動初期化されます。
主要なデータ型一覧
C#のデータ型は大きく「数値型」「論理型」「文字型」「文字列型」に分類されます。
| 型名 | 種類 | 範囲・精度 | 主な用途 |
|---|---|---|---|
int |
32ビット整数 | −2,147,483,648 〜 2,147,483,647 | 年齢・個数・インデックス |
long |
64ビット整数 | ±9.2 × 10¹⁸ | ファイルサイズ・タイムスタンプ |
short |
16ビット整数 | −32,768 〜 32,767 | メモリ節約が必要な配列要素 |
byte |
8ビット符号なし整数 | 0 〜 255 | バイナリデータ・画像ピクセル |
float |
32ビット浮動小数点 | 有効桁数 約7桁 | 精度が低くてよい数値(グラフィック等) |
double |
64ビット浮動小数点 | 有効桁数 約15桁 | 科学計算・一般的な小数 |
decimal |
128ビット十進小数 | 有効桁数 28〜29桁 | 金額・財務計算 |
bool |
論理値 | true / false のみ | 条件フラグ・スイッチ |
char |
単一Unicode文字 | U+0000 〜 U+FFFF | 文字コード処理・1文字の扱い |
string |
文字列 | 任意長のテキスト | テキスト・メッセージ・名前 |
object |
全型の基底型 | 任意の値(ボックス化を伴う) | 型が不明な場合(多用は非推奨) |
数値型の詳細と使い分け
整数型:int・long・short・byte
整数型は小さい順に byte → short → int → long です。迷ったら int を選べば大半の用途をカバーできます。大きな数値(ファイルサイズなど)は long、バイナリデータ処理には byte を使います。
int count = 1_000_000; // 桁区切りに _ が使える(C# 7以降) long fileSize = 5_000_000_000L; // long リテラルには L を付ける short port = 8080; byte pixelVal = 255; // 16進数・2進数リテラル int hex = 0xFF; // 16進数(255) int bin = 0b1010_1010; // 2進数(170)
浮動小数点型:double・float・decimal
小数を扱うときは3種類の型があります。精度と用途によって選びましょう。
| 型 | 特徴 | リテラル例 | 使いどころ |
|---|---|---|---|
double |
速度優先・精度は約15桁 | 2.5, 3.14159 | 科学計算・一般的な小数(デフォルト選択) |
float |
省メモリ・精度は約7桁 | 2.5f, 3.14f | グラフィック・ゲーム(Unity等) |
decimal |
精度最高・速度は遅め | 99.99m, 1000.00m | 金額・税計算(誤差が許されない場合) |
double d = 0.1 + 0.2; Console.WriteLine(d); // 0.30000000000000004(浮動小数点誤差) decimal m = 0.1m + 0.2m; Console.WriteLine(m); // 0.3(誤差なし) // 金額計算は必ず decimal decimal price = 1980m; decimal taxRate = 0.10m; decimal withTax = price * (1 + taxRate); Console.WriteLine(withTax); // 2178.0
double や float は2進数で小数を近似するため、0.1 + 0.2 = 0.30000000000000004 のような誤差が生じます。金額・税率・為替レートなど誤差が許されない計算には必ず decimal を使ってください。
bool型(論理値)
bool は true(真)か false(偽)の2値しか持てない型です。条件判定・フラグ管理に欠かせません。
bool isLoggedIn = true;
bool isExpired = false;
// 比較演算子の結果は bool
int age = 20;
bool isAdult = age >= 18; // true
bool isExact = age == 20; // true
// bool を if 文で使う
if (isLoggedIn && !isExpired)
{
Console.WriteLine("有効なセッションです");
}
// bool のフラグを反転
isLoggedIn = !isLoggedIn; // true → false
is〜 や has〜 で始めると、読んだだけで「真偽値の変数」とわかります。isActive, hasPermission, canEdit などが代表的な命名パターンです。char型(単一文字)
char は1文字だけを格納する型です。シングルクォート('')で囲むのがルールで、ダブルクォートの string とは区別します。
char letter = 'A'; char digit = '7'; char newline = '\n'; // エスケープシーケンス char cjk = 'あ'; // 日本語1文字もOK // char と int は相互変換できる(Unicode コードポイント) int codePoint = (int)'A'; // 65 char fromCode = (char)65; // 'A' // 文字列の特定位置の文字を取り出す string text = "Hello"; char first = text[0]; // 'H' char last = text[text.Length - 1]; // 'o'
string型(文字列)
string は文字の並びを表す参照型ですが、C# では値型のように直感的に扱えます。
string name = "Taro";
string message = "Hello, " + name + "!"; // 連結(+演算子)
// 文字列補間(C# 6以降・推奨)
string greeting = $"こんにちは、{name}さん!";
Console.WriteLine(greeting); // こんにちは、Taroさん!
// verbatim文字列(@プレフィックス: バックスラッシュをそのまま書ける)
string path1 = "C:\\data\\logs\\app.log"; // 通常: \ を 1つの \ として書く
string path2 = @"C:\data\logs\app.log"; // verbatim: \ をそのまま書ける
// 複数行文字列(C# 11以降: raw string literals)
string json = """
{
"name": "Taro",
"age": 25
}
""";
string s1 = null; string s2 = ""; string s3 = " "; // 空白のみ // null か空文字列かをまとめて判定 bool empty1 = string.IsNullOrEmpty(s1); // true bool empty2 = string.IsNullOrEmpty(s2); // true bool empty3 = string.IsNullOrEmpty(s3); // false(空白は空ではない) // null・空文字・空白をまとめて判定(推奨) bool blank1 = string.IsNullOrWhiteSpace(s1); // true bool blank3 = string.IsNullOrWhiteSpace(s3); // true
string はクラス(参照型)ですが、C#では値型と同じように == で文字列の内容を比較できます。また string はイミュータブル(変更不可)で、連結のたびに新しいオブジェクトが生成されます。大量の文字列連結には StringBuilder を使いましょう。詳しい文字列操作は文字列操作の基本を参照してください。
var キーワード(型推論)
C#では var キーワードを使うと、コンパイラが右辺の値から型を自動的に推論します。ただし 型がなくなるわけではなく、コンパイル時に確定した型で動作します(JavaScript の var とは異なります)。
var age = 25; // int と推論される
var name = "Taro"; // string と推論される
var price = 1980.0m; // decimal と推論される(m接尾辞があるため)
var isActive = true; // bool と推論される
// LINQの戻り値など、型名が長いときに特に有効
var numbers = new List<int> { 1, 2, 3, 4, 5 };
var result = numbers.Where(n => n > 2).Select(n => n * 2);
// ◎ 使うべき場面: 右辺から型が明らか var list = new List<string>(); var dict = new Dictionary<string, int>(); // ◎ 使うべき場面: 型名が冗長 var customer = new CustomerRepository().FindById(1); // △ 避けた方が良い場面: 型が読み取れない var result = Calculate(); // 戻り値の型が不明→ 明示した方が読みやすい var x = 5; // int なのか short なのか? → int x = 5 が明確
new 式・リテラル・メソッド名から型が推測できる場合)に var を推奨しています。チームのコーディング規約を優先しつつ、可読性を基準に判断しましょう。型変換(キャスト・Parse・Convert)
暗黙的な型変換(情報が失われない方向)
int intVal = 100; long longVal = intVal; // int → long(自動・精度が増える方向) double doubleVal = intVal; // int → double(自動) // NG: 逆方向は暗黙変換できない // int x = longVal; // コンパイルエラー
明示的な型変換(キャスト)
double d = 3.99;
int i = (int)d; // 小数点以下を切り捨て → 3(四捨五入ではない)
long big = 3_000_000_000L;
int small = (int)big; // オーバーフロー: 値が壊れる可能性あり
// checked で算術オーバーフローを検出する
try
{
int safe = checked((int)big);
}
catch (OverflowException)
{
Console.WriteLine("オーバーフローが発生しました");
}
文字列と数値の変換(Parse / TryParse / Convert)
// string → int(失敗すると例外)
int num1 = int.Parse("42");
// string → int(安全な変換: 失敗しても例外を投げない)
if (int.TryParse("abc", out int num2))
Console.WriteLine(num2);
else
Console.WriteLine("変換できませんでした"); // こちらが実行される
// Convert クラス(null を 0 に変換するなど null 耐性がある)
int num3 = Convert.ToInt32("100"); // 100
int num4 = Convert.ToInt32(null); // 0(int.Parse(null) は例外)
// int → string
string str1 = 42.ToString(); // "42"
string str2 = 42.ToString("D6"); // "000042"(書式指定)
string str3 = 3.14.ToString("F2"); // "3.14"
TryParse を使うのが実務の基本です。Parse は入力値が確実に正しい数値であるとわかっている場合のみ使います。const と readonly(変更不可の値)
// const: コンパイル時に確定する定数(クラスフィールドまたはローカル)
const double Pi = 3.14159265358979;
const int MaxRetry = 3;
const string AppName = "MyApp";
// readonly: 実行時に初期化できる読み取り専用(フィールドのみ)
class Config
{
// コンストラクタで初期化できる
public readonly string ConnectionString;
public Config(string connStr)
{
ConnectionString = connStr; // コンストラクタ内だけ代入可
}
}
| キーワード | 初期化タイミング | 使える場所 | 主な用途 |
|---|---|---|---|
const |
コンパイル時に確定 | ローカル変数・クラスフィールド | 数学定数・マジックナンバーの排除 |
readonly |
実行時(コンストラクタ)に確定 | クラスフィールドのみ | 設定値・依存オブジェクト |
変数の命名規則
C#では .NET の標準命名規則に従うことが推奨されています。
| 対象 | 規則 | OK例 | NG例 |
|---|---|---|---|
| ローカル変数 | camelCase | int itemCount |
int ItemCount |
| メソッドの引数 | camelCase | string userName |
string UserName |
| プロパティ | PascalCase | int TotalPrice |
int totalPrice |
| クラスのフィールド(private) | camelCase or _camelCase | private int _count |
private int Count |
| 定数(const) | PascalCase | const int MaxRetry = 3 |
const int MAX_RETRY = 3 |
| 列挙型のメンバー | PascalCase | enum Status { Active, Inactive } |
enum Status { ACTIVE, INACTIVE } |
MaxValue)が .NET の標準スタイルです。よくある落とし穴と注意点
整数同士の除算は小数にならない
int / int の計算結果は整数になり、小数点以下は切り捨てられます。5 / 2 は 2.5 ではなく 2 です。小数結果が必要なときは、どちらか一方を double にキャストするか、リテラルに 2.0 を使います。
int a = 5, b = 2; int wrong = a / b; // 2 (小数点以下が切り捨てられる) double correct = (double)a / b; // 2.5 double also = a / 2.0; // 2.5(片方が double ならOK)
float・double で金額を計算しない
浮動小数点型は2進数で小数を近似するため、0.1 + 0.2 が 0.30000000000000004 になるなど、わずかな誤差が生じます。金額・税率など誤差が許されない計算には decimal を使います。接尾辞 m を付け忘れないよう注意してください(1980 は int、1980m が decimal)。
string は null になり得る参照型
string は参照型なので、初期化せずに使うと null になります。null のまま Length や ToUpper() を呼ぶと NullReferenceException が発生します。string.IsNullOrEmpty() や string.IsNullOrWhiteSpace() で事前確認するか、C# 8以降の null 許容参照型で警告を有効にしましょう。
var は型をなくすのではなく推論するだけ
var はコンパイル時に型が確定する静的型推論です。宣言後に別の型の値を代入しようとするとコンパイルエラーになります。JavaScript の varvar はローカル変数にしか使えず、フィールド・プロパティ・メソッドの戻り値型には使えません。
long リテラルの L を忘れる
整数リテラルのデフォルト型は int です。int の範囲を超える値(約21億以上)をそのまま書くとコンパイルエラーになります。long リテラルには末尾に L(大文字推奨)を付けてください。小文字 l は数字の 1 と混同しやすいので使わないようにしましょう。
よくある質問
int を選んでください。int は −21億〜+21億をカバーするので、年齢・個数・ループカウンタなど大半の用途に十分です。ファイルサイズ(バイト単位)・UNIX タイムスタンプ・主キーが大量になる可能性があるケースでは long を選びます。decimal、科学計算・統計など多少の誤差が許容される数値は double を使います。decimal は精度が高い代わりに処理速度が遅くなります。float は Unity のようなゲーム開発(精度より速度・省メモリが優先)でよく使われます。var は見た目上の型名を省略するだけで、コンパイル時に型が確定します。型安全性はまったく変わりません。ただし宣言時に初期化が必要で、初期化した型と異なる型の値は代入できません。string は == で内容(文字列の中身)を比較します。大文字・小文字を区別しない比較には string.Equals(a, b, StringComparison.OrdinalIgnoreCase) を使います。参照(同一オブジェクトか)を比較したい場合は ReferenceEquals(a, b) を使いますが、通常は必要ありません。dynamic 型を使うと、実行時に型が決まる変数を宣言できます。ただし IDE の補完が効かず、実行時エラーのリスクが上がるため、COM相互運用・リフレクション・外部ライブラリとの連携など限定的な用途にのみ使います。通常の開発では使わないのが原則です。まとめ
C#の主要データ型と変数の扱い方をまとめます。
| 分類 | 代表型・構文 | ポイント |
|---|---|---|
| 整数 | int(汎用)/ long(大数)/ byte(バイナリ) |
int は −21億〜+21億、long リテラルは L 接尾辞必須 |
| 小数 | decimal(金額)/ double(科学計算)/ float(ゲーム) |
金額に double/float を使わない |
| 論理値 | bool(true/false のみ) |
変数名は is〜/has〜/can〜 で始める |
| 文字 | char(シングルクォート)/ string(ダブルクォート) |
string は null チェックが必要 |
| 型推論 | var(右辺から型を推論) |
型安全は変わらない。右辺から型が明らかな場面で使う |
| 型変換 | 暗黙変換(精度↑方向)/ キャスト(精度↓方向)/ TryParse(文字列→数値) | 外部入力の変換には TryParse を使う |
| 定数 | const(コンパイル時)/ readonly(実行時) |
マジックナンバーを const に置き換えて可読性向上 |
値型と参照型の違い(スタックとヒープの動作・コピー挙動)については値型と参照型の違いをわかりやすく解説を、null を許容する変数の扱いについてはNullable型と null 合体演算子の活用方法を参照してください。

