c#属性用法

本文关键字:用法 属性 | 更新日期: 2023-09-27 18:15:17

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

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

public string Name { get; set; }

我知道,随着。net 3.0的引入,您可以使用后者,但我仍然发现使用前者的代码片段。

我很想知道它们之间在性能(除了我浪费了两倍的空间),风格和底层实现如何工作方面的差异(如果有的话)。

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

谢谢你,快乐的编码!

c#属性用法

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

不,是c# 3的引入。你可以瞄准。net 2,并且仍然使用自动实现的属性。区分你正在使用的c#版本和你要瞄准的。net版本是很重要的。

但是您使用的两个代码段之间没有明显的区别,除了当使用自动实现的属性时,没有其他源代码可以访问该字段。该字段被赋予一个"不可言说的名称"(在IL中有效,但在c#中无效)。(当您使用自动实现的属性时,编译器也会将[CompilerGenerated]属性应用于该属性,但这很少重要。)

在时间和内存方面没有性能差异。

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

在c# 3.0及以后的版本中,自动实现的属性使当不需要附加逻辑时,属性声明更简洁在属性访问器中。它们还支持创建客户端代码对象。如下所示声明属性时例如,编译器创建一个私有的、匿名的支持字段

从你

我很想知道它们之间的区别是什么(如果有的话)(除了我浪费了两倍的时间

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

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

它们都会给你相同的结果,但你应该意识到一个事实,即属性的"手动"实现使你能够控制设置什么和接收什么,这是属性背后的主要思想,例如:

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

而对于"auto"实现属性,你只是有一个普通的退化属性:

public string Name { get; set; }