C#

C# | ボクシング(Boxing):値型を参照型に変換する方法

2024年4月25日

本ページはプロモーションが含まれています

C#ボクシングアイキャッチ画像

ボクシングとは、値型のデータを参照型のオブジェクトとして扱うことを指します。

C# では、値型のデータ(int、double、char など)を参照型の object や interface 型に代入する際に、ボクシングが行われます。

using System;

class Program
{
    static void Main()
    {
        int num = 123; // 値型の変数
        object obj = num; // ボクシング: int を object に代入

        // obj をアンボクシングして int に戻す
        int unboxedNum = (int)obj;

        Console.WriteLine("ボクシングされた値: " + obj);
        Console.WriteLine("アンボクシングされた値: " + unboxedNum);
    }
}

ボクシングとは

ポイント

ボクシングとは、値型のデータを参照型のオブジェクトに変換することを指します。

値型のデータはスタック上に保存されるのに対し、参照型のオブジェクトはヒープ上に保存されます。

ボクシングにより、値型のデータをヒープ上に新たなオブジェクトとしてラップすることができます。

ボクシングには暗黙的なボクシングと明示的なボクシングがあります。

暗黙的なボクシング

暗黙的なボクシングとは、基本的にはコンパイラによって自動的に行われるボクシングのことです。

object 型などの参照型に代入される際に、C#コンパイラが自動的にボクシングを行います。

暗黙的なボクシングの例

int i = 123;
object obj = i; // 暗黙的なボクシング

コードの解説

  1. int i = 123;
    • 変数 i はスタックメモリに保存され、整数値 123 がその領域に直接格納されます。
  2. object obj = i;
    • 変数 obj もスタックメモリに保存されますが、i の値が obj に代入されるときに、ボクシングが発生します。ボクシングとは、値型の変数をオブジェクト型に変換する操作であり、その結果、値型のデータがヒープメモリにコピーされます。したがって、obj が参照するオブジェクトはヒープメモリに保存され、その中に 123 という値が格納されます。
C#ボクシングメモリ画像

明示的なボクシング

明示的なボクシングは、明示的に値型の変数を参照型に変換するプロセスです。

int intValue = 10; // 値型の変数を宣言し、値を代入する

object boxedValue = (object)intValue; // 明示的なボクシング: 値型の変数を object 型にキャストして代入する

Console.WriteLine("Boxed value: " + boxedValue); // 出力: 10 (値がボクシングされた object 型の変数の値が表示される)

ボクシングの注意点

  1. パフォーマンスの低下
    ボクシングはパフォーマンスの低下を引き起こす可能性があります。値型のデータがヒープ上にコピーされ、参照型として扱われるため、余分なメモリ使用量やメモリのアロケーション、ガベージコレクションのオーバーヘッドが発生します。
  2. ボクシングとアンボクシング
    ボクシングした値をアンボクシングする際に、データ型の検証や型キャストが発生する可能性があります。この過程で実行時エラーが発生する可能性があるため、注意が必要です。
  3. メモリの過剰消費
    ボクシングにより、不要なメモリの消費が増加する可能性があります。特に、ループ内で頻繁にボクシングが発生する場合、メモリの過剰消費が問題となる可能性があります。
  4. パフォーマンスの最適化
    ボクシングを回避することでパフォーマンスを向上させることができます。ジェネリックなコレクションやメソッドを使用したり、型チェックやパターンマッチングを活用することで、ボクシングを回避できる場合があります。

簡単に言うとメモリをたくさん使うことにもなるから使い過ぎに注意ということです。

まとめ

  • ボクシングは値型のデータを参照型に変換するプロセスである。
  • ボクシングは暗黙的にまたは明示的に行うことができる。
  • ボクシングによりパフォーマンスの低下が発生する可能性がある。
  • メモリの余分な使用が発生する

Follow me!

-C#
-,

PAGE TOP