`struct` vs. `class` in C#: Understanding Value Types and Reference Types

Compare and contrast `struct` (value type) and `class` (reference type) in C#. This guide clarifies their key differences in memory management, behavior when assigning variables, suitability for different object types, and helps you choose the appropriate type for your C# programs.



Understanding the Differences Between `struct` and `class` in C#

Introduction

Both `struct` and `class` in C# are used to create custom data types, but they have significant differences in how they're handled in memory and their capabilities. Choosing between them depends on the specific needs of your application.

Classes: Reference Types

A `class` is a reference type. When you create a class object, a reference (a pointer) to the object's memory location is stored in the variable. Multiple variables can refer to the same object; changes made through one reference are visible through all references.

Example: Using a Class

Example: Class Definition and Usage

using System;

public class Writer {
    public string authorName;
    public string primaryLanguage;
    public int publishedArticles;
    public int authoredImprovements;

    public void AuthorDetails(string authorName, string primaryLanguage, int publishedArticles, int authoredImprovements) {
        this.authorName = authorName;
        this.primaryLanguage = primaryLanguage;
        this.publishedArticles = publishedArticles;
        this.authoredImprovements = authoredImprovements;
        Console.WriteLine($"Author's Name: {authorName}\nPrimary Language: {primaryLanguage}\nTotal Published Articles: {publishedArticles}\nTotal Authored Improvements: {authoredImprovements}");
    }
}

class Program {
    static void Main(string[] args) {
        Writer writerObj = new Writer();
        writerObj.AuthorDetails("John Doe", "C#", 80, 50);
    }
}

Structs: Value Types

A `struct` is a value type. When you create a `struct` variable, the actual data is stored directly within the variable's memory. Changes made to one `struct` variable don't affect others, even if they have the same value.

Example: Using a Struct

Example: Struct Definition and Usage

using System;

namespace MyUniqueApplication {
    public struct PersonDetails {
        public string FullName;
        public int Age;
        public int BodyWeight;
    }

    class MyProgram {
        static void Main(string[] args) {
            PersonDetails person1;
            person1.FullName = "Alice Johnson";
            person1.Age = 25;
            person1.BodyWeight = 65;
            Console.WriteLine($"Information about person1: Name: {person1.FullName}, Age: {person1.Age}, Body Weight: {person1.BodyWeight}");
        }
    }
}

Key Differences Between `struct` and `class`

Feature `class` `struct`
Type Reference type Value type
Memory Allocation Heap Stack
Inheritance Supported Not supported
Default Constructor Provided automatically Not provided automatically (but can be explicitly defined)
Initialization Members initialized to default values (null for reference types, 0 for value types) Members must be initialized explicitly
Size/Performance Generally larger due to overhead Generally smaller and faster

Conclusion

The choice between `class` and `struct` depends on your design needs. `class` is suitable for larger, more complex objects that may require inheritance. `struct` is preferable for smaller, simpler objects where value-type semantics are beneficial (e.g., for performance reasons).