構造
構造体(struct)は、データと関数をカプセル化するデータ構造体です。クラス(class)と比較すると、最大の違いは、構造体が値型であるのに対し、クラスは参照型であるということです。一般的な構造は、クラスよりも単純なオブジェクトに使用されます。
構造の宣言と使用
クラスと同様に、構造体には、コンストラクター、定数、フィールド、メソッド、プロパティ、インデクサー、イベント、演算子、ネストされた値型など、さまざまなメンバーを含めることができます。同時に、構造はインターフェースを実装することもできます。構造体の型宣言形式は次のとおりです。
struct 结构名 [:接口名]
{
...
}
struct
構造タイプは、ポイント、行列、色などの単純なデータ構造を表すのに適しています。例えば:
struct Point
{
public double x, y;
public Point (double x, double y) {
this.x = x;
this.y = y;
}
public double R () {
return Math.Sqrt (x * x + y * y);
}
}
class Program
{
static void Main (string[] args) {
Point[] points = new Point[100];
for (int i = 0; i < points.Length; i++) {
points[i] = new Point (i, i * i); // 数值的copy
Console.WriteLine (points[i].R ());
}
}
}
Pointのクラスの代わりに構造体を使用すると、メンバーの保存場所に大きな違いが生じる可能性があります。上記のプログラムでは、100個の要素の配列が作成され、初期化されます。Point
クラスで実装された場合、プログラムは101個の個別のオブジェクトを使用します。1つは配列用で、もう1つは各要素用です。ただし、構造体を使用してPointを実装する場合、プログラムは1つのオブジェクト、つまり1つの配列のみを占有するため、より効率的です。
構造の使用に関する制限
構造体は使用中の継承をサポートしていません。構造体を使用するときは、次の点に注意する必要があります。
- 構造体は他のタイプから継承することはできず、インターフェースからのみ継承できます。ただし、すべての構造は暗黙的に継承され
Object
ます。 - 構造にパラメータのない構築方法を含めることはできません。これは、任意の構成は、システムが自動的に引数なしのコンストラクタを提供すると考えられる、コンストラクタは自動的に(各フィールドの初期値を割り当てられ
0
、false
、null
など)。 - 工法がある場合、工法では、各フィールドに値を明示的に割り当てて、各フィールドが決定されるようにする必要があります。
- 各フィールドを定義する場合、初期値を指定することはできません。ただし、
const
定数には値を割り当てる必要があります。 - 構造体にデストラクタメソッドを含めることはできません。
- 構造体のメンバーは
protected
、継承に関連しているため、protectedで変更することはできません。 ==
演算子が定義されていない限り、変数構造タイプを使用して決定されたものを比較することはできません==
。
構造体を使用する場合、new
演算子を使用せずに構造体のインスタンス化を実行できます。使用されていない場合はnew
、その後、すべてのフィールドは、(デフォルトの初期値です0
、false
、null
など)。使用new
する場合は、対応する構築メソッドを呼び出すことができます。つまり、構造体のインスタンス化を使用することも使用しnew
ないこともできnew
、クラスのインスタンス化を使用する必要がありますnew
。
列挙する
列挙型(enum)は、複数の選択肢がある状況で使用されます。列挙型は、一連のシンボリック定数の型名を提供します。列挙型の各メンバーは、実際にはシンボリック定数です。例えば:
enum LightColor
{
Red, Yellow, Green
}
これは、列挙型を宣言するColor
3つの可能性を表しています。Red
、Yellow
、Green
。ここでは三つの値は、実際には3つの整数であり0
、1
、2
しかし、整数、列挙型と比較して、より良い可読性を行い、簡単なエラーを検出します。
列挙宣言
キーワードを使用して列挙型を宣言しますenum
。宣言の基本的な形式は次のとおりです。
enum 枚举名 [:基本类型名]
{
枚举成员 [ = 常数表达式],
...
}
各列挙型には、列挙型の基になる型と呼ばれる対応する整数型があります。文では、明示的に宣言列挙することができbyte
、sbyte
、short
、ushort
、int
、uint
、long
またはulong
基本タイプ。charは基本型として使用できないことに注意してください。基本タイプが宣言されていない場合、デフォルトはint
です。
暗黙的な割り当ては、次のルールに従って値を決定します。
enum Color
{
Red,
Green = 10,
Blue,
Max = Blue
}
どこRed
値は0
、Green
値がされ10
、Blue
値があり11
、かつMax
価値があります11
。
列挙型メンバーの前で修飾子を明示的に使用することはできません。各列挙型メンバーは暗黙的にconstであり、その値は変更できません。各メンバーは暗黙的にpublic
trueであり、そのアクセス制御は制限されていません。各メンバーは暗黙的にstatic
trueであり、列挙型名はアクセスに直接使用されます。例えば:
enum LightColor
{
Red, Yellow, Green
}
class TrafficLight
{
public static void WhatInfo(LightColor color) {
switch (color) {
case LightColor.Red:
Console.WriteLine("Stop!");
break;
case LightColor.Yellow:
Console.WriteLine("Warning!");
break;
case LightColor.Green:
Console.WriteLine("Go!");
break;
default:
break;
}
}
public static LightColor GetRandomColor() {
Random rng = new Random();
int num = rng.Next (3);
return (LightColor)num;
}
}
class Test
{
static void Main (string[] args) {
LightColor c = TrafficLight.GetRandomColor();
Console.WriteLine(c.ToString());
TrafficLight.WhatInfo(c);
}
}
列挙操作
列挙型はそれぞれ、クラスから自動的にSystem.Enum
派生します。したがって、Enum
クラスのメソッドとプロパティは、列挙型の値で使用できます。列挙型の場合、演算子は次の整数型のほとんどを使用できます==, !=, <, >, <=, >=, +, -, ^, &, |, ~, ++, --, sizeof
。
列挙型と整数型の間の変換では、強制型変換を使用する必要があります。特別な場合は、定数0を暗黙的に任意の列挙型に変換できることです。
列挙型は、文字列との間で変換することもできます。列挙型のToString()
メソッドは、上記の例で使用されているように、対応する列挙メンバーの名前である文字列を取得できますConsole.WriteLine(c.ToString());
。
System.Enum
このParse()
メソッドは、列挙定数文字列を同等の列挙オブジェクトに変換できます。Parse()
メソッドの形式は次のとおりです。
public static object Parse(Type, string);
例えば:
Color c = (Color)Enum.Parse(typedef(Color), "Red");