<style> .reveal-up, .reveal-left, .reveal-right, .reveal-stagger > * { opacity: 1 !important; transform: none !important; } </style>
  1. Learn
  2. C#
  3. Object-oriented programming
All lessons in this course

Lesson 27 of 60 11 minIntermediate

Enums

Replace magic numbers and strings with named constants: declaring enums, converting them, switching on them and combining flags.

Code like if (status == 3) or if (status == "aproved") is fragile. What was 3 again? And that typo will never be caught. An enum (enumeration) is a type with a fixed set of named values, checked by the compiler.

Status.cs
public enum MemberStatus{    Draft,        // 0    InReview,     // 1    Approved,     // 2    Fabricated,   // 3    Erected       // 4} MemberStatus s = MemberStatus.Approved;if (s == MemberStatus.Approved)    Console.WriteLine("Send to the workshop"); Console.WriteLine(s);          // the nameConsole.WriteLine((int)s);     // the number underneath
Output
Send to the workshop
Approved
2
Interactive

Enums are named numbers

enum MemberStatus
MemberStatus s = MemberStatus.Approved;
s.ToString() → "Approved" · (int)s → 2 · s > MemberStatus.InReview → true
[Flags] enum Permission: each value is one bit
Permission p = Permission.Read | Permission.Export;
(int)p → 5 · p.ToString() → "Read, Export" · p.HasFlag(Permission.Write) → false

Choosing the numbers

Values.cs
public enum HttpStatus{    Ok = 200,    NotFound = 404,    ServerError = 500}

By default values start at 0 and go up by one. You can assign specific numbers, which matters when values are saved in a database or file: never reorder or renumber an enum that has already been stored.

Converting

Convert.cs
MemberStatus a = (MemberStatus)3;                         // int → enumstring name = MemberStatus.InReview.ToString();           // enum → "InReview" if (Enum.TryParse("Erected", out MemberStatus parsed))    // string → enum, safely    Console.WriteLine(parsed); foreach (MemberStatus v in Enum.GetValues<MemberStatus>())  // list all values    Console.Write(v + " ");
Output
Erected
Draft InReview Approved Fabricated Erected

Enums and switch

Switch.cs
string Colour(MemberStatus s) => s switch{    MemberStatus.Draft => "grey",    MemberStatus.InReview => "orange",    MemberStatus.Approved => "green",    MemberStatus.Fabricated or MemberStatus.Erected => "blue",    _ => "unknown"};Console.WriteLine(Colour(MemberStatus.InReview));
Output
orange

[Flags]: combining options

When several options can be on at the same time, give each value its own bit (1, 2, 4, 8…) and add the [Flags] attribute. Combine with |, test with HasFlag or &.

Flags.cs
[Flags]public enum Permission{    None = 0,    Read = 1,    Write = 2,    Export = 4,    Delete = 8,    Editor = Read | Write | Export     // a named combination} Permission p = Permission.Read | Permission.Export;Console.WriteLine(p);                              // Read, ExportConsole.WriteLine(p.HasFlag(Permission.Write));    // Falsep |= Permission.Write;                             // addp &= ~Permission.Export;                           // removeConsole.WriteLine(p);
Output
Read, Export
False
Read, Write
Quick check

In enum Size { Small, Medium, Large }, what is (int)Size.Large?

Quick check

Why do [Flags] values use 1, 2, 4, 8 instead of 1, 2, 3, 4?

Practice

Create an enum TrafficLight { Red, Yellow, Green } and a method that returns the next light (Red → Green → Yellow → Red) using a switch expression. Starting from Red, print the next 4 lights.

Show the solution
Solution.cs
public enum TrafficLight { Red, Yellow, Green } static TrafficLight Next(TrafficLight t) => t switch{    TrafficLight.Red => TrafficLight.Green,    TrafficLight.Green => TrafficLight.Yellow,    TrafficLight.Yellow => TrafficLight.Red,    _ => throw new ArgumentOutOfRangeException(nameof(t))}; var light = TrafficLight.Red;for (int i = 0; i < 4; i++){    light = Next(light);    Console.Write(light + " ");}
Output
Green Yellow Red Green

Remember

  • An enum is a type with a fixed set of named integer constants.
  • Values start at 0 unless you assign them; don’t renumber stored enums.
  • Convert with casts, ToString(), Enum.TryParse and Enum.GetValues.
  • [Flags] enums use powers of two and combine with |.
0 of 60 lessons completed