Enums
Replace magic numbers and strings with named constants: declaring enums, converting them, switching on them and combining flags.
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.
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 underneathSend to the workshop Approved 2
Choosing the numbers
public enum HttpStatus{ Ok = 200, NotFound = 404, ServerError = 500}Converting
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 + " ");Erected Draft InReview Approved Fabricated Erected
Enums and switch
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));orange
[Flags]: combining options
[Flags] attribute. Combine with |, test with HasFlag or &.
[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);Read, Export False Read, Write
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
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 + " ");}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.TryParseandEnum.GetValues.[Flags]enums use powers of two and combine with|.