In C#, enum (short for enumeration) is a special value type that allows a variable to be one of a set of predefined named constants. Enums provide a convenient way to work with sets of related constants and improve code readability and maintainability.
An enumeration defines a set of named integral constants that help make programs more readable and manageable. Instead of using magic numbers or string literals, enums let you assign meaningful names to constant values.
enum DaysOfWeek
{
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
}
Here, DaysOfWeek is an enumeration that represents the days of the week. Internally, each member is assigned an integral value starting from 0 by default.
The basic syntax to declare an enum in C# is:
enum EnumName
{
Member1,
Member2,
Member3,
...
}
By default, the underlying type of the enum members is int, and members start at 0, incrementing by 1 automatically.
enum Colors
{
Red, // 0
Green, // 1
Blue // 2
}
In this example, Red has the value 0, Green 1, and Blue 2.
By default, the underlying type of enum members is int. However, you can specify another integral numeric type: byte, sbyte, short, ushort, int, uint, long, or ulong.
enum ErrorCode : byte
{
None = 0,
NotFound = 1,
ServerError = 255
}
Using a smaller underlying type can save memory if the enum is used extensively and the range of values fits in that type.
You can explicitly assign values to enum members. Members without assigned values will continue counting from the previous memberβs value.
enum Status
{
Unknown = 0,
Started = 1,
InProgress = 5,
Completed, // 6 (automatically next integer)
Cancelled = 10,
Failed // 11
}
Here, Completed automatically gets value 6 (one more than 5), and Failed gets 11 (one more than 10).
DaysOfWeek today = DaysOfWeek.Monday;
if (today == DaysOfWeek.Monday)
{
Console.WriteLine("Start of the work week.");
}
Enums can be used just like any other value type in conditions, switches, and assignments.
switch (today)
{
case DaysOfWeek.Saturday:
case DaysOfWeek.Sunday:
Console.WriteLine("It's the weekend!");
break;
default:
Console.WriteLine("It's a weekday.");
break;
}
You can cast enum members to their underlying integral value and vice versa.
// Enum to int int dayValue = (int)DaysOfWeek.Wednesday; // 3 // Int to Enum DaysOfWeek day = (DaysOfWeek)3; // Wednesday
Note that casting an integer that is not defined in the enum is possible but may cause unexpected behavior if not handled carefully.
C# provides several static methods in the System.Enum class to work with enums:
string[] names = Enum.GetNames(typeof(DaysOfWeek));
foreach (string name in names)
{
Console.WriteLine(name);
}
Array values = Enum.GetValues(typeof(DaysOfWeek));
foreach (var val in values)
{
Console.WriteLine(val);
}
string input = "Friday";
if (Enum.TryParse(input, out DaysOfWeek result))
{
Console.WriteLine($"Parsed successfully: {result}");
}
else
{
Console.WriteLine("Invalid enum name.");
}
Sometimes you want to combine enum values using bitwise operations, for example, when representing multiple options or permissions. The [Flags] attribute in C# allows this.
[Flags]
enum FileAccessPermissions
{
None = 0,
Read = 1,
Write = 2,
Execute = 4,
ReadWrite = Read | Write,
All = Read | Write | Execute
}
FileAccessPermissions permissions = FileAccessPermissions.Read | FileAccessPermissions.Write;
if ((permissions & FileAccessPermissions.Read) == FileAccessPermissions.Read)
{
Console.WriteLine("Read permission granted.");
}
if ((permissions & FileAccessPermissions.Execute) == FileAccessPermissions.Execute)
{
Console.WriteLine("Execute permission granted.");
}
else
{
Console.WriteLine("Execute permission denied.");
}
With the [Flags] attribute, calling ToString() on combined enum values will produce a comma-separated string of all active flags.
Console.WriteLine(permissions.ToString()); // Output: Read, Write
Enums can be declared nullable if you need to represent an undefined or unassigned state.
DaysOfWeek? meetingDay = null;
if (!meetingDay.HasValue)
{
Console.WriteLine("Meeting day not set.");
}
You can associate metadata with enum members using custom attributes.
enum Status
{
[System.ComponentModel.Description("Operation completed successfully")]
Success = 0,
[System.ComponentModel.Description("Operation failed due to error")]
Failure = 1
}
Reflection can then be used to retrieve these descriptions at runtime.
using System;
using System.ComponentModel;
using System.Reflection;
public static string GetEnumDescription(Enum value)
{
FieldInfo fi = value.GetType().GetField(value.ToString());
DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
return attributes.Length > 0 ? attributes[0].Description : value.ToString();
}
| Feature | Enum | Constants | Static Classes |
|---|---|---|---|
| Purpose | Group related named integral constants | Single constant values | Group related methods or constants |
| Type Safety | Yes (restricts to predefined values) | No (just values) | Depends on usage |
| Runtime Behavior | Value type, compiled as integral type | Value type | Reference type |
| Usability | Ideal for sets of options or states | Good for fixed values | Good for utility or helper methods |
C# is primarily used on the Windows .NET framework, although it can be applied to an open source platform. This highly versatile programming language is an object-oriented programming language (OOP) and comparably new to the game, yet a reliable crowd pleaser.
The C# language is also easy to learn because by learning a small subset of the language you can immediately start to write useful code. More advanced features can be learnt as you become more proficient, but you are not forced to learn them to get up and running. C# is very good at encapsulating complexity.
The decision to opt for C# or Node. js largely hinges on the specific requirements of your project. If you're developing a CPU-intensive, enterprise-level application where stability and comprehensive tooling are crucial, C# might be your best bet.
C# is part of .NET, a free and open source development platform for building apps that run on Windows, macOS, Linux, iOS, and Android. There's an active community answering questions, producing samples, writing tutorials, authoring books, and more.
Copyrights © 2024 letsupdateskills All rights reserved