C# のボックス化とボックス化解除を簡単に学習
まず、梱包と開梱とは何ですか?
使用します。
元の型 (Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal)、列挙 (enum)、構造体 (struct) を含む値の型。
参照型には、クラス、配列、インターフェイス、デリゲート、文字列などが含まれます。スタック上に配置する; 参照型 obj を配置する場合、obj オブジェクトをヒープに配置し、それに temp 値を割り当てる必要があります。この一連のプロセスがボックス化プロセスです。
アンボックス化: 参照型から任意の値型への明示的な変換。ボックス化とは異なり、ボックス化を解除すると変形が表示されます。
暗黙的な変換は常に成功し、例外はスローされません:
(1)、派生クラスから基本クラスへ;
(3)、クラスからインターフェースへインターフェース);
(4)、Null から任意のクラスへ;
明示的な参照変換、以下は例外をスローする可能性があり、変換は成功しない可能性があります:
、(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 サイトに注目してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









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

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

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

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

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

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

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