不,这不是另一个问题,为什么我们应该在C#中使用属性:)我想知道
之间的主要区别是什么private string _name;
public string Name {
get { return _name; }
set { _name = value; }
}
和
public string Name { get; set; }
我知道随着.NET 3.0的引入,您可以使用后者,但我仍然会找到使用前者的代码片段。
我有兴趣了解它们之间的差异(如果有的话)(除了我浪费两倍的空间),风格以及底层实现的工作方式。
我想知道你的意见是什么,你在代码中使用了哪一个。
谢谢你,编码愉快!
答案 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; }