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

使用C#速记语法时,如何解决字段和属性之间的歧义?,c#,getter-setter,shorthand,C#,Getter Setter,Shorthand,如果没有不匹配或名称完全不同的变量,我无法理解如何使用速记语法 字段和属性之间存在歧义,但是如果我对它们进行不同的命名,我就不能使用缩写get;设置语法。我该如何解决这个问题 /// <summary> /// A customer object /// </summary> public class Customer { // These are fields private string name; private string address

如果没有不匹配或名称完全不同的变量,我无法理解如何使用速记语法

字段和属性之间存在歧义,但是如果我对它们进行不同的命名,我就不能使用缩写get;设置语法。我该如何解决这个问题

/// <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
    }
}
//
///顾客对象
/// 
公共类客户
{
//这些是田地
私有字符串名称;
私有字符串地址;
私人城市;
私人弦省;
专用字符串后代码;
私有字符串电话号码;
私有字符串电子邮件地址;
//这些都是属性
公共字符串名称{get;set;}
公共字符串地址{get;set;}
公共字符串city{get;set;}
公共字符串省{get;set;}
公共字符串postalCode{get;set;}
公共字符串phoneNumber{get;set;}
公共字符串电子邮件地址{get;set;}
//这是一个构造函数
公共客户(字符串名称、字符串地址、字符串城市、字符串省份、字符串邮政编码、字符串电话号码、字符串电子邮件地址)
{
name=name;//无法确定名称是字段还是属性
address=address;//无法确定地址是字段还是属性
city=city;//无法确定city是字段还是属性
省=省;//无法确定省是字段还是属性
postalCode=postalCode;//无法确定postalCode是字段还是属性
phoneNumber=phoneNumber;//无法确定phoneNumber是字段还是属性
emailAddress=emailAddress;//无法确定emailAddress是字段还是属性
}
}

当您声明自动实现的属性时:

public string Name { get; set; } 
无需创建支持字段。编译器代表您为属性创建一个隐藏(不可访问)支持字段,该字段只能通过属性的
get
set
访问器访问。你甚至不必去想它

因此,从上面的代码中,只需删除由自动实现的属性复制的字段


声明自动实现的属性时,请参见:

public string Name { get; set; } 
无需创建支持字段。编译器代表您为属性创建一个隐藏(不可访问)支持字段,该字段只能通过属性的
get
set
访问器访问。你甚至不必去想它

因此,从上面的代码中,只需删除由自动实现的属性复制的字段


请参阅:

当您声明Auto属性时,编译器将为您生成支持字段

当你申报时

公共字符串名称{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;
    }
}

声明Auto属性时,编译器将为您生成支持字段

当你申报时

公共字符串名称{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;
    }
}

不创建支持字段是不好的做法吗?@Ben:不。公开暴露字段是不好的做法。但是,如果字段的设置和检索没有逻辑(例如,一个简单地设置字段并获取字段的标准属性),C#的设计者认识到需要支持字段的语法冗余,因此,我们创建了一个方便的简写法,无需在代码中显式地编写。如果合适,使用自动道具。编译器给你的错觉是没有支持字段,这是一件好事,因为它消除了代码中不必要的噪音。@Ben:说得清楚,自动道具确实有支持字段。你不需要声明它,也无法访问它,但它仍然存在。不创建备份字段是一种不好的做法吗?@Ben:不。公开暴露字段是一种不好的做法。但是,如果字段的设置和检索没有逻辑(例如,一个简单地设置字段并获取字段的标准属性),C#的设计者认识到需要支持字段的语法冗余,因此,我们创建了一个方便的简写法,无需在代码中显式地编写。如果合适,使用自动道具。编译器给你的错觉是没有支持字段,这是一件好事,因为它消除了代码中不必要的噪音。@Ben:说得清楚,自动道具确实有支持字段。您不需要声明它,也无法访问它,但它仍然存在。