C#自动实现的属性

时间:2011-08-02 12:29:30

标签: c# .net

我对自动实现的属性相当新,我发现它们非常简单,但在微软网站上它声明:

  

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

     

- Auto-Implemented Properties (MSDN)

任何人都可以解释以下声明对于自动实现的属性的实际含义:“它们还使客户端代码能够创建对象。”?

我无法弄清楚这意味着什么。

感谢。

3 个答案:

答案 0 :(得分:6)

我认为这是指object initializer语法,但为什么会出现这种情况并不清楚。自动实现的属性和对象初始值设定项是不同的东西,不应该以这种方式链接在一起。

所以,有一个看起来像这样的类:

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页面甚至提到对象创建的事实似乎是一个糟糕的文档决定。

答案 1 :(得分:4)

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

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

对象初始值设定项可以与任何可设置属性或字段一起使用(当“主要属性”为只读时,甚至还有用于改变“子属性”的语法);您不必为此使用自动实现的属性。

虽然所有这些功能一起工作很好,但我相信至少分别学习它们是有用的。例如,自动实现的属性可能是在没有对象初始化器的情况下在C#2中引入的 - 反之亦然。

答案 2 :(得分:1)

我认为他们的意思是

  

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

客户端代码可以初始化一个新的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" } );