Bird
Raised Fist0
C Sharp (C#)programming~10 mins

Init-only setters in C Sharp (C#) - Step-by-Step Execution

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Concept Flow - Init-only setters
Create object instance
Set properties with init-only setters
Object is immutable after initialization
Attempt to modify property after init -> Compile error
This flow shows how init-only setters allow setting properties only during object creation, making the object immutable afterward.
Execution Sample
C Sharp (C#)
public record Person
{
    public string Name { get; init; }
}

var p = new Person { Name = "Alice" };
This code creates a Person object and sets the Name property using an init-only setter during initialization.
Execution Table
StepActionProperty NameValue SetResult
1Create Person object--Object created with default values
2Set Name during initializationName"Alice"Name property set to "Alice"
3Attempt to modify Name after initializationName"Bob"Compile-time error: Cannot assign to 'Name' because it is init-only
💡 Execution stops because modifying init-only property after initialization causes a compile-time error.
Variable Tracker
VariableStartAfter InitializationAfter Attempted Modification
p.Namenull"Alice"Compile error - no change
Key Moments - 2 Insights
Why can't I change the property value after the object is created?
Because the property uses an init-only setter, it can only be set during object initialization. See execution_table step 3 where modifying it later causes a compile error.
Can I set the property inside the constructor?
Yes, init-only setters allow setting properties inside the constructor or during object initialization, as shown in step 2.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the value of p.Name after initialization?
A"Bob"
B"Alice"
Cnull
DCompile error
💡 Hint
Check execution_table row 2 where Name is set during initialization.
At which step does the compile-time error occur?
AStep 3
BStep 2
CStep 1
DNo error occurs
💡 Hint
See execution_table row 3 where modifying the property after initialization causes error.
If the setter was not init-only, what would happen at step 3?
ACompile-time error
BRuntime exception
CProperty value changes to "Bob"
DProperty remains "Alice"
💡 Hint
Without init-only, properties can be changed anytime, so step 3 would succeed.
Concept Snapshot
Init-only setters allow properties to be set only during object creation.
Syntax: public string Name { get; init; }
After initialization, properties become immutable.
Trying to set them later causes compile-time errors.
Useful for immutable data models with flexible initialization.
Full Transcript
Init-only setters in C# let you set properties only when creating an object. After the object is made, you cannot change those properties. This makes the object immutable after initialization. For example, a Person record with a Name property using init-only setter can have Name set during creation but not changed later. Trying to change it after creation causes a compile-time error. This helps keep data safe and consistent.

Practice

(1/5)
1. What is the main purpose of init-only setters in C#?
easy
A. To prevent object creation
B. To allow setting properties only during object creation
C. To make methods run faster
D. To allow properties to be changed anytime

Solution

  1. Step 1: Understand init-only setters

    Init-only setters allow properties to be set only when the object is created, not after.
  2. Step 2: Compare options

    Only To allow setting properties only during object creation correctly describes this behavior; others are unrelated or incorrect.
  3. Final Answer:

    To allow setting properties only during object creation -> Option B
  4. Quick Check:

    Init-only setters = set only at creation [OK]
Hint: Init-only means set once during creation only [OK]
Common Mistakes:
  • Thinking init-only allows changes anytime
  • Confusing init-only with readonly fields
  • Assuming init-only affects methods
2. Which of the following is the correct syntax to declare an init-only property in C#?
easy
A. public string Name { get; init; }
B. public string Name { get; set; }
C. public string Name { get; readonly; }
D. public string Name { get; private set; }

Solution

  1. Step 1: Recall init-only syntax

    Init-only properties use init instead of set to allow setting only during initialization.
  2. Step 2: Check options

    public string Name { get; init; } uses { get; init; }, which is correct syntax. Others use set, readonly (invalid here), or private set.
  3. Final Answer:

    public string Name { get; init; } -> Option A
  4. Quick Check:

    Init-only syntax = get + init [OK]
Hint: Init-only uses 'init' keyword, not 'set' [OK]
Common Mistakes:
  • Using 'set' instead of 'init'
  • Trying to use 'readonly' in property accessor
  • Confusing 'private set' with init-only
3. What will happen when you run this code?
public class Person {
    public string Name { get; init; }
}

var p = new Person { Name = "Alice" };
p.Name = "Bob";
Console.WriteLine(p.Name);
medium
A. Prints 'Alice'
B. Runtime exception
C. Prints 'Bob'
D. Compile-time error

Solution

  1. Step 1: Understand init-only property behavior

    The property Name can only be set during object initialization (inside the braces). Setting it later causes a compile error.
  2. Step 2: Analyze the code

    After creating p with Name = "Alice", the code tries to assign p.Name = "Bob" outside initialization, which is invalid.
  3. Final Answer:

    Compile-time error -> Option D
  4. Quick Check:

    Changing init-only after creation = compile error [OK]
Hint: Init-only properties can't be changed after creation [OK]
Common Mistakes:
  • Assuming property can be changed anytime
  • Expecting runtime error instead of compile error
  • Confusing init-only with readonly fields
4. Identify the error in this code snippet:
public class Car {
    public string Model { get; init; }
}

var car = new Car();
car.Model = "Sedan";
medium
A. Missing constructor call
B. Property Model must have a setter, not init
C. Cannot assign init-only property outside object initializer
D. No error, code is correct

Solution

  1. Step 1: Check how init-only properties are set

    Init-only properties must be set during object creation using an initializer, not after.
  2. Step 2: Analyze the code

    The code creates car with default constructor, then tries to set Model property outside initialization, which is invalid.
  3. Final Answer:

    Cannot assign init-only property outside object initializer -> Option C
  4. Quick Check:

    Init-only set only in initializer, not later [OK]
Hint: Set init-only properties inside braces only [OK]
Common Mistakes:
  • Trying to set init-only property after creation
  • Thinking init-only means readonly
  • Ignoring object initializer syntax
5. Given this record declaration:
public record Book {
    public string Title { get; init; }
    public string Author { get; init; }
}

var book1 = new Book { Title = "C# Guide", Author = "Jane" };
var book2 = book1 with { Author = "John" };

Console.WriteLine(book2.Title + ", " + book2.Author);

What is the output?
hard
A. C# Guide, John
B. C# Guide, Jane
C. Compile-time error due to init-only setter
D. Runtime exception

Solution

  1. Step 1: Understand 'with' expression on records

    The 'with' expression creates a copy of book1 but allows changing init-only properties during creation of the new object.
  2. Step 2: Analyze the output

    book2 copies Title as "C# Guide" and sets Author to "John". Printing shows "C# Guide, John".
  3. Final Answer:

    C# Guide, John -> Option A
  4. Quick Check:

    'with' allows changing init-only during copy [OK]
Hint: 'with' can set init-only properties on new record copies [OK]
Common Mistakes:
  • Thinking 'with' cannot change init-only properties
  • Expecting compile error on 'with' usage
  • Confusing init-only with immutable fields