Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#自动实现的属性_C#_.net - Fatal编程技术网

C#自动实现的属性

C#自动实现的属性,c#,.net,C#,.net,我对自动实现的属性相当陌生,在大多数情况下,我发现它们非常简单,但在Microsoft站点中,它指出: 在C#3.0及更高版本中,当属性访问器中不需要额外的逻辑时,自动实现的属性使属性声明更加简洁它们还允许客户端代码创建对象。当您如以下示例所示声明属性时,编译器会创建一个私有的匿名备份字段,该字段只能通过属性的get和set访问器访问 -- 有人能解释一下以下语句对于自动实现属性的实际含义吗:“它们还允许客户端代码创建对象。” 我不明白这意味着什么 谢谢。我相信这指的是语法,但原因尚不清楚。自动

我对自动实现的属性相当陌生,在大多数情况下,我发现它们非常简单,但在Microsoft站点中,它指出:

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

--

有人能解释一下以下语句对于自动实现属性的实际含义吗:“它们还允许客户端代码创建对象。

我不明白这意味着什么

谢谢。

我相信这指的是语法,但原因尚不清楚。自动实现的属性和对象初始值设定项是分开的,不应该以这种方式链接在一起

因此,对于一个如下所示的类:

public class Cat
{
    // Auto-implemented properties.
    public int Age { get; set; }
    public string Name { get; set; }
}
Cat cat = new Cat { Age = 10, Name = "Fluffy" };
您可以创建如下对象:

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页面上的描述不正确

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

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


虽然所有这些特性一起工作很好,但我相信至少单独了解它们是有用的。例如,在没有对象初始值设定项的情况下,在C#2中可以引入自动实现的属性,反之亦然

“它们还允许客户端代码创建对象。”

客户端代码可以初始化一个新的ref-type对象,或者将一个value-type对象分配给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" } );
私有类Cat
{
//自动实现的属性。
公共整数{get;set;}
公共字符串名称{get;set;}
公共列表小猫{get;set;}
}
猫=新猫{Age=10,Name=“Fluffy”}//在这个例子中借用了fluffy
cat.Kittens=新列表();
添加(new cat(){Age=0,Name=“Pinky”});
添加(new cat(){Age=0,Name=“Blinky”});

您可以对公共字段和常规属性执行相同的操作。基本上,任何可以用
Foo.x=y设置的东西行。@leppie-true。从MSDN:
对象初始值设定项允许您将值分配给任何可访问的字段或属性
。并使用普通属性(私有字段、公共设置项)。。。因此,虽然statation是正确的,但对于非自动属性也是正确的。@Oded:Downvote在编辑后被删除,而我认为您和jon提到的初始值设定项语法是错误的,答案是让OP相信它们之间确实有联系(除了在声明类和创建新实例的过程中,它们在最小化代码方面都很有用)类似:自动属性的真正好处:数据绑定(当然,如果没有自定义的
类型描述符
,它在字段上不起作用)。答案是,这只是MSDN的一个蹩脚的解释,不幸的是,我觉得MSDN中有很多糟糕的解释。再一次,这里没有汽车属性的独特之处。我认为Jon Skeet在这里赚钱:这只是一个措辞非常糟糕的文档。不知道初始化只读属性的属性。这很漂亮。@Anton:我主要是在初始化集合时看到它的:Foo f=new Foo{SomeCollection={new Item(),new Item()};
。这里的
SomeCollection`属性是只读的,但是返回一个可以添加到其中的
列表。是的,我认为它是类似的-但是集合是特殊情况的,不是?(无论是
ICollection
还是任何有公共
Add
的东西,我都忘了是哪一个:P)编辑使那
IEnumerable
和一个公共
Add
@Anton:Yup,IEnumerable和Add是。我的观点是它的语法是相同的:
={…}
,而不是
=value