c#自动实现属性
本文关键字:属性 实现 | 更新日期: 2023-09-27 18:04:09
我对自动实现的属性相当陌生,我发现它们大多数都很直接,但在微软网站上它说:
在c# 3.0及以后的版本中,当属性访问器中不需要额外的逻辑时,自动实现的属性使属性声明更加简洁。它们还允许客户端代码创建对象。当你像下面的例子那样声明一个属性时,编译器会创建一个私有的、匿名的支持字段,这个字段只能通过属性的get和set访问器来访问。
—自动实现属性(MSDN)
谁能解释一下下面这句话对于自动实现的属性到底是什么意思:它们还使客户端代码能够创建对象。"?
我不明白这是什么意思。
谢谢。
我认为这指的是对象初始化器语法,尽管为什么会这样还不清楚。自动实现的属性和对象初始化器是分开的,不应该以这种方式联系在一起。
那么,有一个像这样的类:
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 { }
}