C#梱包と解体--値タイプと参照タイプ

1999 ワード

梱包(boxing)と解体(unboxing)はC#タイプシステムの核心概念である.CとC++とは異なる新しいコンセプトです!箱詰めと解体操作により、値タイプと参照タイプに橋を架けることができる.言い換えれば、値タイプと参照タイプの相互変換を容易に実現することができ、箱詰めと解体はシステムを統一的に考察することができ、いずれのタイプの値も最終的に対象に従って処理することができる.C#言語のすべてのタイプはベースクラスSystemである.Objectが受け継いだのは、最もよく使われる基礎タイプ:int、byte、short、boolなど、すべてのものが対象です.これらのタイプを明示するときにスタック(HEAP)にメモリを割り当てると、極めて効率的になります.△その原因とスタックとスタックの違いについては、別の編で単独で話さなければならない.NETはどのようにこの問題を解決しますか?タイプを値型(value)と参照型(regerencetype)に分けることで、C#で定義された値タイプには、元のタイプ(Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal)、列挙(enum)、構造(struct)、参照タイプには、クラス、配列、インタフェース、依頼、文字列などが含まれます.値型はスタックにメモリを割り当て、明記と同時に初期化し、データがNULLでないことを確保する.リファレンスタイプはスタックにメモリを割り当てnullに初期化し、リファレンスタイプはGARBAGE COLLECTIONでメモリを回収する必要があります.値タイプは使いません.作用範囲を超えると、システムは自動的に解放されます.梱包と解体の定義についてお話しします!箱詰めとは、暗黙的に値型を参照型オブジェクトに変換することです.例えば、int i=0;Syste.Object obj=i; この過程は箱詰めです!iを箱詰め!ボックスを外すと、参照型オブジェクトを任意の値型に変換します.例えば、int i=0;System.Object obj=i; int j=(int)obj; この過程の前の2文はiを箱に入れて、後の1文はobjを箱に分解します!もう一度コードを書いて、何回か箱を分解したのを見てみましょう.int i=0; System.Object obj=i; Console.WriteLine(i+","+(int)obj); このうち3回の箱詰めと1回の取り外しが発生しました!,わかったでしょ?!1回目はiを箱詰め、2回目は出力時にiをstringタイプに変換し、stringタイプは参照タイプ、すなわち箱詰め、3回目は(int)objのstringタイプに変換し、箱詰め!解体は(int)obj、objを解体する!!
C#では、クラスや配列などを参照型に分類しますが、値タイプと参照型の違いは何ですか?値タイプの変数には独自のデータが含まれますが、参照タイプの変数はデータのメモリブロックを指し、直接データを格納するわけではありません.値タイプの場合、各変数には独自のデータ・レプリケーションがあり、別の値タイプの変数の操作はこの変数の値に影響しません.
一方、参照タイプでは、2つの変数が同じオブジェクトを参照する可能性があるため、1つの変数の操作は別の変数に影響します.
Eg:値タイプ
 (1) int  a=0;     

 (2) int  b=a;

 (3) int  b=10;       

(2)以降、a,bはいずれも0であるが、(3)後、b=10、a=0である.bの再添付値はaに影響しない
    :

using System;

class valueclass
{
public int value=0;
}
class text{
public static void main()
{
valueclass a=new valueclass()
valueclass a=b;
b.value=10;
Console.WriteLine(“{0},{1}”,a.value,b.value);
}
}
出力結果:10,10
ポインタに相当し、2つの変数は同じメモリデータを指し、1つの変数がメモリ領域データに変更されると、別の変数が指すデータも当然変更されます.