「構造体」または「レコード」の概念は、「クラス」の概念の前に作成されました。そして時々、交換することができます。
構造体の変数、フィールド、またはインスタンスを使用する場合:
(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)考慮されていない、前のケースの組み合わせ、またはシナリオ。
乾杯。