Tutorials C# & .NET 8 Architect Mastery
Value Types vs Reference Types: Structs, Records, and Classes
On this page
Structs, Records, and classes
In C#, how you define your data structures fundamentally changes how the computer handles them. Choosing a Class when you should have used a Struct can make your app 10x slower.
1. Classes (Reference Types)
Classes live on the Heap. When you pass a class to a function, you are passing a 'Pointer' to the data. This is great for large objects but adds "Allocation Overhead".
2. Structs (Value Types)
Structs live on the Stack (usually). When you pass a struct, you are copying the FULL data. **Architect Tip:** Only use structs for small, immutable data (like a Point, a Money value, or a Lat/Long). If a struct is larger than 16 bytes, copying it becomes more expensive than the heap allocation of a class.
3. Records (C# 9+)
Records are NOT a new memory type; they are Classes or Structs with extra features. They provide 'Value-based Equality' (so two different objects with the same data are considered equal). Use them for **DTOs (Data Transfer Objects)** to make your code cleaner and safer.
4. Interview Mastery
Q: "What is 'Boxing' and why is it a performance killer?"
Architect Answer: "Boxing is when a Value Type (Struct) is converted to an Object (Reference Type) so it can be stored on the heap. This happens, for example, if you put an `int` into an `ArrayList`. It triggers a heap allocation and a copy operation. In a tight loop, boxing can cause thousands of allocations per second, triggering the GC and slowing the app to a crawl. Use **Generics (`List