1

医者を使って私の質問を説明させてください。現在、医師は、神経科医=0、腫瘍学者=1、心臓専門医=2、婦人科医=3 など、さまざまな専門分野を持っています。これらの専門分野の 1 つを整数として取得し、それをパラメーターとして保存されたデータベース内の手順:

DisplaySkills(int speciality)
{
   //create a connection to a database, refer to a stored procedure in the database;
   //send "speciality" as an argument to that stored procedure
}

さて、ここで私は、これらの専門分野を列挙内に持つべきか、それとも個別に宣言するべきかについて、一種のジレンマに陥っています。一見すると、「1つのことが複数の1つである可能性がある」場合にすぎないため、列挙型を使用する必要があるように感じますが、一方で、列挙型を使用すると、それをキャストする必要があることがわかります内部値を取得します。次に例を示します。

enum Speciality
{
  Neurologist=0,
  Oncologist=1,
  Cardiologist=2,
  Gynecologist=3
}
.............
Speciality spec=Speciality.Oncologist;
.............
DisplaySkills(int(spec));

わかりませんが、列挙型をキャストする必要があるのは完全に通常の慣行であり、プログラマーによって広く使用されているのかもしれませんが、パフォーマンスに影響を与えると思いました (目立つかどうかに関係なく)。

4

4 に答える 4

2

DisplaySkills列挙型をパラメーターとして受け入れるメソッドを使用します。ストアド プロシージャを呼び出すときにのみキャストを行います。

いつ見られるDisplaySkills(int speciality)かというと、いくつかの列挙型で宣言された専門分野とは関係がないからです。多分私はそれをこのように使うべきですか?

DisplaySkills(500);

一方で:

DisplaySkills(Speciality.Neurologist);

可能なすべてのパラメータ値について教えてくれます。また、名前をDisplaySkillsOf(Speciality.Cardiologist)- に変更すると、より英文に見えます。そして、 enumに含まれる渡された値をチェックするためのガード条件を追加しました。Specialityそうでなければ、誰かがこれを行うことができます

DisplaySkills((Speciality)500);

そして、このメソッド内でのみ、パラメーターの作成時に渡された enum を int に変換します (ADO.NET を使用しているように見えます)。

cmd.Parameters.Add(new SqlParameter("@Speciality", (int)spec));

メソッドのガードの作成に関するもう 1 つのヒント。一般的な列挙ラッパーを使用して、適切な値が渡されたかどうかを確認できます

if (!Enum<Speciality>.IsDefined(spec))
     throw new ArgumentException("spec");
于 2012-11-15T08:04:15.667 に答える
1

列挙型を使用するか、内部値が必要な場合は別の定数を使用する必要がありますか?

あなたの場合enum、定数フィールドよりも選択します。

おそらく、列挙型をキャストする必要があるのは、完全に通常の方法です。

はい。です。

于 2012-11-15T08:02:12.410 に答える
1

という理由だけで、静的定数クラスの代わりに列挙型を使用することをお勧めしますType safe
経験則: Int + 文字列値しかない場合は、enum を使用します。それ以上のフィールドがある場合は、静的クラスを使用してください。

于 2012-11-15T08:03:00.453 に答える
1

キャストが心配な場合は、ここでは必要ないことをお伝えします。これを使用できます

int value = Speciality.Cardiologist.GetHashCode();
于 2012-11-15T08:03:53.517 に答える