They are exactly the same, the compiler generates the backing field for you, as seen here
You can also read more about Auto Properties from the documentation
In C# 3.0 and later, auto-implemented properties make
property-declaration more concise when no additional logic is required
in the property accessors. They also enable client code to create
objects. When you declare a property as shown in the following
example, the compiler creates a private, anonymous backing field that
can only be accessed through the property's get and set accessors.
Before
public int ival {get; set;}
Compiler generated
[CompilerGenerated]
private int <ival>k__BackingField;
public int ival
{
[CompilerGenerated]
get
{
return <ival>k__BackingField;
}
[CompilerGenerated]
set
{
<ival>k__BackingField = value;
}
}