データタイプ(1)-値タイプと参照タイプ

7321 ワード

javascriptなどのスクリプト言語とは違って、C〓〓は基本的に強いタイプのプログラミング言語と言えます.これは、任意の変数がコンパイルされるとき(実行時ではなく)、タイプが必要であることを意味します.ダイナミックタイプが導入されるまではcxi 4.0.cxiの弱いタイプはそのタイプのobjectに体現されています.どの変数もobjectタイプであってもいいです.つまり彼らはコンパイルする時にタイプがなくて、コンパイルすることによって必ずコンパイルできます.エラーは運転中に発生します.
強いタイプのメリットはたくさんあります.例えば、タイプの安全を保証することができます.(そうでないと運行中にエラーが発生します.)IDEによるスマートプロンプトなどを楽しむことができます.ミスしにくいです.cxiは多くのデータタイプがありますが、ValueType(値タイプ)とReferenceType(引用タイプ)の2種類に分けられます.前者はint、double、longなどの数値タイプ、book、構造体と列挙を含みます.後者は比較的に抽象的で、クラス、インターフェース、委託、配列、文字列などを含みます.二つのタイプのデータの特性を把握することはとても重要です.これも面接の基礎テーマです.
  • のすべての値タイプのデフォルト値は0で、すべての参照タイプのデフォルト値はNullです.これは逆に、私たちがあるタイプに対して、値の種類なのか、それとも引用のタイプなのかを判断する方法として使えます.例えば文字列は混淆されやすいタイプですが、彼のデフォルト値がnullであることを考えると、引用タイプに属すると判定しやすくなります.また、これはシステムが所有する構造関数の動作であり、すべての値の種類に初期値0を設定し、参照の種類はnullである.
  • 値タイプは、初期化されてスタック上に割り当てられており(スタック上に空間があり、その大きさは値タイプの大きさに応じて決められている)、明瞭なライフサイクルを有し、使用が終了するとすぐに回収される.参照タイプの初期化割り当ては比較的複雑で、引用タイプをスタックに割り当て、その占用空間の大きさは参照タイプ自体の大きさによって決定され、スタックに参照を追加し、これは類似のポインタの東であり、スタック上の空間を指す.使用後はゴミ収集器の回収を待って、回収時は確定しません.注意してください.この文は本当に重要です.だからもう一度繰り返します.値の種類は初期化してスタックに割り当てられます.引用の種類は初期化してスタックに割り当てられています.その占用空間の大きさは引用の種類そのものの大きさによって決まります.また、スタックに引用の種類を加えます.初期化には値が割り当てられていない場合は、ポインタなしでスタックに空間を割り当てるだけです.
  • 「初期化」の学名はnewキーワードを使用する.パラメータを追加しないと、データタイプ自体のデフォルトのコンストラクタを呼び出します.値の種類でも参照の種類でも大丈夫です.他のコンストラクタがあると、あなたが入ってきた変数の数と種類によって、どの構造函4を呼び出すかをシステムが決めます.例えば、int a=new int()は、new呼び出しクラスInt 32のデフォルトのアーキテクチャ関数であり、その値は0に設定されているので、int a=0に相当する.注意すべきことは、値の種類のデフォルトのコンストラクタはカバーできません.パラメータがあるコンストラクターしか定義できません.
  • のすべての値タイプは引き継ぎをサポートしないが、参照タイプは(密封タイプでない場合)可能である.
  • 値タイプは、その属性として参照タイプを含むことができ、その逆もまた然りである.値の種類と参照の種類は、フィールド、属性、方法、インターフェース、イベントを実現することができます.
  • は、値タイプの割り当ての場合、簡単なコピーを行うものです.参照の種類に値を割り当てるときは、ポインタを変更する方向です.例えば
  •    int i=0; int j=i 
    このとき、iの値が変わると、jの値は影響を受けない.しかし、iが参照タイプである場合、j=iはiとjのポインタが同じ場所を指すことを意味する.したがって、どの値を変更しても、もう一つは影響されます.このような行為は浅い複製といい、つまりスタック上に引用をコピーするだけで、ポインタは同じところを指します.ヒープの上で新しいオブジェクトを開発する場合は、深くコピーしてICloneableインターフェースを実現するために使用します.引用の種類が浅いコピーの挙動は、たとえ比較的複雑な値の種類であっても、参照の種類(たとえば、クラスを含む構造体を書くことができる)が含まれています.
     
       
     1 class Program
    
     2     {
    
     3         static void Main(string[] args)
    
     4         {
    
     5             rectangle a = new rectangle("info", 10, 20);
    
     6             rectangle b = a;
    
     7             a._chang = 999;
    
     8             a._recinfo.infostring = "new info"; 
    
     9 
    
    10             Console.WriteLine(string.Format("A: chang is {0} and kuan is {1}, info: {2}", a._chang, a._kuan, a._recinfo.infostring));
    
    11             Console.WriteLine(string.Format("B: chang is {0} and kuan is {1}, info: {2}", b._chang, b._kuan, b._recinfo.infostring));
    
    12             Console.ReadKey();
    
    13         }
    
    14     }
    
    15 
    
    16     struct rectangle
    
    17     {
    
    18         public shapeinfo _recinfo;
    
    19         public double _chang;
    
    20         public double _kuan;
    
    21 
    
    22         public rectangle(string recinfo, double chang, double kuan)
    
    23         {
    
    24             _recinfo = new shapeinfo(recinfo);
    
    25             _chang = chang;
    
    26             _kuan = kuan;
    
    27         }
    
    28     }
    
    29 
    
    30     class shapeinfo
    
    31     {
    
    32         public string infostring;
    
    33 
    
    34         public shapeinfo(string s)
    
    35         {
    
    36             infostring = s;
    
    37         }
    運行コードは二つの構造体のshopinfoの値が変わったのを見ることができます.値の種類に属する二つのdoubleは互いに影響を受けません.