Search code examples
c#getter-settershorthand

How do I solve ambiguities between fields and properties when using C# shorthand syntax?


I cannot figure out how to use the shorthand syntax without having variables that don't match or completely different names.

There is ambiguity between fields and properties, but if I name them differently I can't use the shorthand get; set; syntax. How do I fix this?

/// <summary>
/// A customer object
/// </summary>
public class Customer
{
    // These are fields
    private string name;
    private string address;
    private string city;
    private string province;
    private string postalCode;
    private string phoneNumber;
    private string emailAddress;

    // These are properties
    public string name { get; set; }
    public string address { get; set; }
    public string city { get; set; }
    public string province { get; set; }
    public string postalCode { get; set; }
    public string phoneNumber { get; set; }
    public string emailAddress { get; set; }

    // This is a constructor
    public Customer(string Name, string Address, string City, string Province, string PostalCode, string PhoneNumber, string EmailAddress)
    {
        name = Name;                    // Cannot determine if name is field or property
        address = Address;              // Cannot determine if address is field or property
        city = City;                    // Cannot determine if city is field or property
        province = Province;            // Cannot determine if province is field or property
        postalCode = PostalCode;        // Cannot determine if postalCode is field or property
        phoneNumber = PhoneNumber;      // Cannot determine if phoneNumber is field or property
        emailAddress = EmailAddress;    // Cannot determine if emailAddress is field or property
    }
}

Solution

  • When you declare an auto-implemented property:

    public string Name { get; set; } 
    

    It is not necessary to create a backing field. The compiler creates a hidden (inaccessible) backing field for the property on your behalf that can only be accessed through the property's get and set accessors. You don't have to even think about it.

    So, from your code above, just remove the fields that are duplicated by auto-implemented properties.

    See: https://msdn.microsoft.com/en-us/library/bb384054.aspx