ホームページ バックエンド開発 C#.Net チュートリアル C# のボックス化とアンボックス化の詳細な説明

C# のボックス化とアンボックス化の詳細な説明

Jan 24, 2017 pm 02:20 PM

ボックス化とアンボックス化は、値型と参照型の間で変換するために実行される操作です。
1. 値型が参照型に変換されるときにボックス化が発生します
2. 参照型が値型に変換されるときにアンボックス化が発生します
上記 2 つの文は理解するのが難しくありませんが、深く理解するには時間がかかります。説明する余地があります。
まずボクシング中に何が起こるかを見てみましょう

object obj = 1;
ログイン後にコピー

このステートメント行は、ご存知のとおり、整数定数 1 をオブジェクト型変数 obj に割り当てます。 、値の型がスタックに配置され、オブジェクトが参照型である場合は、ヒープに配置する必要があります。値の型をヒープに配置するには、ボックス化操作が必要です。
この行の IL コードは次のとおりです: コメント部分に注意してください:

.locals init (
  [0] object objValue
)  //以上三行IL表示声明object类型的名称为objValue的局部变量
IL_0000: nop
IL_0001: ldc.i4.s 9 //表示将整型数9放到栈顶
IL_0003: box [mscorlib]System.Int32 //执行IL box指令,在内存堆中申请System.Int32类型需要的堆空间
IL_0008: stloc.0 //弹出堆栈上的变量,将它存储到索引为0的局部变量中
ログイン後にコピー

上記はボックス化操作を実行する際に、メモリ領域の適用が避けられません。型データはヒープにコピーされ、値がスタックに保存されます。これにより、メモリと CPU リソースが確実に消費されます。ボックス化解除操作がどのように機能するかを見てみましょう:
次の C# コードを見てください:

object objValue = 4;
int value = (int)objValue;
ログイン後にコピー

上記の 2 行のコードは、整数値定数 4 を参照型オブジェクト変数 objValue にボックス化するボックス化操作を実行します。次に、アンボックス操作を実行し、ヒープ上に格納されている参照変数 objValue をローカルの整数値型変数 value に格納します。
IL コードも確認する必要があります:

.locals init (
  [0] object objValue,
  [1] int32 'value'
) //上面IL声明两个局部变量object类型的objValue和int32类型的value变量
IL_0000: nop
IL_0001: ldc.i4.4 //将整型数字4压入栈
IL_0002: box [mscorlib]System.Int32  //执行IL box指令,在内存堆中申请System.Int32类型需要的堆空间
IL_0007: stloc.0 //弹出堆栈上的变量,将它存储到索引为0的局部变量中
IL_0008: ldloc.0//将索引为0的局部变量(即objValue变量)压入栈
IL_0009: unbox.any [mscorlib]System.Int32 //执行IL 拆箱指令unbox.any 将引用类型object转换成System.Int32类型
IL_000e: stloc.1 //将栈上的数据存储到索引为1的局部变量即value
ログイン後にコピー
アンボックス化操作の実行プロセスは、ボックス化操作とはまったく逆で、ヒープに格納されている参照型の値を値型に変換し、値の型に割り当てます。変数。

ボックス化操作とボックス化解除操作は追加の CPU リソースとメモリ リソースを消費するため、ボックス化操作とボックス化解除操作の消費を削減するために C# 2.0 以降にジェネリックが導入されました。

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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の 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#.netの継続的な関連性:現在の使用法を見る c#.netの継続的な関連性:現在の使用法を見る Apr 16, 2025 am 12:07 AM

C#.NETは、複数のアプリケーション開発をサポートする強力なツールとライブラリを提供するため、依然として重要です。 1)C#は.NETフレームワークを組み合わせて、開発を効率的かつ便利にします。 2)C#のタイプの安全性とゴミ収集メカニズムは、その利点を高めます。 3).NETは、クロスプラットフォームの実行環境とリッチAPIを提供し、開発の柔軟性を向上させます。

Webからデスクトップまで:C#.NETの汎用性 Webからデスクトップまで:C#.NETの汎用性 Apr 15, 2025 am 12:07 AM

c#.netisversatileforbothwebanddesktopdevelopment.1)forweb、useasp.netfordynamicapplications.2)fordesktop、equindowsorwpfforrichinterfaces.3)usexamarinforcross-platformdeveliment、enabling deshacrosswindows、

c#.netはあなたにぴったりですか?その適用性の評価 c#.netはあなたにぴったりですか?その適用性の評価 Apr 13, 2025 am 12:03 AM

c#.netissuitableforenterprise-levelApplicationsとsystemduetoitsSystemdutyping、richlibraries、androbustperformance.

汎用性のある.NET言語としてのC#:アプリケーションと例 汎用性のある.NET言語としてのC#:アプリケーションと例 Apr 26, 2025 am 12:26 AM

C#は、エンタープライズレベルのアプリケーション、ゲーム開発、モバイルアプリケーション、Web開発で広く使用されています。 1)エンタープライズレベルのアプリケーションでは、C#がasp.netcoreにWebAPIを開発するためによく使用されます。 2)ゲーム開発では、C#がUnityエンジンと組み合わされて、ロールコントロールやその他の機能を実現します。 3)C#は、コードの柔軟性とアプリケーションのパフォーマンスを改善するために、多型と非同期プログラミングをサポートします。

c#.net and the Future:新しいテクノロジーへの適応 c#.net and the Future:新しいテクノロジーへの適応 Apr 14, 2025 am 12:06 AM

C#と.NETは、継続的な更新と最適化を通じて、新しいテクノロジーのニーズに適応します。 1)C#9.0および.NET5は、レコードタイプとパフォーマンスの最適化を導入します。 2).Netcoreは、クラウドネイティブおよびコンテナ化されたサポートを強化します。 3)ASP.Netcoreは、最新のWebテクノロジーと統合されています。 4)ML.NETは、機械学習と人工知能をサポートしています。 5)非同期プログラミングとベストプラクティスはパフォーマンスを改善します。

azure/awsへのc#.netアプリケーションの展開:ステップバイステップガイド azure/awsへのc#.netアプリケーションの展開:ステップバイステップガイド Apr 23, 2025 am 12:06 AM

c#.netアプリをAzureまたはAWSに展開する方法は?答えは、AzureAppServiceとAwselasticBeanStalkを使用することです。 1。Azureでは、AzureAppServiceとAzurePipelinesを使用して展開を自動化します。 2。AWSでは、Amazon ElasticBeanstalkとAwslambdaを使用して、展開とサーバーレス計算を実装します。

C#と.NETランタイム:それらがどのように連携するか C#と.NETランタイム:それらがどのように連携するか Apr 19, 2025 am 12:04 AM

C#と.NETランタイムは密接に連携して、開発者に効率的で強力なプラットフォームの開発機能に力を与えます。 1)C#は、.NETフレームワークとシームレスに統合するように設計されたタイプセーフおよびオブジェクト指向のプログラミング言語です。 2).NETランタイムは、C#コードの実行を管理し、ガベージコレクション、タイプの安全性、その他のサービスを提供し、効率的でクロスプラットフォームの操作を保証します。

C#と.NET:2つの関係を理解し​​ます C#と.NET:2つの関係を理解し​​ます Apr 17, 2025 am 12:07 AM

C#と.NETの関係は切り離せませんが、同じものではありません。 C#はプログラミング言語であり、.NETは開発プ​​ラットフォームです。 C#は、コードの書き込み、.NETの中間言語(IL)にコンパイルされ、.NET Runtime(CLR)によって実行されるために使用されます。

See all articles