C#属性用法

时间:2013-05-26 08:21:51

标签: c# properties coding-style implementation

不,这不是另一个问题,为什么我们应该在C#中使用属性:)我想知道

之间的主要区别是什么
private string _name;
public string Name  {
    get { return _name; }
    set { _name = value; } 
}

public string Name { get; set; }

我知道随着.NET 3.0的引入,您可以使用后者,但我仍然会找到使用前者的代码片段。

我有兴趣了解它们之间的差异(如果有的话)(除了我浪费两倍的空间),风格以及底层实现的工作方式。

我想知道你的意见是什么,你在代码中使用了哪一个。

谢谢你,编码愉快!

3 个答案:

答案 0 :(得分:9)

  

我知道随着.NET 3.0的引入,你可以使用后者

不,这是C#3的引入。您可以定位.NET 2并仍然使用自动实现的属性。区分您正在使用的C#版本和您要定位的.NET版本非常重要。

但是您使用的两个片段之间没有显着差异,除了使用自动实现的属性时,没有其他源代码可以访问该字段。该字段被赋予“无法形容的名称”(一个在IL中有效但在C#中无效)。 (当您使用自动实现属性时,编译器也会将[CompilerGenerated]属性应用于属性,但这很少重要。)

时间或记忆都没有性能差异。

答案 1 :(得分:4)

如您所知,此功能称为Auto-Implemented Properties

  

在C#3.0及更高版本中,自动实现的属性生成   当不需要额外的逻辑时,属性声明更简洁   在物业访问者。它们还使客户端代码能够创建   对象。声明属性时,如下所示   例如,编译器会创建一个私有的匿名支持字段   只能通过属性的get和set访问器访问。

来自你

  

我很想知道它们之间的区别(如果有的话)   他们的表现(除了我浪费两倍的事实   空间),风格以及底层实现的工作原理。

在您的情况下,它们之间的差异和性能没有问题。因为在设置或检索值时您没有做任何事情(任何验证等)。

作为提示,您可以在set/get修饰符中设置断点,但不能在auto属性中设置。另外,您必须在普通属性中定义一个字段(在您的情况下为_name

答案 2 :(得分:0)

他们都会给你相同的结果,但你应该知道一个属性的“手动”实现使你能够控制设置和接收的内容,这是属性背后的主要思想,例如:

private string _name;
public string Name  {
    get { return _name; }
    set { if(_name.Length > 3) _name = value; } 
}

使用“auto”实现的属性时,您只有一个 plain 退化属性:

public string Name { get; set; }