gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 18:19:21 27 4
gpt4 key购买 nike

我经常使用自动属性,但我越来越远离使用在构造函数中初始化的只读支持字段设置类。我删除了所有的 setter,只有在属性明显需要 setter 时才添加后面的内容。

我发现这使我的类更加健壮和优雅的 OO 明智,我为没有早点这样做而自责。

我发现构造函数在 C# 代码示例中通常没有得到充分利用,我认为自动属性和对象初始化器是其中的重要部分,所以我的问题是为什么 C# 团队推出这样的功能而不是更多地关注交付功能更多地插入最佳实践。一般来说,我认为编写糟糕的代码太容易了,并且相信可以做更多的事情来帮助编码人员编写好的代码

最佳答案

从对话中,我相信 C# 团队明白他们已经使编写可变类型变得更容易,同时没有为不可变类型提供类似的好处。这并不是说他们随着时间的推移让不变性变得更难——他们只是没有让它变得更容易……除了匿名类型,它们是不可变的,但有其他各种缺点。我当然不希望自动属性被取消——在适当的地方,它们真的很有用。我只是喜欢只读属性的等价物(允许它们只在构造函数中设置)。

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

不幸的是,集合初始化器是一个更难破解的坚果。我希望看到可以与不可变集合一起使用的“链式”初始化程序,这样编译器就可以创建对 Plus 的调用,而不是在同一实例上重复调用 Add链接在一起:

ImmutableList<string> x = new ImmutableList<string> { "a", "b", "c" };

会去:

ImmutableList<string> x = new ImmutableList<string>().Plus("a")
.Plus("b")
.Plus"(c");

当然,如果框架中有更多的不可变集合作为开始就更好了:)

当然,这对自动 Prop 方面没有任何帮助。我不得不承认我最近一直在作弊,使用私有(private) setter 来伪造不可变性:

public string Name { get; private set; }

虽然这确实让我觉得很脏,但当我的真正意图是让它真正不可变时,它确实让我觉得很脏。

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

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

关于c# 构造函数与自动属性和对象初始值设定项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3640137/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com