4

MSDNのドキュメントや他の場所で述べられているように、構造体にはIDがないため、電話番号など、変更されない「永遠の」値を表す必要があります(電話番号は変更されませんが、新しい値を取得します)。

これは私のコーディング決定にどのように影響しますか?

その知識に基づいて、アイデンティティがないということは、2つの構造体が同じデータを持っている場合、それらを区別する方法がないことを意味すると私は考えています。したがって、概念的には、それらは同じものです。したがって、コードベースで使用される2つの構造体(たとえば(7))は、常に同じものです。したがって、クラスでは、同じデータを持つ2つのオブジェクト(たとえば、名前だけの人物オブジェクト)は異なる人物である可能性がありますが、構造体では、この区別は存在しません。したがって、スキル(釣りなど)を表す可能性のある構造体は常に同じになります(それを区別するためのアイデンティティはありません)。

それが理にかなっていることを願っています。

ありがとう

4

3 に答える 3

4

構造体はクラスとほとんど同じ構文を共有しますが、 MSDNによると:

構造体タイプは、軽量オブジェクトを表すのに適しています

それらの主な違いは、クラスが参照型オブジェクトを生成するのに対し、Structsは値型オブジェクトを生成することです。これは、次の操作を意味します。

Point A = new Point();
Point B = A;

Pointがクラスの場合はAとBが同じメモリ内オブジェクトにアクセスするようにし、Pointが構造体の場合はAの新しいコピーを作成してBに割り当てます。

ポイントが構造体の場合、次の関係が成り立ちます。

Object.Equals(A,B) == true
Object.ReferenceEquals(A,B) == false

したがって、それらを区別することができます。2つの構造体は、それぞれがメモリ内のオブジェクトであるため、同じものではありません。

このSOの質問では、Structsを使用するのが適切な場合について説明します。

于 2012-05-19T13:41:06.093 に答える
1

構造体は値です。クラスはオブジェクトです。これは実際の生活と非常によく似ており、42は常に42に等しくなりますが、ジョン・スミスという名前で2人にすることができます。

質問であなたが言ったことは、値型と参照型の概念の非常に良い概要です。

コーディングにどのように影響するかについては、常に値が同じ値になるようにコーディングしてください。たとえば、42は常に42と等しくなければなりません。参照型をID(文字列など)ではなく値で比較する必要がある場合があります。ただし、ほとんどの場合、参照型はIDで比較されます。

測定または計算できる場合は、値型に属します。それ以外の場合は、参照型を使用します。

于 2012-05-19T13:54:34.473 に答える
0

「構造体」または「レコード」の概念は、「クラス」の概念の前に作成されました。そして時々、交換することができます。

構造体の変数、フィールド、またはインスタンスを使用する場合:

(1)メソッドなしでデータメンバーのみが必要な場合。または、コンストラクターなど、ほとんど使用されていないメソッドがほとんどありません。

例:

struct CoordinateStruct
{
  int X;
  int Y;
}

(2)大量の要素が必要な場合、およびオブジェクトのため、追加のメモリを使用し、場合によっては表示されない場合は、メソッドをコンテナ要素(別のオブジェクト、オブジェクトのようなモジュール(名前空間)、またはシングルトンオブジェクトなど)に移行します(Flyweightデザインパターン)。

前:

class PointClass
{
  int X;
  int Y;
  // its also an object / class
  Color Color;

  public void assign(int NewX, int NewY, Color NewColor) { ... }
  public void move(int addX, int addNewY) { ... }
}

// multiple element container
class CADAppClass
{
  List<Point> Points;

 // ...
}

// Not enough memory Exception !!!

後:

struct PointStruct
{
  int X;
  int Y;
  // its a low memory integer
  int Color;      
}

// multiple element container
class CADAppClass
{
  List<Point> Points;

  public void assignPoint
    (ref PointStruct Point, int NewX, int NewY, Color NewColor) { ... }
  public void movePoint
    (ref PointStruct Point, int addX, int addNewY) { ... }

 // ...
}

(3)データ要素をカプセル化する必要がある場合、たとえその要素が少量であっても、メソッド、演算子、イベント、または「メッセージ」がある場合でも、変数にカプセル化します。カプセル化、おそらく例としてのシリアル化(DLL、DCOM、JSON、プレーンデータファイルからのロード)。

前:

class CustomerClass
{
  String FirstName;
  String LastName;

  public void Store(Stream Destination) { ... }
  public void Load(Stream Source) { ... }

  public void CopyTo(CustomerClass Destination) { ... }
  public void CopyFrom(CustomerClass Source) { ... }
}

後:

struct CustomerStruct
{
  char[100] FirstName;
  char[100] LastName;
}

// one to one, nested, relationship, seems redudant,
// but required
Class CustomerClass
{
  CustomerStruct Data;

  public void Store(Stream Destination) { ... }
  public void Load(Stream Source) { ... }

  public void CopyTo(CustomerStruct Destination) { ... }
  public void CopyFrom(CustomerStruct Source) { ... }
}

オブジェクト指向およびクラス指向のプログラミング言語では、構造体ではなく列挙を使用してこれを使用しましたが、JavaやC#のように、列挙をオブジェクトとして処理しません(例:オブジェクト指向のPHPおよびObject Pascal)。

(4)考慮されていない、前のケースの組み合わせ、またはシナリオ。

乾杯。

于 2012-05-19T18:39:22.313 に答える