クラスと構造体の比較

3779 ワード

//

public struct Person

{

   string Name;

   int  height;

   int  weight

}

public bool overWeight()

{

    //implement something

}



   :

   public class TestTime

   {

     int hours;

     int minutes;

     int seconds;

   }

 

public void passtime()

{

  //implementation of behavior

}

   }

  :

  public class Test

{

  public static ovid Main

   {

     Person Myperson=new Person      // 

     TestTime Mytime=New TestTime    // 

   }

}

上記の例から、クラスの宣言と構造の宣言は非常に似ていますが、限定子の後ろにstructがあるのかclassがあるのかの違いだけでなく、使用時に新しい構造を定義する方法と新しいクラスを定義する方法も非常に似ています.以下、それらの違いを説明します.
一.クラスと構造の違い1.値タイプと参照タイプの構造は値タイプである:値タイプはスタックにアドレスを割り当て、すべてのベースタイプは構造タイプである:int対応System.int 32の構成は、stringがsystemに対応する.string構造では、構造を使用してより多くの値タイプクラスを作成することができます.参照タイプは、スタックにアドレススタックを割り当てる実行効率がスタックの実行効率よりも高いですが、スタックのリソースが限られており、大きな論理的で複雑なオブジェクトを処理するのに適していません.したがって、構造処理はベースタイプとして扱われる小さなオブジェクトであり、クラス処理あるビジネスロジックは、構造が値タイプであるため、構造間の付与は新しい構造を作成することができ、クラスは参照タイプであり、クラス間の付与は参照注をコピーするだけである:a.構造はクラスのクラスタイプとは異なるが、彼らのベースタイプはすべてオブジェクト(object)であり、c#のすべてのタイプのベースタイプはobject b.構造のインスタンスフィールドの初期化にもNewオペレータが使用されていますが、スタックではなくスタックに構造オブジェクトが割り当てられています.「新規」(new)を使用しない場合、すべてのフィールドを初期化する前に、フィールドは未付与の状態を維持し、オブジェクトは使用できません.
new初期化を使用すると、変数にデフォルト値が割り当てられます.つまりMypersonを呼び出すとheightはデフォルトで0になりますがnewを使わないと呼び出しはできません
2.継承性構造:別の構造またはクラスから継承することができず、それ自体も継承することができず、構造は明確にsealedで宣言するが、構造は暗黙的なsealedである.クラス:完全に拡張可能で、表示された宣言sealedを除いてクラスは他のクラスとインタフェースを継承することができ、自身も継承することができます注意:構造は継承できませんが、構造はインタフェースを継承することができます.方法はクラス継承インタフェースと同じです.
3.内部構造:構造:デフォルトの構造関数がありません.ただし、コンストラクション関数を追加できます.コンストラクション関数なしabstractとsealed(継承できないため)なしprotected修飾子は使用できません.new初期化を使用しないで構造内のインスタンスフィールドを初期化するのはエラーです.つまりstruct xxは使用できません.{public int testint=1;//構造でインスタンスフィールドを初期化するのはエラーのpublic static int testint=1//これでいいです.この場合testintはインスタンスフィールドではなく、静的フィールドです.}宣言構造のデフォルト(パラメータなし)コンストラクション関数はエラーです.コンストラクション関数を書く場合は、構造メンバーをデフォルト値に初期化する必要があります.例:struct xx{public int testint;public xx(string yy){testint=yy;}//次に、struct xx{public int testint;public xx()
クラス:abstractとsealed protected修飾子を使用するには、デフォルトのコンストラクション関数と構造関数があります.newを使用してインスタンスフィールドと関数メソッドを初期化する必要があります.