The set keyword (C# Reference)

The set keyword defines an accessor method in a property or indexer that assigns a value to the property or the indexer element. For more information and examples, see Properties, Automatically implemented properties, and Indexers.

For simple cases in which a property's get and set accessors perform no other operation than setting or retrieving a value in a private backing field, you can use automatically implemented properties. The following example implements Hours as an automatically implemented property.

class TimePeriod3
{
    public double Hours { get; set; }
}

Important

Automatically implemented properties aren't allowed for interface property declarations or the implementing declaration for a partial property. The compiler interprets syntax matching an automatically implemented property as the declaring declaration, not an implementing declaration.

You might find that you need to implement one of the accessor bodies. The field keyword, added as a preview feature in C# 13 declares a field backed property. You can use a field backed property to let the compiler generate one accessor while you write the other by hand. You use the field keyword to access the compiler synthesized backing field:

class TimePeriod4
{
    public double Hours {
        get;
        set => field = (value >= 0)
            ? value
            : throw new ArgumentOutOfRangeException(nameof(value), "The value must not be negative");
    }
}

Important

The field keyword is a preview feature in C# 13. You must be using .NET 9 and set your <LangVersion> element to preview in your project file in order to use the field contextual keyword.

You should be careful using the field keyword feature in a class that has a field named field. The new field keyword shadows a field named field in the scope of a property accessor. You can either change the name of the field variable, or use the @ token to reference the field identifier as @field. You can learn more by reading the feature specification for the field keyword.

Often, the set accessor consists of a single statement that assigns a value, as it did in the previous example. You can implement the set accessor as an expression-bodied member. The following example implements both the get and the set accessors as expression-bodied members.

class TimePeriod2
{
    private double _seconds;

    public double Seconds
    {
        get => _seconds;
        set => _seconds = value;
    }
}

The following example defines both a get and a set accessor for a property named Seconds. It uses a private field named _seconds to back the property value.

class TimePeriod
{
    private double _seconds;

    public double Seconds
    {
        get { return _seconds; }
        set
        {
            if (value < 0)
            {
                throw new ArgumentOutOfRangeException(nameof(value), "The value of the time period must be non-negative.");
            }
            _seconds = value;
        }
    }
}

C# language specification

For more information, see the C# Language Specification. The language specification is the definitive source for C# syntax and usage.

See also