2

不,这不是关于为什么我们应该在 C# 中使用属性的另一个问题 :) 我想知道两者之间的主要区别是什么

private string _name;
public string Name  {
    get { return _name; }
    set { _name = value; } 
}

public string Name { get; set; }

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

我很想知道它们在性能(除了我浪费了两倍的空间这一事实之外)、风格和底层实现的工作方式上有什么区别(如果有的话)。

我也想知道您的意见以及您在代码中使用哪一个。

谢谢你,编码愉快!

4

3 回答 3

9

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

不,它与 C# 3 的引入有关。您可以针对 .NET 2 并仍然使用自动实现的属性。区分您使用的 C# 版本和您所针对的 .NET 版本非常重要。

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

时间或内存没有性能差异。

于 2013-05-26T08:26:13.667 回答
4

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

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

来自你

我很想知道它们在性能(除了我浪费了两倍的空间)、风格和底层实现的工作方式方面有什么区别(如果有的话)。

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

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

于 2013-05-26T08:27:43.457 回答
0

它们都会为您提供相同的结果,但您应该意识到,“手动”实现属性使您能够控制设置的内容和接收的内容,这是属性背后的主要思想,例如:

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

使用“自动”实现的属性时,您只是拥有一个普通的退化属性:

public string Name { get; set; }
于 2013-05-26T22:04:17.267 回答