C#(シーシャープ)は、Microsoftが開発した人気のプログラミング言語で、さまざまなデータ型をサポートしています。データ型を理解することで、効率的なコードを書けるようになります。
こちらの記事では、C#の変数で利用できるすべてのデータ型を、初心者にもわかりやすく解説しています。
C#のデータ型とは?
C#のデータ型は、プログラムが扱うデータの種類を定義するものです。C#では、大きく分けて以下の2種類のデータ型があります。
- 値型(Value Type)
- 参照型(Reference Type)
これらの違いを理解することが、C#を学ぶ第一歩です。
値型(Value Type)
値型は、データそのものを直接保持します。値型の変数を代入すると、新しいコピーが作られるため、元の値には影響を与えないことがポイントです。
以下で主な値型をご紹介します。
1. 整数型
整数を扱うための型です。主に以下の種類があります。
型名 | サイズ(ビット) | 値の範囲 | 説明 |
---|---|---|---|
byte | 8 | 0 ~ 255 | 符号なしの8ビット整数 |
sbyte | 8 | -128 ~ 127 | 符号付きの8ビット整数 |
short | 16 | -32,768 ~ 32,767 | 符号付きの16ビット整数 |
ushort | 16 | 0 ~ 65,535 | 符号なしの16ビット整数 |
int | 32 | -2,147,483,648 ~ 2,147,483,647 | 符号付きの32ビット整数 |
uint | 32 | 0 ~ 4,294,967,295 | 符号なしの32ビット整数 |
long | 64 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 符号付きの64ビット整数 |
ulong | 64 | 0 ~ 18,446,744,073,709,551,615 | 符号なしの64ビット整数 |
ポイント: 特殊な場合を除き整数値を扱う時は int型 を使うと覚えておけばよいでしょう。
2. 浮動小数点型
小数を扱うための型です。
型名 | サイズ(ビット) | 精度 | 値の範囲 |
---|---|---|---|
float | 32 | 約7桁 | ±1.5 × 10⁻⁴⁵ ~ ±3.4 × 10³⁸ |
double | 64 | 約15~16桁 | ±5.0 × 10⁻³²⁴ ~ ±1.7 × 10³⁰⁸ |
decimal | 128 | 約28~29桁 | ±1.0 × 10⁻²⁸ ~ ±7.9 × 10²⁸ |
ポイント: 金額計算や高精度を求める場合は
decimal
を使用しましょう。
3. その他の値型
型名 | サイズ(ビット) | 説明 |
---|---|---|
char | 16 | Unicode文字(1文字)を表す型 |
bool | 1 | true またはfalse を表す型 |
参照型(Reference Type)
参照型は、データそのものではなく、データが格納されている場所(アドレス)を保持します。以下は主な参照型です。
1. 文字列型
型名 | 説明 |
---|---|
string | 複数の文字を扱う型(例: “Hello, World!”) |
2. 配列型
型名 | 説明 |
---|---|
配列(T[] ) | 同じ型の複数のデータをまとめて扱う型(例: int[] nums = {1, 2, 3}; ) |
3. クラスとオブジェクト
型名 | 説明 |
---|---|
クラス型 | 独自のデータ構造を作成するための型 |
object | すべての型の親クラスとして機能する型 |
4. その他の参照型
型名 | 説明 |
---|---|
dynamic | 実行時に型が決まる柔軟な型 |
var | コンパイラが自動的に型を推論する型 |
null | 値がないことを示す型 |
値型(Value Type)と参照型(Reference Type)の違い
特徴 | 値型(Value Type) | 参照型(Reference Type) |
---|---|---|
メモリの扱い | スタック(Stack)に格納される | ヒープ(Heap)にデータが格納され、参照先のアドレスがスタックに保持される |
データの格納方法 | データそのものを直接保持する | データが格納された場所(アドレス)を保持する |
コピー時の挙動 | 新しいコピーが作成され、元の値に影響しない | 参照先が共有されるため、元のデータに影響する |
デフォルト値 | 0(数値型の場合)やfalse (bool 型)など | null (参照が存在しないことを示す) |
使われる場面 | 基本的な数値や真偽値、構造体など | オブジェクト、文字列、配列、クラスなど |
例:値型と参照型の挙動の違い
// 値型の例
int a = 10;
int b = a; // 値をコピー
b = 20;
Console.WriteLine(a); // 出力: 10(aの値は変わらない)
// 参照型の例
int[] arr1 = {1, 2, 3};
int[] arr2 = arr1; // 参照をコピー
arr2[0] = 99;
Console.WriteLine(arr1[0]); // 出力: 99(arr1も変更される)
C#のstring
型は参照型ですが、特別な挙動を持つデータ型です。
具体的には、**イミュータブル(不変)**な性質を持つため、他の参照型とは一部動作が異なります。
string型の特徴
1. イミュータブル(Immutable:変更不可能)
string
型のインスタンス(文字列の値)は、作成後に変更することができません。
文字列を操作(例: 結合や置換)すると、新しい文字列インスタンスが作成され、元の文字列には影響を与えません。
例:
string str1 = "Hello";
string str2 = str1; // str2も"Hello"を参照
str2 += ", World!"; // str2に新しい文字列が代入される
Console.WriteLine(str1); // 出力: Hello(str1は変更されない)
Console.WriteLine(str2); // 出力: Hello, World!
上記の例では、str2
を変更すると新しい文字列インスタンスが作成されるため、str1
は影響を受けません。
2. 値の共有
string
型は参照型なので、同じ文字列を複数の変数が参照できます。ただし、文字列操作によって新しいインスタンスが作られるため、元のインスタンスへの影響はありません。
例:
string a = "C#";
string b = a; // 同じインスタンスを参照
b = "Java"; // 新しいインスタンスを作成
Console.WriteLine(a); // 出力: C#(aは影響を受けない)
Console.WriteLine(b); // 出力: Java
3. 参照型であるが値型に近い挙動
string
型のイミュータブル性のため、他の参照型と比較すると「値型のような安全な動作」に見えます。例えば、以下のような挙動が見られます:
例:
string x = "Code";
string y = "Code";
Console.WriteLine(object.ReferenceEquals(x, y)); // 出力: True
これはC#の「文字列インターン」と呼ばれる仕組みによるものです。文字列リテラルが同じ場合、C#は同じメモリ位置を共有するよう最適化しています。
4. 明示的な変更が必要な場合
もしも文字列を頻繁に変更(結合や置換)したい場合、StringBuilder
を使うのが効率的です。StringBuilder
はイミュータブルではなく、柔軟に文字列を変更できます。
例:
using System.Text;
StringBuilder sb = new StringBuilder("Hello");
sb.Append(", World!");
Console.WriteLine(sb.ToString()); // 出力: Hello, World!
C#のデータ型を選ぶ際のポイント
- データの性質に合わせて型を選ぶ
例えば、小数が必要ならfloat
やdouble
、真偽値ならbool
を選びます。 - 必要なメモリを考慮する
メモリ使用量を最適化したい場合、小さい型(例:byte
やshort
)を選びます。 - 型の互換性を意識する
型変換が必要な場面では、互換性を意識して型を選びましょう。
まとめ
C#のデータ型は非常に豊富で、データの種類に応じて適切な型を選ぶことができます。本記事では、主な値型と参照型について紹介しました。データ型を正しく理解すれば、効率的でエラーの少ないプログラムを作成できるようになります。
コメント