ホームページ バックエンド開発 C#.Net チュートリアル C# のボックス化とボックス化解除を簡単に学習

C# のボックス化とボックス化解除を簡単に学習

Jan 24, 2017 pm 02:30 PM

まず、梱包と開梱とは何ですか?
使用します。
元の型 (Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal)、列挙 (enum)、構造体 (struct) を含む値の型。
参照型には、クラス、配列、インターフェイス、デリゲート、文字列などが含まれます。スタック上に配置する; 参照型 obj を配置する場合、obj オブジェクトをヒープに配置し、それに temp 値を割り当てる必要があります。この一連のプロセスがボックス化プロセスです。


アンボックス化: 参照型から任意の値型への明示的な変換。ボックス化とは異なり、ボックス化を解除すると変形が表示されます。

int temp = 3;

暗黙的な変換は常に成功し、例外はスローされません:
(1)、派生クラスから基本クラスへ;
(3)、クラスからインターフェースへインターフェース);
(4)、Null から任意のクラスへ;
明示的な参照変換、以下は例外をスローする可能性があり、変換は成功しない可能性があります:

、(1)、基本クラスから派生クラスへ;

、(2)、インターフェイスからインターフェイスへ (基本インターフェイスから派生インターフェイスへ、または 2 つのインターフェイスに関係がありません)
、 (3)、インターフェイスからクラスへ (クラスがインターフェイスを実装しているか、クラスが閉じられていません)
、 (4)、クラスからインターフェイス (クラスはインターフェイスを実装しておらず、クラスは閉じられていません);


ボックス化とボックス化の定義は上で簡単に説明しました
開梱の定義ヒープとスタックでボックス化とボックス化を使用する方法について簡単に説明します。宣言自体は、定義されたスコープを超える限り、初期化プロセスです。メモリは自動的に解放されます。Java と同様に、参照型はヒープにメモリを割り当て、そのマネージド ヒープはガベージ コレクションを実行します。ボックス化/アンボックス化は、2 つのデータ型が変換されるときに発生します。
ボックス化とアンボックス化の長所と短所を比較します
ボックス化とアンボックス化は 2 つのタイプ間の変換を満たしますが。ただし、ボックス化プロセスから、サイズが特に大きい場合、新しいオブジェクトをヒープに追加する必要があることは、プログラムの効率に確実に大きく影響することがわかります。物事には常に裏表が​​あり、どんな剣にも裏表があり、物事はシンプルになり、パフォーマンスは低下します。したがって、アプリケーションではボックス化操作を避けるように努める必要があります。 ️ボックス化とボックス化解除の操作を理解すると、ボックス化操作によりデータがヒープとスタックにコピーされ、ボックス化操作が頻繁に行われるとパフォーマンスが低下することが明確に理解できます。それに比べて、開梱プロセスによって生じるパフォーマンスの損失は比較的小さいです。
梱包と開梱の詳細な手順

1. 箱詰めの詳細な手順:

(1) ヒープ上にメモリ領域を割り当てます。そのサイズは、ボックス化する必要がある値型オブジェクトのサイズに、両方の参照型オブジェクト (型オブジェクト ポインターと同期ブロック参照) が所有するメンバーを加えたサイズに等しくなります。
(2) スタック上の値型オブジェクトを、ヒープ上に新たに割り当てたオブジェクトにコピーします。
(3) ヒープ上の新しいオブジェクトへの参照を返し、スタック上のボックス化された値型オブジェクトに格納します。
このステップでは、プログラマーが自分で記述する必要はありません。ボックス化が発生する場合は、コンパイラーが上記の機能を実行するための IL コードを自動的に追加します。
いわゆるアンボックス化はボックス化に対応する概念ですが、アンボックス化とボックス化のプロセスは逆ではありません:
2. アンボックス化の詳細な手順(unbox.any)
アンボックス化するオブジェクトが null の場合、Throws NullReferenceException。
参照によって予期されるオブジェクトではないボックス化されたオブジェクトを指すと、InvalidCastException がスローされます。
- ボックス化されたオブジェクトの各フィールドのアドレスを取得するこのプロセスは「ボックス化解除」です
通常、ボックス化解除にはオブジェクトのコピーが伴いますが、コピー操作はボックス化解除の範囲ではないことに注意してください。

以下は、ボックス化とボックス化解除とは何か、および頻繁なボックス化によるメモリの消費を避ける方法を示す 2 つの小さな例です
(1)、ボックス化:

using System;
   public class Test
   {
         public static void Main(String[] args)
        {
            int i = 10;
            //将值类型的i装箱
            //需要注意的是:这里的装箱采用的是值的拷贝
            object obj = i;
            //检验是否装箱成功了
            if(obj is int)
            {
               Console.WriteLine("数据已经装箱!");
            }
            //我们在这里更改i的值
            i = 33;
            Console.WriteLine("int i现在的值是:{0}",i);
           Console.WriteLine("int i装箱的值是:{0}",obj);
       }
    }
ログイン後にコピー

(2)、ボックスの開梱:

