Enum ではなく Class を使う
Enum を使うと switch ... case ... することになる。
たとえば、プログラム言語を Enum で定義して、その名前を表示する例。
using System; namespace UseClassInsteadOfEnum { public enum ProgrammingLanguageEnum { CSharp, Java, } public class ByEnum { public static void PrintName(ProgrammingLanguageEnum progLang) { switch (progLang) { case ProgrammingLanguageEnum.CSharp: Console.WriteLine("C#"); break; case ProgrammingLanguageEnum.Java: Console.WriteLine("Java"); break; default: throw new ArgumentException("progLang"); } } } }
Enum だと、
- なにかするには switch ... case ... を書かないと、、、
- 一応 default も書いておかないと心配だし、、、
- 将来 Enum のメンバを変更したら、全部調べて修正しないと、、、
と、悩むことになる。
クラスにすると、スッキリする。
using System; namespace UseClassInsteadOfEnum { public class ProgrammingLanguageClass { // 各項目を表わすインスタンスは static にする。 private static ProgrammingLanguageClass _cSharp = new ProgrammingLanguageClass("C#"); public static ProgrammingLanguageClass CSharp { get { return _cSharp; } } private static ProgrammingLanguageClass _java = new ProgrammingLanguageClass("Java"); public static ProgrammingLanguageClass Java { get { return _java; } } private String _name; // コンストラクタは private にして、クラス外からインスタンスが作れないようにする。 private ProgrammingLanguageClass(String name) { _name = name; } public String Name { get { return _name; } } } public class ByClass { public static void PrintName(ProgrammingLanguageClass progLang) { Console.WriteLine(progLang.Name); } } }
使う側からは、同じように見える。
namespace UseClassInsteadOfEnum { class Program { static void Main(string[] args) { ByEnum.PrintName(ProgrammingLanguageEnum.CSharp); ByClass.PrintName(ProgrammingLanguageClass.CSharp); } } }