正确使用C#属性

Nob*_*ody 13 c# get properties set

private List<Date> _dates;

public List<Date> Dates
{
    get { return _dates; }
    set { _dates = value; }
}
Run Code Online (Sandbox Code Playgroud)

要么

public List<Date> Dates
{
    get;        
    set;    
}
Run Code Online (Sandbox Code Playgroud)

我一直用前者,是不正确还是不好的做法?我从未想过我可以使用第二个选项.我喜欢让我的封装变量以下划线开头,所以我可以将它们与方法参数区分开来.而我总是那样做.

是否有可能使用第一个选项会导致额外的List<Date>对象被实例化,然后整个_dates被替换value,或者它是否比这更聪明?

此外,哪个是行业中最突出的还是完全主观的?

Jus*_*ner 19

如果您需要为getter/setter添加某种逻辑,请使用前者.

否则使用后者.它使事情变得更加清洁.您还可以使用自动属性实现只读属性:

public List<Date> Dates { get; private set; }
Run Code Online (Sandbox Code Playgroud)

或者,如果您不希望人们通过属性向列表中添加任何项目,您可以使用以前的语法:

private List<Date> _dates = new List<Date>();
private ReadOnlyCollection<Date> _readOnlyDates =
    new ReadOnlyCollection<Date>(_dates);

public ReadOnlyCollection<Date> Dates
{
    get { return _readOnlyDates; }
}
Run Code Online (Sandbox Code Playgroud)


Yur*_*ich 7

两者基本相同,因为.NET编译自动属性..NET 3.5提供了自动属性.

  • @Chad C#3.0,但是.NET 3.5. (2认同)

Fra*_*ank 7

它们在内部编译形式中是等效的,除了您不能以第二种形式访问编译器生成的私有变量.

从代码效率的角度来看,它们也是等价的,即时编译器通常直接访问私有变量而没有调用访问函数的开销(在运行时环境检查了可访问性等之后).

从编码的角度来看,我更喜欢第二个版本,它更紧凑(写入少,阅读少).

第二种语法是在C#3.0中引入的.因此第一个变体将与旧编译器更兼容.