int i = 10;
    object obj = i;
    int j = (int)obj; 
   (3)、避免频繁的装箱:
    int i = 10;
    int j = 20;
    int s = 30;
    Console.WriteLine("i的值为{0},j的值为{1},s的值为{2}", i.ToString(), j.ToString(), s.ToString());
ログイン後にコピー

上記は C# のボックス化とアンボックス化の概要であり、その考え方は非常に明確で、ボックス化とアンボックス化の長所と短所、ボックス化とアンボックス化の手順など、非常に包括的な内容です。初心者が学ぶのに適しています。

C# のボクシングとアンボクシングを簡単に学習することに関するその他の記事については、PHP 中国語 Web サイトに注目してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C言語で特殊文字を処理する方法 C言語で特殊文字を処理する方法 Apr 03, 2025 pm 03:18 PM

C言語では、以下などのエスケープシーケンスを通じて特殊文字が処理されます。\ nはラインブレークを表します。 \ tはタブ文字を意味します。 ESACEシーケンスまたは文字定数を使用して、Char C = '\ n'などの特殊文字を表します。バックスラッシュは2回逃げる必要があることに注意してください。さまざまなプラットフォームとコンパイラが異なるエスケープシーケンスを持っている場合があります。ドキュメントを参照してください。

C文字列におけるcharの役割は何ですか C文字列におけるcharの役割は何ですか Apr 03, 2025 pm 03:15 PM

Cでは、文字列でCharタイプが使用されます。1。単一の文字を保存します。 2。配列を使用して文字列を表し、ヌルターミネーターで終了します。 3。文字列操作関数を介して動作します。 4.キーボードから文字列を読み取りまたは出力します。

C言語でさまざまなシンボルを使用する方法 C言語でさまざまなシンボルを使用する方法 Apr 03, 2025 pm 04:48 PM

c言語のシンボルの使用方法は、算術、割り当て、条件、ロジック、ビット演算子などをカバーします。算術演算子は基本的な数学的操作に使用されます。割り当てと追加、下位、乗算、除算の割り当てには、条件操作に使用されます。ポインター、ファイル終了マーカー、および非数値値。

マルチスレッドと非同期C#の違い マルチスレッドと非同期C#の違い Apr 03, 2025 pm 02:57 PM

マルチスレッドと非同期の違いは、マルチスレッドが複数のスレッドを同時に実行し、現在のスレッドをブロックせずに非同期に操作を実行することです。マルチスレッドは計算集約型タスクに使用されますが、非同期はユーザーインタラクションに使用されます。マルチスレッドの利点は、コンピューティングのパフォーマンスを改善することですが、非同期の利点はUIスレッドをブロックしないことです。マルチスレッドまたは非同期を選択することは、タスクの性質に依存します。計算集約型タスクマルチスレッド、外部リソースと相互作用し、UIの応答性を非同期に使用する必要があるタスクを使用します。

C言語のcharとwchar_tの違い C言語のcharとwchar_tの違い Apr 03, 2025 pm 03:09 PM

C言語では、charとwchar_tの主な違いは文字エンコードです。CharはASCIIを使用するか、ASCIIを拡張し、WCHAR_TはUnicodeを使用します。 Charは1〜2バイトを占め、WCHAR_Tは2〜4バイトを占有します。 charは英語のテキストに適しており、wchar_tは多言語テキストに適しています。 CHARは広くサポートされており、WCHAR_TはコンパイラとオペレーティングシステムがUnicodeをサポートするかどうかに依存します。 CHARの文字範囲は限られており、WCHAR_Tの文字範囲が大きく、特別な機能が算術演算に使用されます。

C言語でCharを変換する方法 C言語でCharを変換する方法 Apr 03, 2025 pm 03:21 PM

C言語では、charタイプの変換は、キャスト:キャスト文字を使用することにより、別のタイプに直接変換できます。自動タイプ変換:あるタイプのデータが別のタイプの値に対応できる場合、コンパイラは自動的に変換します。

C言語でchar配列の使用方法 C言語でchar配列の使用方法 Apr 03, 2025 pm 03:24 PM

Char Arrayは文字シーケンスをC言語で保存し、char array_name [size]として宣言されます。アクセス要素はサブスクリプト演算子に渡され、要素は文字列のエンドポイントを表すnullターミネーター「\ 0」で終了します。 C言語は、strlen()、strcpy()、strcat()、strcmp()など、さまざまな文字列操作関数を提供します。

C言語合計の機能は何ですか? C言語合計の機能は何ですか? Apr 03, 2025 pm 02:21 PM

C言語に組み込みの合計機能はないため、自分で書く必要があります。合計は、配列を通過して要素を蓄積することで達成できます。ループバージョン:合計は、ループとアレイの長さを使用して計算されます。ポインターバージョン:ポインターを使用してアレイ要素を指し示し、効率的な合計が自己概要ポインターを通じて達成されます。アレイバージョンを動的に割り当てます:[アレイ]を動的に割り当ててメモリを自分で管理し、メモリの漏れを防ぐために割り当てられたメモリが解放されます。

See all articles