【C#】変数とデータ型完全ガイド|int・string・bool・型変換・varキーワード・命名規則まで

【C#】変数とデータ型の基本|int・string・boolの使い分け C#

C#でプログラムを書くとき、最初に習得すべき基礎が 変数データ型 です。変数は「データを入れる箱」、データ型は「その箱に入れられるデータの種類」を意味します。

C#は静的型付け言語なので、変数を宣言するときにデータ型を決める必要があります(ただし var で省略も可能)。型を間違えると計算精度の誤差やバグにつながるため、各型の特性を正しく理解しておくことが重要です。本記事では全主要データ型の使い分けから型変換・命名規則まで解説します。

スポンサーリンク

変数の宣言と初期化

C#の変数宣言は「型名 変数名 = 初期値;」が基本形です。

変数の宣言パターン
// 宣言と同時に初期化
int age = 25;
string name = "Taro";
bool isActive = true;

// 宣言だけして後から代入
int score;
score = 100;

// 複数変数を同時に宣言(同じ型のみ)
int x = 10, y = 20, z = 30;
C#の変数は初期化が必要
ローカル変数(メソッド内の変数)は宣言しただけでは読み取れません。使用前に必ず値を代入してください。初期化せずに読み取ろうとするとコンパイルエラーになります。フィールド変数(クラスのメンバー)は型ごとのデフォルト値(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
金額計算に float・double を使うのは禁止
doublefloat は2進数で小数を近似するため、0.1 + 0.2 = 0.30000000000000004 のような誤差が生じます。金額・税率・為替レートなど誤差が許されない計算には必ず decimal を使ってください。

bool型(論理値)

booltrue(真)か false(偽)の2値しか持てない型です。条件判定・フラグ管理に欠かせません。

bool型の使用例
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型の基本
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 の基本操作
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
    }
    """;
null と空文字列の判定
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 は参照型だが特別扱い
string はクラス(参照型)ですが、C#では値型と同じように == で文字列の内容を比較できます。また stringイミュータブル(変更不可)で、連結のたびに新しいオブジェクトが生成されます。大量の文字列連結には StringBuilder を使いましょう。詳しい文字列操作は文字列操作の基本を参照してください。

var キーワード(型推論)

C#では var キーワードを使うと、コンパイラが右辺の値から型を自動的に推論します。ただし 型がなくなるわけではなく、コンパイル時に確定した型で動作します(JavaScript の var とは異なります)。

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 を使うべき場面・使わない場面
// ◎ 使うべき場面: 右辺から型が明らか
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 が明確
Microsoft の公式スタイルガイドでは、右辺から型が明らかな場合(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"
外部入力(フォーム・API・ファイル)から数値へ変換するときは、例外が発生しない TryParse を使うのが実務の基本です。Parse は入力値が確実に正しい数値であるとわかっている場合のみ使います。

const と readonly(変更不可の値)

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 }
C#はC言語スタイルの ALL_CAPS 定数名(MAX_VALUE など)は非推奨です。Java や C と異なり、PascalCase(MaxValue)が .NET の標準スタイルです。

よくある落とし穴と注意点

整数同士の除算は小数にならない

int / int の計算結果は整数になり、小数点以下は切り捨てられます。5 / 22.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.20.30000000000000004 になるなど、わずかな誤差が生じます。金額・税率など誤差が許されない計算には decimal を使います。接尾辞 m を付け忘れないよう注意してください(1980 は int、1980m が decimal)。

string は null になり得る参照型

string は参照型なので、初期化せずに使うと null になります。null のまま LengthToUpper() を呼ぶと NullReferenceException が発生します。string.IsNullOrEmpty()string.IsNullOrWhiteSpace() で事前確認するか、C# 8以降の null 許容参照型で警告を有効にしましょう。

var は型をなくすのではなく推論するだけ

var はコンパイル時に型が確定する静的型推論です。宣言後に別の型の値を代入しようとするとコンパイルエラーになります。JavaScript の varvar はローカル変数にしか使えず、フィールド・プロパティ・メソッドの戻り値型には使えません。

long リテラルの L を忘れる

整数リテラルのデフォルト型は int です。int の範囲を超える値(約21億以上)をそのまま書くとコンパイルエラーになります。long リテラルには末尾に L(大文字推奨)を付けてください。小文字 l は数字の 1 と混同しやすいので使わないようにしましょう。

よくある質問

Qint と long はどちらを使えばいいですか?
Aまず int を選んでください。int は −21億〜+21億をカバーするので、年齢・個数・ループカウンタなど大半の用途に十分です。ファイルサイズ(バイト単位)・UNIX タイムスタンプ・主キーが大量になる可能性があるケースでは long を選びます。
Qdouble と decimal はどう使い分けますか?
A金額・税率・為替など誤差が許されない計算は decimal、科学計算・統計など多少の誤差が許容される数値は double を使います。decimal は精度が高い代わりに処理速度が遅くなります。float は Unity のようなゲーム開発(精度より速度・省メモリが優先)でよく使われます。
Qvarを使うと型安全性は下がりますか?
Aいいえ。var は見た目上の型名を省略するだけで、コンパイル時に型が確定します。型安全性はまったく変わりません。ただし宣言時に初期化が必要で、初期化した型と異なる型の値は代入できません。
Q文字列比較は == で問題ありませんか?
AC#の string== で内容(文字列の中身)を比較します。大文字・小文字を区別しない比較には string.Equals(a, b, StringComparison.OrdinalIgnoreCase) を使います。参照(同一オブジェクトか)を比較したい場合は ReferenceEquals(a, b) を使いますが、通常は必要ありません。
QC#に動的型(型が変わる変数)はありますか?
Aあります。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 合体演算子の活用方法を参照してください。