使用 C# 速记语法时,如何解决字段和属性之间的歧义

本文关键字:字段 解决 属性 歧义 之间 语法 何解决 使用 | 更新日期: 2023-09-27 18:37:04

我无法弄清楚如何在没有不匹配的变量或完全不同的名称的情况下使用速记语法。

字段和属性之间存在歧义,但是如果我以不同的方式命名它们,我就不能使用速记get; set;语法。我该如何解决这个问题?

/// <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
    }
}

使用 C# 速记语法时,如何解决字段和属性之间的歧义

声明自动实现的属性时:

public string Name { get; set; } 
无需

创建支持字段。编译器代表您为属性创建一个隐藏的(不可访问的)支持字段,该字段只能通过属性的getset访问器进行访问。你甚至不必考虑它。

因此,从上面的代码中,只需删除自动实现的属性重复的字段即可。

请参阅:https://msdn.microsoft.com/en-us/library/bb384054.aspx

声明自动属性时,编译器会为您生成支持字段。

即当您声明时

公共字符串名称 { get; set; }

编译器将有一个类似

private string name; //Your backing Field.you don't need it manually.
 public string Name
 {
    get
    {
        return this.name;
    }
    set
    {
        this.name = value;
    }
}