検索
ホームページバックエンド開発C#.Net チュートリアルC#基礎知識編 基礎知識(19) 値型のボックス化とアンボックス化(2)

コードがコンパイラーによるボックス化の繰り返しを引き起こす場合は、手動ボックス化に変更してコードの実行を高速化できます。次のコードを参照してください:

            //手动装箱
            Int32 v = 5;

            //由于string.Format的参数是object类型,所以这里会造成三次装箱。
            Console.WriteLine(string.Format("{0},{1},{2}", v, v, v));

            //修改一下,当然这只是一个小技巧,比如程序中对同一个值的同一个操作执行多次,
            //应该都是要先执行一次,然后再使用的。
            Object o = v;//装箱一次

            Console.WriteLine(string.Format("{0},{1},{2}", o, o, o));

前のコード セグメントを通して、プログラムを作成するときに判断するのは簡単です。もう一度言いますが、値の型をボックス化する必要があるのはどのような場合ですか?値の型への参照を取得したい場合、これはボックス化にすぎません。値型と参照型の違いは、ここでも明確にわかります。
1. 値型はマネージド ヒープに領域を割り当てませんが、参照型はインスタンス化後にヒープ上のクラスで指定されたメンバーに領域を割り当てます。
2. 値型には、ヒープ上にオブジェクトの追加メンバー、つまり「型オブジェクト ポインター」と「同期インデックス」がありません。
ボックス化されていない値型には同期されたインデックスがないため、その型が配置されているクラスのメソッド (ロックなど) を使用して、複数のスレッドがこのインスタンスへのアクセスを同期できるようにすることはできません。
ボックス化されていない値型には型オブジェクト ポインターがありませんが、Equals、GetHashCode、ToString など、型によって継承またはオーバーライドされた仮想メソッドを引き続き呼び出すことができます。値の型がこれらの仮想メソッドのいずれかをオーバーライドする場合、値の型は暗黙的にシールされており、そこから型を派生できないため、CLR はそのメソッドを非仮想的に呼び出すことができます。さらに、仮想メソッドの呼び出しに使用される値型インスタンスはボックス化されません。オーバーライドされた仮想メソッドが基本クラスのメソッドの実装を呼び出す場合、基本クラスの実装が呼び出されたときに、値型インスタンスはボックス化されます。これらのメソッドは System.Object によって定義されているため、この引数がヒープ上のオブジェクトへのポインターであることを想定しています。
さらに、値型のボックス化されていないインスタンスをその型のインターフェイスの 1 つにキャストするには、インスタンスをボックス化する必要があります。インターフェイス変数にはヒープ上のオブジェクトへの参照が含まれている必要があるためです。以下のコードを見てください:

 class Program
    {
        static void Main(string[] args)
        {
            Point p1 = new Point(10, 10);

            Point p2 = new Point(20, 20);

            //调用ToString不装箱,这里ToString是一个虚方法
            Console.WriteLine(p1.ToString());

            //GetType是一个非虚方法,p1要装箱
            Console.WriteLine(p1.GetType());

            //这里调用的是public int CompareTo(Point p)
            //p2不会装箱
            Console.WriteLine(p1.CompareTo(p2));

            //p1要装箱,这就是将未装箱的值类型转为类型的某个接口时
            IComparable c = p1;

            Console.WriteLine(c.GetType());

            //这里调用的是public Int32 CompareTo(Object o),
            //而且c本来就是一个引用,因此不装箱了
            Console.WriteLine(p1.CompareTo(c));

            //这里调用的是c的CompareTo方法,参数是object型的
            //所以要对p2装箱
            Console.WriteLine(c.CompareTo(p2));

            //对c拆箱,并复制值到p2中
            p2 = (Point)c;

            Console.WriteLine(p2.ToString());
        }
    }
    
     internal struct Point : IComparable
    {
        private Int32 x;

        private Int32 y;

        public Point(Int32 x, Int32 y)
        {
            this.x = x;

            this.y = y;
        }

        public override string ToString()
        {
            return string.Format("{0},{1}", x, y);//这里装箱两次,不知道有没好办法。
        }

        public int CompareTo(Point p)
        {
            return Math.Sign(Math.Sqrt(x * x + y * y) - Math.Sqrt(p.x * p.x + p.y * p.y));
        }

        public Int32 CompareTo(Object o)
        {
            if (GetType() != o.GetType())
            {
                throw new ArgumentException("o is not Point.");
            }

            return CompareTo((Point)o);
        }
    }

上記は、C# の基礎知識の内容です 基礎知識 (19) 値型のボックス化とアンボックス化 (2) 関連する内容については、PHP 中国語 Web サイト ( www.php.cn)!


声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
C#.NETアドバンテージ:機能、利点、およびユースケースC#.NETアドバンテージ:機能、利点、およびユースケースMay 05, 2025 am 12:01 AM

C#.NETの利点には以下が含まれます。1)非同期プログラミングなどの言語機能により、開発が簡素化されます。 2)パフォーマンスと信頼性、JITコンピレーションとゴミ収集メカニズムによる効率の向上。 3)クロスプラットフォームサポート、.NetCoreはアプリケーションシナリオを拡張します。 4)Webからデスクトップ、ゲーム開発までの優れたパフォーマンスを備えた幅広い実用的なアプリケーション。

C#は常に.NETに関連付けられていますか?代替案の探求C#は常に.NETに関連付けられていますか?代替案の探求May 04, 2025 am 12:06 AM

