我对自动实现的属性相当新,我发现它们非常简单,但在微软网站上它声明:
在C#3.0及更高版本中,当属性访问器中不需要其他逻辑时,自动实现的属性使属性声明更简洁。 它们还使客户端代码能够创建对象。当您声明属性时,如下例所示,编译器会创建一个私有的匿名支持字段,只能通过属性的get和set访问器进行访问。
任何人都可以解释以下声明对于自动实现的属性的实际含义:“它们还使客户端代码能够创建对象。”?
我无法弄清楚这意味着什么。
感谢。
答案 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" } );