c#构造函数与自动属性和对象初始值设定项

c#构造函数与自动属性和对象初始值设定项,c#,automatic-properties,object-initializers,C#,Automatic Properties,Object Initializers,我经常使用auto属性,但我越来越远离在构造函数中初始化只读备份字段来设置类。我删除了所有setter,只有在属性明确需要setter时才添加back 我发现这使我的类在面向对象方面更加健壮和优雅,我为自己没有更早地这样做而责备自己 我发现构造函数在c#代码示例中通常没有得到充分的使用,我认为自动属性和对象初始值设定项是其中的一个重要部分,所以我的问题是,为什么c#团队会推出这样的特性,而不是更多地关注交付特性以推动最佳实践。一般来说,我认为写糟糕的代码太容易了,而且我相信可以做更多的工作来帮助

我经常使用auto属性,但我越来越远离在构造函数中初始化只读备份字段来设置类。我删除了所有setter,只有在属性明确需要setter时才添加back

我发现这使我的类在面向对象方面更加健壮和优雅,我为自己没有更早地这样做而责备自己


我发现构造函数在c#代码示例中通常没有得到充分的使用,我认为自动属性和对象初始值设定项是其中的一个重要部分,所以我的问题是,为什么c#团队会推出这样的特性,而不是更多地关注交付特性以推动最佳实践。一般来说,我认为写糟糕的代码太容易了,而且我相信可以做更多的工作来帮助程序员从对话中写出好代码,我相信C#团队理解,他们已经让编写可变类型变得更容易了,同时没有为不可变类型提供类似的好处。这并不是说随着时间的推移,他们让不变性变得更加困难——他们只是没有让它变得更容易。。。除了匿名类型之外,匿名类型是不可变的,但有其他各种缺点。我当然不希望自动属性被拿走——在适当的地方,它们真的很有用。我只想为只读属性提供等效属性(允许仅在构造函数中设置它们)

我发现C#4的命名参数和可选参数使构建不可变类型实例变得更容易——您仍然可以获得对象初始值设定项的许多好处,而不存在可变性的缺点。只需为类型中真正可选的方面提供默认值,其余部分作为强制构造函数参数,调用者就可以做他们想做的事情——使用命名参数来增加清晰度

不幸的是,集合初始值设定项是一个更难破解的难题。我希望看到可以使用不可变集合的“链接”初始值设定项,这样编译器就可以创建对链接在一起的
Plus
的调用,而不是在同一个实例上重复调用
Add

ImmutableList<string> x = new ImmutableList<string> { "a", "b", "c" };
但这确实让我感觉脏兮兮的,当这是我真正的意图时,并没有让它真正不变

基本上,我是说我感觉到了你的痛苦——我很确定C#团队也感觉到了。但要记住,他们的资源有限,设计一门语言非常困难

你可能会发现这很有趣——与Eric Lippert、Mads Torgersen、Neal Gafter(和我)进行了一次很棒的小组讨论,我对C#5的建议在另一个视频中

我发现构造函数在c#代码示例中通常没有得到充分的使用,我认为自动属性和对象初始值设定项是其中的一个重要部分

如果你的对象有很多属性,你显然不想从构造函数中初始化它们。必须传递4或5个以上的参数对可读性来说是非常糟糕的(尽管Intellisense使其易于编写)。此外,如果您只想初始化一些属性并对其他属性使用默认值,则需要许多构造函数重载,或者必须将这些默认值显式传递给构造函数

在这种情况下,对象初始值设定项非常方便,只要属性不是只读的(但正如Jon指出的,C#4中的可选参数是一个很好的选择)

为什么c#团队推出这样的功能,而不是更多地关注交付功能,从而推动最佳实践

我认为引入对象初始值设定项是因为它们是Linq所必需的:没有它们,您无法创建匿名类型。至于自动属性,它们不那么重要,但它可能很容易实现,而且对于只封装字段的属性来说,它可以成为一个实时的节省器

我删除了所有setter,只有在属性明确需要setter时才添加back。 我发现这使我的类在面向对象方面更加健壮和优雅

我完全同意你的看法。我面对的是遗留代码,其中有许多用于某些类层次结构的对象初始值设定项。我需要添加一些属性,然后在查找类实例的所有构造位置时感到头疼。 这是我第一次向你屈服。现在我需要再添加一个属性。这太疯狂了


为了限制对象初始值设定项的使用,我删除了无参数构造函数。

如果不变性变得更容易,那当然更好了。为了保证完全不变性,您必须完全控制所包含的所有类。例如,您说过匿名类型是不可变的,但是我在其中添加了一个数组和一个可变列表,并且能够修改它们。如果你有一个今天不可变的可公开访问的成员,明天它就可以变了,结果你的不可变性就被破坏了。Thx,我来看看那些视频。在阅读了更多内容后,F#似乎正在以一种更好的方式处理这些事情,默认情况下锁定对象,并在需要时允许可变性。我想遗产会阻止c#团队朝这个方向前进。你对F#vs C#Jon有什么看法?@TT:我在F#方面没有我想要的那么多经验,但我确实喜欢F#做的各种事情,当然。我提出的许多关于C#5的建议都是基于F#。我百分之百同意你对私人二传的看法。对我来说,使用
propg
+
tab
+
tab
而不是创建一个正确的只读备份字段太容易了。Surly
public string Name{get;readonly set;}
(听起来很奇怪)会进入C#5吗?@Alex:这正是我之前建议的:)不过我不知道它是否会进入C#5。希望过一会儿我们能开始看到第一位。不是所有类型都必须是不变的。在构造函数中获取可变类型,然后将其复制到私有成员,这是非常常见的(也是有益的)。然后它被c屏蔽
ImmutableList<string> x = new ImmutableList<string>().Plus("a")
                                                     .Plus("b")
                                                     .Plus"(c");
public string Name { get; private set; }