C#は常に.NETに結び付けられているわけではありません。 1)C#は、モノランタイム環境で実行でき、LinuxおよびMacOSに適しています。 2)Unityゲームエンジンでは、C#はスクリプトに使用され、.NETフレームワークに依存しません。 3)C#は、.NetMicRoframeworkなどの埋め込みシステム開発にも使用できます。

.NETエコシステム:C#の役割以降.NETエコシステム:C#の役割以降May 03, 2025 am 12:04 AM

C#は、.NETエコシステムで中核的な役割を果たし、開発者にとって好ましい言語です。 1)C#は、C、C、Javaの利点を組み合わせた効率的で使いやすいプログラミング方法を提供します。 2).NETランタイム(CLR)を介して実行して、効率的なクロスプラットフォーム操作を確保します。 3)C#は、LINQや非同期プログラミングなどの基本的な使用から高度な使用をサポートします。 4)最適化とベストプラクティスには、StringBuilderおよび非同期プログラミングを使用して、パフォーマンスと保守性を向上させることが含まれます。

.NET言語としてのC#:エコシステムの基礎.NET言語としてのC#:エコシステムの基礎May 02, 2025 am 12:01 AM

C#は、2000年にMicrosoftがリリースしたプログラミング言語で、CのパワーとJavaのシンプルさを組み合わせることを目指しています。 1.C#は、カプセル化、継承、多型をサポートするタイプセーフ、オブジェクト指向のプログラミング言語です。 2. C#のコンパイルプロセスは、コードを中間言語(IL)に変換し、.NETランタイム環境(CLR)でマシンコード実行にコンパイルします。 3. C#の基本的な使用法には、可変宣言、制御フロー、関数の定義が含まれ、高度な使用法には非同期プログラミング、LINQ、およびデリゲートなどが含まれます。4。一般的なエラーには、デバッガー、例外処理、ロギングを介してデバッグできるタイプミスマッチおよびヌル参照の例外が含まれます。 5.パフォーマンスの最適化の提案には、LINQの使用、非同期プログラミング、およびコードの読み取り可能性の向上が含まれます。

C#対.NET:重要な違​​いと類似点を明確にしますC#対.NET:重要な違​​いと類似点を明確にしますMay 01, 2025 am 12:12 AM

C#はプログラミング言語であり、.NETはソフトウェアフレームワークです。 1.C#はMicrosoftによって開発されており、マルチプラットフォーム開発に適しています。 2..NETは、クラスライブラリとランタイム環境を提供し、多言語をサポートします。 2つは協力して最新のアプリケーションを構築します。

誇大広告を超えて:c#.netの現在の役割を評価する誇大広告を超えて:c#.netの現在の役割を評価するApr 30, 2025 am 12:06 AM

C#.NETは、C#言語と.NETフレームワークの利点を組み合わせた強力な開発プラットフォームです。 1)エンタープライズアプリケーション、Web開発、ゲーム開発、モバイルアプリケーション開発で広く使用されています。 2)C#コードは中間言語にコンパイルされ、.NETランタイム環境によって実行され、ガベージコレクション、タイプの安全性、LINQクエリをサポートします。 3)使用の例には、基本的なコンソール出力と高度なLINQクエリが含まれます。 4)空の参照やタイプ変換エラーなどの一般的なエラーは、デバッガーとロギングを通じて解決できます。 5)パフォーマンスの最適化の提案には、非同期プログラミングとLINQクエリの最適化が含まれます。 6)競争にもかかわらず、C#.NETは継続的なイノベーションを通じて重要な地位を維持しています。

C#.NETの未来:トレンドと機会C#.NETの未来:トレンドと機会Apr 29, 2025 am 12:02 AM

C#.NETの将来の傾向は、主にクラウドコンピューティング、マイクロサービス、AIおよび機械学習統合、およびクロスプラットフォーム開発の3つの側面に焦点を当てています。 1)クラウドコンピューティングとマイクロサービス:C#.NETは、Azureプラットフォームを介してクラウド環境のパフォーマンスを最適化し、効率的なマイクロサービスアーキテクチャの構築をサポートします。 2)AIと機械学習の統合:ML.NETライブラリの助けを借りて、C#開発者はアプリケーションに機械学習モデルを埋め込み、インテリジェントアプリケーションの開発を促進できます。 3)クロスプラットフォーム開発:.NetCoreおよび.Net5を介して、C#アプリケーションはWindows、Linux、およびMacOで実行され、展開範囲が拡大します。

C#.NET開発今日:トレンドとベストプラクティスC#.NET開発今日:トレンドとベストプラクティスApr 28, 2025 am 12:25 AM

C#.NET開発における最新の開発とベストプラクティスには、次のものが含まれます。1。非同期プログラミングは、アプリケーションの応答性を向上させ、Asyncを使用して非ブロッキングコードを簡素化し、キーワードを待ちます。 2。LINQは強力なクエリ関数を提供し、遅延した実行および式ツリーを介してデータを効率的に操作します。 3.パフォーマンスの最適化の提案には、非同期プログラミングの使用、LINQクエリの最適化、メモリの合理的な管理、コードの読みやすさとメンテナンスの改善、単体テストの書き込みが含まれます。

See all articles

ホット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 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SublimeText3 中国語版

SublimeText3 中国語版

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

メモ帳++7.3.1

メモ帳++7.3.1

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。