Language 4 of 10 · Topic 0.3

Variables, Scoping, const vs readonly & Primary Constructors

1Concept

const values are evaluated at compile time and inlined. readonly fields can only be assigned during initialization or inside constructors. C# 12+ supports Primary Constructors directly on classes and structs (class Service(ILogger logger)).

2Architecture Diagram

const double PI = 3.14159;       // Inlined directly by Roslyn compiler at compile-time
readonly DateTime StartedAt;     // Evaluated at runtime during constructor initialization

3Code Example

Stage 0 Language Foundations
using System;

// Primary Constructor in C# 12/13
public class ApiGateway(string serviceName, int port)
{
    private readonly DateTime _startTime = DateTime.UtcNow;

    public void PrintStatus()
    {
        Console.WriteLine($"Gateway [{serviceName}] running on Port {port} (Started: {_startTime:HH:mm:ss})");
    }
}

class Program
{
    static void Main()
    {
        var gateway = new ApiGateway("Authentication-Service", 5001);
        gateway.PrintStatus();
    }
}

4Expected Output

Gateway [Authentication-Service] running on Port 5001 (Started: 08:30:00)

5Key Takeaways

  • Use const only for immutable primitives whose values never change across versions.
  • Use readonly for runtime immutability and dependency injection fields.
  • Primary constructors eliminate repetitive constructor boilerplate field assignments.