c#自动实现属性

本文关键字:属性 实现 | 更新日期: 2023-09-27 18:04:09

我对自动实现的属性相当陌生,我发现它们大多数都很直接,但在微软网站上它说:

在c# 3.0及以后的版本中,当属性访问器中不需要额外的逻辑时,自动实现的属性使属性声明更加简洁。它们还允许客户端代码创建对象。当你像下面的例子那样声明一个属性时,编译器会创建一个私有的、匿名的支持字段,这个字段只能通过属性的get和set访问器来访问。

—自动实现属性(MSDN)

谁能解释一下下面这句话对于自动实现的属性到底是什么意思:它们还使客户端代码能够创建对象。"?

我不明白这是什么意思。

谢谢。

c#自动实现属性

我认为这指的是对象初始化器语法,尽管为什么会这样还不清楚。自动实现的属性和对象初始化器是分开的,不应该以这种方式联系在一起。

那么,有一个像这样的类:

public class Cat
{
    // Auto-implemented properties.
    public int Age { get; set; }
    public string Name { get; set; }
}

你可以创建这样的对象:

Cat cat = new Cat { Age = 10, Name = "Fluffy" };

注意:

正如注释所说(以及MSDN页面上关于对象初始化器的声明),您可以对任何可访问的字段或属性使用对象初始化器语法。同样,MSDN页面上自动实现的属性甚至提到了对象创建,这似乎是一个糟糕的文档决定。

不幸的是,MSDN页面上的描述很糟糕。

对象初始化语法(new Foo { X = 10, Y = 20 })是与自动实现的属性完全可分离的

对象初始化器可以与任何可设置的属性或字段一起使用(当"主属性"为只读时,甚至有语法可以改变"子属性");你不必为此使用自动实现的属性。

虽然所有这些功能一起工作很好,但我认为至少分别学习它们是有用的。例如,自动实现的属性可以在c# 2中引入,而不需要对象初始化器——反之亦然。

我想他们所说的

"它们还使客户端代码能够创建对象。"

是客户端代码可以初始化一个新的ref类型对象或为auto属性分配一个值类型对象,而不必创建一个私有字段来保存数据。

Oded有值类型的示例,因此让我们扩展他的Cat类

private class Cat
{
    // Auto-implemented properties.
    public int Age { get; set; }
    public string Name { get; set; }
    public List<Cat> Kittens { get; set; }
}
Cat cat = new Cat { Age = 10, Name = "Fluffy" }; //borrowed fluffy for this example
cat.Kittens = new List<Cat>();
cat.Kittens.Add( new Cat() { Age = 0, Name = "Pinky" } );
cat.Kittens.Add( new Cat() { Age = 0, Name = "Blinky" } );

您可以通过自动实现属性值访问另一个属性值来为getter函数添加逻辑

 public string Status
    {
        get { return DeactivateDate != null ? "InActive" : "Active"; }
        private set { }
    }