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
Using Init-Only Setters in C#
📖 Scenario: You are creating a simple program to store information about a book. Once the book's details are set, they should not be changed later.
🎯 Goal: Build a C# class Book with properties that can only be set during object creation using init-only setters. Then create an instance of Book and display its details.
📋 What You'll Learn
Create a class called Book with three properties: Title, Author, and Year.
Use init accessors for all three properties.
Create an instance of Book with the title "The Great Gatsby", author "F. Scott Fitzgerald", and year 1925.
Print the book details in the format: "Title: The Great Gatsby, Author: F. Scott Fitzgerald, Year: 1925".
💡 Why This Matters
🌍 Real World
Init-only setters are useful when you want to create objects that are immutable after creation, such as configuration settings, data transfer objects, or domain models.
💼 Career
Understanding init-only setters helps you write safer and more predictable C# code, which is valuable in professional software development to avoid bugs caused by unintended changes.
Progress0 / 4 steps
1
Create the Book class with properties
Create a class called Book with three public properties: Title (string), Author (string), and Year (int). Use auto-properties with get and init accessors for each property.
C Sharp (C#)
Hint
Use public string Title { get; init; } to create a property with an init-only setter.
2
Create an instance of Book with init-only setters
Create a variable called myBook and assign it a new Book object. Set the Title to "The Great Gatsby", Author to "F. Scott Fitzgerald", and Year to 1925 using object initializer syntax.
C Sharp (C#)
Hint
Use new Book { Title = "The Great Gatsby", Author = "F. Scott Fitzgerald", Year = 1925 } to create the object.
3
Try to change a property after initialization (optional test)
Add a line after creating myBook that tries to set myBook.Title to "New Title". This should cause a compile-time error because the setter is init-only. Comment out this line to keep the program running.
C Sharp (C#)
Hint
Init-only setters prevent changes after object creation. Comment out the line to avoid errors.
4
Print the book details
Write a Console.WriteLine statement to print the book details in this exact format: "Title: The Great Gatsby, Author: F. Scott Fitzgerald, Year: 1925" using the myBook properties.
C Sharp (C#)
Hint
Use Console.WriteLine($"Title: {myBook.Title}, Author: {myBook.Author}, Year: {myBook.Year}") to print the details.
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
Step 1: Understand init-only setters
Init-only setters allow properties to be set only when the object is created, not after.
Step 2: Compare options
Only To allow setting properties only during object creation correctly describes this behavior; others are unrelated or incorrect.
Final Answer:
To allow setting properties only during object creation -> Option B
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
Step 1: Recall init-only syntax
Init-only properties use init instead of set to allow setting only during initialization.
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.
Final Answer:
public string Name { get; init; } -> Option A
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
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.
Step 2: Analyze the code
After creating p with Name = "Alice", the code tries to assign p.Name = "Bob" outside initialization, which is invalid.
Final Answer:
Compile-time error -> Option D
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
Step 1: Check how init-only properties are set
Init-only properties must be set during object creation using an initializer, not after.
Step 2: Analyze the code
The code creates car with default constructor, then tries to set Model property outside initialization, which is invalid.
Final Answer:
Cannot assign init-only property outside object initializer -> Option C
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
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.
Step 2: Analyze the output
book2 copies Title as "C# Guide" and sets Author to "John". Printing shows "C# Guide, John".
Final Answer:
C# Guide, John -> Option A
Quick Check:
'with' allows changing init-only during copy [OK]
Hint: 'with' can set init-only properties on new record copies [OK]