Auto-implemented properties were introduced in C# 3.
An auto-implemented property is declared with an empty getter and setter (accessors):
public bool IsValid { get; set; }
When an auto-implemented property is written in your code, the compiler creates a private anonymous field that can only be accessed through the property's accessors.
The above auto-implemented property statement is equivalent to writing this lengthy code:
private bool _isValid;
public bool IsValid
{
get { return _isValid; }
set { _isValid = value; }
}
Auto-implemented properties cannot have any logic in their accessors, for example:
public bool IsValid { get; set { PropertyChanged("IsValid"); } } // Invalid code
An auto-implemented property can however have different access modifiers for its accessors:
public bool IsValid { get; private set; }
C# 6 allows auto-implemented properties to have no setter at all (making it immutable, since its value can be set only inside the constructor or hard coded):
public bool IsValid { get; }
public bool IsValid { get; } = true;
For more information on initializing auto-implemented properties, read the Auto-property initializers documentation.