C#は、Microsoftが開発したモダンでパワフルなオブジェクト指向プログラミング言語です。
その学習において、最初にして最も重要なステップの一つが「変数」の理解です。
変数は、プログラム内でデータを一時的に保存し、後で再利用するための「名前付きの箱」のような役割を果たします。
アプリケーションを開発する際、ユーザーの入力値、計算結果、あるいはシステムの状態など、膨大なデータを扱う必要があります。
これらのデータを整理し、効率的に処理するためには、変数を正しく使いこなすことが不可欠です。
本記事では、C#における変数の基礎知識から、宣言・初期化の方法、データ型の種類、そして現場で役立つ命名ルールまで、初心者の方にも分かりやすく徹底的に解説します。
変数とは何か:データを格納する「箱」の概念
プログラミングにおける変数とは、コンピュータのメモリ上に確保された、データを保存するための領域のことです。
この領域に名前を付けることで、私たちは複雑なメモリ番地を意識することなく、直感的にデータを操作できるようになります。
例えば、ユーザーの年齢を保存したい場合、「age」という名前の変数(箱)を用意し、そこに「25」という数値を入れます。
後でその数値が必要になったときは、単に「age」という名前を呼ぶだけで、中身を取り出すことができます。
また、変数はその名の通り「変わる数」を意味します。
一度入れたデータは、プログラムの実行中に何度でも書き換えることが可能です。
この「値を保持し、必要に応じて変更できる」という特性が、複雑なロジックを実現する鍵となります。
変数の宣言と初期化
C#で変数を使用するためには、まず「宣言」という作業を行う必要があります。
宣言とは、コンパイラに対して「これからこのような種類のデータを入れる、この名前の箱を使います」と伝える行為です。
基本的な宣言の書き方
C#は「静的型付け言語」であるため、変数を宣言する際には、その変数がどのような種類のデータを扱うのかを示す「型(Type)」を必ず指定しなければなりません。
// 基本的な宣言の書式
// 型名 変数名;
int score; // 整数を扱う変数「score」を宣言
string userName; // 文字列を扱う変数「userName」を宣言
初期化と代入
宣言しただけの変数には、まだ具体的な値が入っていません(厳密にはデフォルト値が入りますが、ローカル変数の場合は初期化せずに使用するとコンパイルエラーになります)。
変数に最初の値をいれることを「初期化」と呼びます。
// 宣言した後に代入(初期化)する例
int age;
age = 20; // 代入演算子「=」を使用
// 宣言と同時に初期化する例(推奨される書き方)
int height = 170;
このように、= 記号は数学的な「等しい」という意味ではなく、「右辺の値を左辺の変数に代入する」という意味になります。
複数の変数をまとめて宣言する
同じ型の変数であれば、カンマで区切って一行で宣言することも可能です。
ただし、可読性を高めるためには、一行ずつ宣言することが一般的です。
int x = 10, y = 20, z = 30;
C#の主要なデータ型
C#には多くのデータ型が用意されています。
これらは大きく分けて、値を直接保持する「値型」と、データの所在(参照先)を保持する「参照型」の2種類に分類されます。
ここでは、日常的な開発で頻繁に使用される基本的な型を紹介します。
数値を扱う型(整数・浮動小数点数)
数値型は、扱うデータの大きさや精度によって使い分けます。
| 型名 | 分類 | 内容 | サイズ |
|---|---|---|---|
int | 整数 | 最も一般的に使われる整数型 | 32ビット |
long | 整数 | 非常に大きな整数(IDなど) | 64ビット |
float | 小数 | 単精度浮動小数点数 | 32ビット |
double | 小数 | 標準的な浮動小数点数 | 64ビット |
decimal | 小数 | 高精度な十進数値(金融計算用) | 128ビット |
特に、金融系のアプリケーションなどで誤差が許されない計算を行う場合は、double ではなく decimal を使用するのが鉄則です。
文字と文字列を扱う型
テキストデータを扱うための型です。
| 型名 | 内容 | 例 |
|---|---|---|
char | 1文字だけを扱う(シングルクォートで囲む) | 'A' |
string | 複数の文字(文字列)を扱う(ダブルクォートで囲む) | "Hello" |
真偽値を扱う型
条件分岐などで多用される、true(真)か false(偽)のいずれかのみを持つ型です。
| 型名 | 内容 | 値 |
|---|---|---|
bool | 論理値 | true または false |
データ型を活用したサンプルコード
以下に、各種データ型を使用した具体的なプログラムを示します。
using System;
class Program
{
static void Main()
{
// 整数の宣言
int appleCount = 5;
// 小数の宣言(floatには f, decimalには m のサフィックスが必要)
double price = 150.5;
decimal taxRate = 0.1m;
// 文字列の宣言
string message = "合計金額は";
// 論理値の宣言
bool isSoldOut = false;
// 計算と出力
double total = appleCount * price * (1 + (double)taxRate);
Console.WriteLine(message + total + "円です。");
Console.WriteLine("売り切れフラグ: " + isSoldOut);
}
}
合計金額は827.75円です。
売り切れフラグ: False
型推論:varキーワードの活用
C# 3.0から導入された var キーワードを使用すると、コンパイラが右辺の値から型を自動的に推論してくれます。
これを「型推論」と呼びます。
var text = "C#を学ぼう"; // string型と推論される
var number = 100; // int型と推論される
var list = new System.Collections.Generic.List<string>(); // 複雑な型名も簡略化できる
varを使用する際の注意点
var は便利ですが、何でもかんでも使えば良いというわけではありません。
以下のルールを意識しましょう。
- 初期化が必須: 右辺に値がないと型が決定できないため、
var x;のような宣言はできません。 - 可読性を損なわない:
var result = GetValue();のように、メソッドの戻り値の型が推測しにくい場合は、明示的に型を書いた方が良い場合もあります。 - 型は固定される: 一度推論された型は、その変数の一生を通じて変わりません。動的型付け言語(PythonやJavaScriptなど)とは異なる点です。
定数:値を変更できない変数
一度決めた値を二度と変更したくない場合には、「定数」を使用します。
定数として定義することで、誤って値を書き換えてしまうバグを防ぎ、コードの意味を明確にすることができます。
constキーワード
const はコンパイル時に値が決定される定数です。
const double Pi = 3.14159;
// Pi = 3.14; // エラー:定数には代入できない
readonlyキーワード
readonly は、実行時に一度だけ値を設定できる定数のようなフィールドです。
主にクラスのコンストラクタで初期値を設定する際に使用されます。
| 修飾子 | 決定タイミング | 特徴 |
|---|---|---|
const | コンパイル時 | 宣言時に値を代入する必要がある。静的な定数。 |
readonly | 実行時 | 宣言時またはコンストラクタで値を代入できる。 |
変数のスコープ(有効範囲)
変数には、それを使用できる有効範囲である「スコープ」が存在します。
スコープを正しく理解しないと、「定義したはずの変数が見つからない」といったエラーに悩まされることになります。
ローカル変数
メソッドの中で宣言された変数は、そのメソッド(あるいはその中のブロック {})の中だけで有効です。
これをローカル変数と呼びます。
void MyMethod()
{
int localValue = 10; // このメソッド内でのみ有効
Console.WriteLine(localValue);
}
// ここで localValue を使おうとするとエラーになる
フィールド(メンバ変数)
クラスの直下で宣言された変数は「フィールド」と呼ばれ、クラス内の複数のメソッドからアクセスすることが可能です。
class Calculator
{
int result = 0; // フィールド
void Add(int value)
{
result += value; // どのメソッドからもアクセス可能
}
}
変数の命名ルールとベストプラクティス
プログラミングは「書く時間よりも読む時間の方が長い」と言われます。
そのため、変数名は自分や他人が見て一目で意味がわかるように付ける必要があります。
C#には一般的に推奨される命名規約があります。
基本的なルール
- 英単語を使用する: ローマ字(
suujiなど)ではなく、英単語(number)を使いましょう。 - 数字から始めない:
1stValueはNG。firstValueはOK。 - 予約語を避ける:
intやclassなど、C#自体が使うキーワードは変数名にできません。 - 大文字・小文字を区別する:
myValueとMyValueは別の変数として扱われます。
推奨されるケース(書式)
C#の開発現場では、以下の使い分けが標準的です。
- キャメルケース (camelCase)
定義: 最初の単語を小文字、2番目以降の単語の頭文字を大文字にする形式。
用途: ローカル変数、メソッドの引数。
例:
userName,itemCount,isProcessingComplete- パスカルケース (PascalCase)
定義: すべての単語の頭文字を大文字にする形式。
用途: クラス名、メソッド名、プロパティ名、定数。
例:
UserAccount,CalculateTotal,MaxRetryCount- アンダースコア+キャメルケース (_camelCase)
定義: 先頭にアンダースコアを付けたキャメルケース(先頭がアンダースコアで、その後がcamelCase)。
用途: プライベートなフィールドを示す命名。
例:
_userService,_dataList
良い変数名の付け方
良い変数名とは、その変数の「中身」と「目的」を正確に表す名前です。
- 具体性を持たせる:
dではなくdaysUntilExpiration(有効期限までの日数)。 - 真偽値は質問形式にする:
doneではなくisDoneまたはhasFinished。 - 不適切な省略を避ける:
usrImgPathよりもuserImagePathの方が親切です。
実践的な変数の使い方:計算と型変換
最後に、変数を組み合わせて計算を行ったり、型を変換したりする実践的な例を見てみましょう。
暗黙的な型変換と明示的な型変換(キャスト)
小さい型から大きい型へは自動で変換されますが、大きい型から小さい型(データが欠落する可能性がある場合)には、明示的な「キャスト」が必要です。
int intVal = 100;
double doubleVal = intVal; // 暗黙的な変換(intからdoubleは安全)
double pi = 3.14;
int roundedPi = (int)pi; // 明示的なキャスト(小数が切り捨てられる)
複合的なサンプル
using System;
class VariablePractice
{
static void Main()
{
// ユーザー情報の定義
string firstName = "Taro";
string lastName = "Yamada";
int birthYear = 1995;
// 現在の西暦(DateTime型を使用)
int currentYear = DateTime.Now.Year;
// 年齢の計算
int age = currentYear - birthYear;
// 文字列の連結($を使用した文字列補完)
string fullName = $"{lastName} {firstName}";
string intro = $"名前:{fullName}、年齢:{age}歳";
// 出力
Console.WriteLine("--- プロフィール ---");
Console.WriteLine(intro);
// 真偽値の活用
bool isAdult = age >= 18;
Console.WriteLine($"成人済み: {isAdult}");
}
}
--- プロフィール ---
名前:Yamada Taro、年齢:31歳
成人済み: True
(※年齢は実行時の西暦によって変動します)
まとめ
本記事では、C#における変数の基礎から応用までを網羅的に解説しました。
変数は単に値を保持するだけでなく、プログラムの意図を明確にし、柔軟な処理を実現するための非常に強力なツールです。
適切なデータ型を選び、命名ルールに従って分かりやすい名前を付けることは、保守性の高い(修正しやすい)きれいなコードを書くための第一歩となります。
今回学んだ以下のポイントを振り返っておきましょう。
- 宣言と初期化: 型と名前を決めて、最初の値を代入する。
- データ型の選択: 整数なら
int、文字列ならstring、真偽ならboolなど、用途に合わせる。 - varの活用: 右辺から型が明らかな場合は積極的に使い、コードをスッキリさせる。
- 定数の利用: 変更したくない値には
constを使い、意図しない書き換えを防ぐ。 - 命名規約の遵守: キャメルケースやパスカルケースを使い分け、誰が見ても理解できる名前を付ける。
これらの基礎をしっかりと固めることで、この先に続く「配列」「クラス」「制御構文」といった、より高度なC#の機能もスムーズに習得できるようになります。
まずは自分で色々な型の変数を宣言し、計算や出力を行ってみることから始めてみてください。
