c#constructors vs auto-properties和object initializers

ter*_*tyl 8 c# automatic-properties object-initializers

我已经使用了很多自动属性但是我已经越来越远离那些使用构造函数中初始化的readonly支持字段设置类.我删除了所有的setter,只有在属性明显需要setter的情况下才添加.

我发现这使得我的课程更加健壮和优雅OO明智而且我正在踢我自己不早点这样做.

我发现构造函数在c#代码示例中一般都没有得到充分利用,我认为自动属性和对象初始化程序是其中的一个重要部分,所以我的问题是为什么c#团队推送这样的功能而不是更多地关注提供最佳功能的功能实践更多.一般来说,我认为编写糟糕的代码太容易了,并且相信可以帮助编码人员编写好的代码

Jon*_*eet 13

通过对话,我相信C#团队理解他们更容易编写可变类型而不为不可变类型提供类似的好处.并不是说他们随着时间的推移变得更难以变得更难 - 他们只是没有让它变得更容易......除了匿名类型,这是不可改变的,但有其他各种缺点.我当然不希望将自动属性带走 - 在适当的地方,它们真的很有用.我只是想拥有readonly属性的等价物(允许它们只在构造函数中设置).

我发现C#4的命名参数和可选参数使得构造不可变类型实例变得更容易 - 你仍然可以获得对象初始化器的许多好处,而没有可变性缺点.只需为您的类型的方面提供真正可选的默认值,将其余部分保留为必需的构造函数参数,并且调用者可以执行他们想要的操作 - 使用命名参数来增加清晰度.

不幸的是,收集初始化器是一个更难以破解的坚果.我希望看到"链式"初始化器可以使用不可变集合,因此Add编译器可以创建Plus链接在一起的调用,而不是重复调用同一个实例:

ImmutableList<string> x = new ImmutableList<string> { "a", "b", "c" };
Run Code Online (Sandbox Code Playgroud)

会去:

ImmutableList<string> x = new ImmutableList<string>().Plus("a")
                                                     .Plus("b")
                                                     .Plus"(c");
Run Code Online (Sandbox Code Playgroud)

当然,在框架中有更多不可变集合开始时会很好:)

当然,这对于汽车道具方面都没有帮助.我不得不承认我最近一直在欺骗一定数量,使用私人制定者伪装不变性:

public string Name { get; private set; }
Run Code Online (Sandbox Code Playgroud)

它确实让我觉得很脏,但这并不是真正的不可改变的,那是我的真实意图.

基本上,我说我感觉到你的痛苦 - 而且我很确定C#团队的确如此.请记住,他们的资源有限,设计语言很难.

您可能会发现NDC 2010中视频很有趣 - 与Eric Lippert,Mads Torgersen,Neal Gafter(和我)进行了精彩的小组讨论,我对C#5的建议也在另一个视频中.