Array obj = Enum.GetValues(typeof(EmpType));
Console.WriteLine("В этом перечне {0} членов.", obj.Length);
foreach(EmpType e in obj) {
Console.Write("Строка с именем: {0},", e.ToString);
Console.Write("int: ({0}), ", Enum.Format(typeof(EmpType)
Console.Write("hex: ({0})\n", Enum.Format(typeof(EmpType), e, "X"));
}
}
Как вы сами можете догадаться, этот блок программного кода для перечня EmpType печатает пары "имя-значение" (в десятичном и шестнадцатиричном формате).
Теперь исследуем свойство IsDefined. Это свойство позволяет выяснить, является ли данная строка членом данного перечня. Предположим, что нужно выяснить, является ли значение SalesPerson (продавец) частью перечня EmpType. Для этого вы должны послать указанной функции информацию о типе перечня и строку, которую требуется проверить (информацию о типе можно получить с помощью операции typeof, которая подробно рассматривается в главе 12).
static void Main(string[] args) {
…
// Есть ли значение SalesPerson в EmpType?
if (Enum.IsDefined(typeof(EmpType), "SalesPerson")) Console.WriteLine("Да, у нас есть продавцы.");
else Console.WriteLine("Нет, мы работаем без прибыли…");
}
С помощью статического метода Enum.Parse можно генерировать значения перечня, соответствующие заданному строковому литералу. Поскольку Parse возвращает общий System.Object, нужно преобразовать возвращаемое значение в нужный тип.
// Печатает "Sally is a Manager".
EmpType sally = (EmpType)Enum.Parse(typeof(EmpType), "Manager");
Console.WriteLine("Sally is a {0}", sally.ToString);
И последнее, но не менее важное замечание: перечни в C# поддерживают различные операции, которые позволяют выполнять сравнения с заданными значениями, например:
static void Main(string[] args) {
…
// Какая из этих переменных EmpType
// имеет большее числовое значение?
EmpType Joe = EmpType.VP;
EmpType Fran = EmpType.Grunt;
if (Joe ‹ Fran) Console.WriteLine("Значение Джо меньше значения Фрэн.");
else Console.WriteLine("Значение Фрэн меньше значения Джо.");
}
Исходный код. Проект Enums размещен в подкаталоге, соответствующем главе 3.
Мастер-класс: System.Object
Совет. Следующий обзор System.Object предполагает, что вы знакомы с понятиями виртуального метода и переопределения методов. Если мир ООП для вас является новым, вы можете вернуться к этому разделу после изучения материала главы 4.
В .NET каждый тип в конечном итоге оказывается производным от общего базового класса System.Object. Класс Object определяет общий набор членов, поддерживаемых каждым типом во вселенной .NET. При создании класса, для которого не указан явно базовый класс, вы неявно получаете этот класс из System.Object.
// Неявное получение класса из System.Object.
class.HelloClass {…}
Если вы желаете уточнить свои намерения, операция C#, обозначаемая двоеточием (:), позволяет явно указать базовый класс типа (например. System.Object).
// В обоих случаях класс явно получается из System.Object.
class ShapeInfo: System.Object {…}
class ShapeInfo: object {…}
Тип System.Object определяет набор членов экземпляра и членов класса (статических членов). Заметим, что некоторые из членов экземпляра объявляются с использованием ключевого слова virtual и поэтому могут
// Класс, занимающий наивысшую позицию в .NET:
// System.Object
namespace System {
public class Object {
public Object;
public virtual Boolean Equals(Object obj);
public virtual Int32 GetHashCode;
public Type GetType;
public virtual String ToString;
protected virtual void Finalize;
protected Object MemberwiseClone;