C# - Enum or Enumeration
In C#, an "enum" (short for enumeration) is a user-defined data type that consists of a set of named integral constants. Enums provide a way to define a list of related values with human-readable names, making the code more readable and maintainable. Each constant within an enum has an underlying integer value, and these values are assigned automatically, starting from 0 by default, unless specified otherwise.
Example:
using System;
class Program
{
// Define an enum named 'DaysOfWeek' with days of the week as constants.
enum DaysOfWeek
{
Sunday, // Assigned value 0
Monday, // Assigned value 1
Tuesday, // Assigned value 2
Wednesday, // Assigned value 3
Thursday, // Assigned value 4
Friday, // Assigned value 5
Saturday // Assigned value 6
}
static void Main()
{
// Access enum values and assign them to variables.
DaysOfWeek today = DaysOfWeek.Wednesday;
DaysOfWeek anotherDay = DaysOfWeek.Friday;
// Output the values of the variables.
Console.WriteLine("Today is " + today);
Console.WriteLine("Another day is " + anotherDay);
// Enum to integer conversion.
int todayValue = (int)today;
Console.WriteLine("Value of today (as integer): " + todayValue);
// Integer to enum conversion.
DaysOfWeek convertedDay = (DaysOfWeek)3;
Console.WriteLine("Converted day: " + convertedDay);
}
}
Output:
Today is Wednesday
Another day is Friday
Value of today (as integer): 3
Converted day: Wednesday
In this example:
- We define an enum named
DaysOfWeek
with constants for each day of the week. By default, Sunday is assigned the value 0, and the values increment sequentially.
- In the
Main
method, we create variables of the DaysOfWeek
type (today
and anotherDay
) and assign enum values to them.
- We output the values of these variables, which will display the day names.
- We also demonstrate how to convert an enum value to an integer (
todayValue
) and an integer to an enum value (convertedDay
). Enum values can be cast to integers and vice versa.
Enums are useful for scenarios where you have a fixed set of related values, such as days of the week, months, or any other situation where a defined list of options is needed. They improve code clarity and help prevent errors by using meaningful names instead of arbitrary integer values.
Common Enum Methods and Properties
Methods:
- Enum.GetName: Returns the name of an enum constant as a string, given its enum type and value.
- Enum.GetNames: Returns an array of strings containing the names of all the enum constants in the specified enum type.
- Enum.GetValues: Returns an array of the values of all the enum constants in the specified enum type.
- Enum.IsDefined: Determines whether a specified value exists in the enum type. It returns a boolean value indicating whether the value is a valid enum constant.
Properties:
- Enum.Name: Gets the name of the enum constant as a string.
- Enum.Value: Gets the integral value of the enum constant.
- Enum.GetUnderlyingType: Gets the underlying integral type of the enum. This property returns the type, such as `int`, `byte`, or `long`, that is used to store the values of the enum constants.
- Enum.HasFlag: Checks whether the enum value contains a specific flag (used with enums marked with the `[Flags]` attribute). It returns a boolean indicating whether the specified flag is set in the enum value.
- Enum.GetCustomAttributes: Retrieves an array of custom attributes applied to an enum value. This can be useful for retrieving additional metadata associated with enum constants.
- Enum.IsDefined (as a property): Gets a boolean value indicating whether a specified value exists in the enum type.
These methods and properties allow you to work with enums in C#, inspect their values, retrieve their names, and perform various operations on enum values. They are helpful for tasks such as data validation, serialization, and dynamic enum handling.
- Definition: An enum (short for enumeration) is a user-defined data type used to represent a set of named integral constants.
- Values: Enum constants are named values that represent meaningful options or states. They are typically used to improve code readability.
- Underlying Type: Enums have an underlying integral type (e.g., `int`, `byte`) that determines the type of value associated with each enum constant.
- Default Values: Enum constants are assigned default values starting from 0 for the first constant, and the subsequent constants increment by 1 unless specified otherwise.
- Explicit Values: You can assign specific integral values to enum constants. These values can be of the same or different data types.
- Implicit Casting: Enum constants can be implicitly cast to their underlying integral type and vice versa.
- Enhanced Readability: Enums make code more readable by using descriptive names for constants instead of raw numeric values.
- Enum Members: Enum members (constants) are accessed using the enum type name followed by the member name (e.g., `DaysOfWeek.Monday`).
- Iterating Enums: You can iterate through the values of an enum using a loop or by using the `Enum.GetValues` method.
- Enum as Flags: Enums can be marked with the `[Flags]` attribute, allowing them to represent bitwise flags and support bitwise operations.
- Validation: Enums are often used for input validation to ensure that a variable's value falls within a specific set of options.
- Switch Statements: Enums are commonly used in switch statements to handle different cases based on their values.
- Custom Attributes: You can associate custom attributes with enum members to store additional metadata.
- String to Enum: You can convert a string to an enum value using methods like `Enum.Parse` and `Enum.TryParse`.
- Enum Format: Enums can be formatted as strings using the `ToString` method, which returns the name of the enum constant.
- Enum vs. Constants: Enums are preferred over constant values when dealing with a set of related options because they offer type safety and maintainability.
- Documentation: Document the purpose and usage of enums in code comments to make their meaning clear to other developers.
- Error Handling: Handle invalid enum values gracefully, especially when parsing from external sources, to prevent runtime errors.
- Avoid Duplicate Values: Ensure that enum constants have unique values within the same enum type.
- Compatibility: Be aware of the underlying type's range limitations when defining enum values.
- Testing: Test your code thoroughly, especially when working with enums to ensure that they behave as expected.