【初心者向け】C#で利用できる変数のデータ型一覧と特徴を解説!

C#(シーシャープ)は、Microsoftが開発した人気のプログラミング言語で、さまざまなデータ型をサポートしています。データ型を理解することで、効率的なコードを書けるようになります。

こちらの記事では、C#の変数で利用できるすべてのデータ型を、初心者にもわかりやすく解説しています。

 


sponsor link

C#のデータ型とは?

C#のデータ型は、プログラムが扱うデータの種類を定義するものです。C#では、大きく分けて以下の2種類のデータ型があります。

  1. 値型(Value Type)
  2. 参照型(Reference Type)

これらの違いを理解することが、C#を学ぶ第一歩です。


値型(Value Type)

値型は、データそのものを直接保持します。値型の変数を代入すると、新しいコピーが作られるため、元の値には影響を与えないことがポイントです。

以下で主な値型をご紹介します。 

1. 整数型

整数を扱うための型です。主に以下の種類があります。

型名サイズ(ビット)値の範囲説明
byte80 ~ 255符号なしの8ビット整数
sbyte8-128 ~ 127符号付きの8ビット整数
short16-32,768 ~ 32,767符号付きの16ビット整数
ushort160 ~ 65,535符号なしの16ビット整数
int32-2,147,483,648 ~ 2,147,483,647符号付きの32ビット整数
uint320 ~ 4,294,967,295符号なしの32ビット整数
long64-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807符号付きの64ビット整数
ulong640 ~ 18,446,744,073,709,551,615符号なしの64ビット整数

ポイント: 特殊な場合を除き整数値を扱う時は int型 を使うと覚えておけばよいでしょう。


2. 浮動小数点型

小数を扱うための型です。

型名サイズ(ビット)精度値の範囲
float32約7桁±1.5 × 10⁻⁴⁵ ~ ±3.4 × 10³⁸
double64約15~16桁±5.0 × 10⁻³²⁴ ~ ±1.7 × 10³⁰⁸
decimal128約28~29桁±1.0 × 10⁻²⁸ ~ ±7.9 × 10²⁸

ポイント: 金額計算や高精度を求める場合はdecimalを使用しましょう。


3. その他の値型

型名サイズ(ビット)説明
char16Unicode文字(1文字)を表す型
bool1trueまたは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(数値型の場合)やfalsebool型)など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#のデータ型を選ぶ際のポイント

  1. データの性質に合わせて型を選ぶ
    例えば、小数が必要ならfloatdouble、真偽値ならboolを選びます。
  2. 必要なメモリを考慮する
    メモリ使用量を最適化したい場合、小さい型(例: byteshort)を選びます。
  3. 型の互換性を意識する
    型変換が必要な場面では、互換性を意識して型を選びましょう。

 


まとめ

C#のデータ型は非常に豊富で、データの種類に応じて適切な型を選ぶことができます。本記事では、主な値型と参照型について紹介しました。データ型を正しく理解すれば、効率的でエラーの少ないプログラムを作成できるようになります。

コメント

タイトルとURLをコピーしました