【问题标题】:Keeping class state valid vs performance保持类状态有效与性能
【发布时间】:2014-03-16 07:24:46
【问题描述】:

如果我有返回引用类型值的公共方法,它是当前类中的私有字段,我需要返回它的副本吗?在我的情况下,我需要返回列表,但是这个方法经常被调用,我的列表包含大约 100 个项目。关键是如果我返回相同的变量,每个人都可以修改它,但如果我返回一个副本,性能会下降。在我的情况下,我试图生成数独表,这不是快速过程。 内部类 SudokuTable 保存值及其可能值。公共类 SudokuGame 处理 UI 请求并生成/解决 SudokuTable。选择性能而不是 OOP 原则是一种好习惯吗?如果有人想使用我的 SudokuTable 类创建另一个库,他不会意识到他可以通过修改它返回的 List 来阻止它的状态。

【问题讨论】:

  • 我建议你展示你到目前为止编写的属性和访问方法的代码,以便让你的问题更容易理解。

标签: c# oop concept


【解决方案1】:

性能和面向对象编程并不是相互排斥的——你的代码可能是面向对象的并且性能很差,等等。

如果您在此处陈述,我认为允许外部部件编辑事物的内部状态是不明智的,因此我将返回条目的数组或 ReadOnlyCollection(这可能是使用的潜在可能性一个 ObservableCollection 和监视器,用于篡改越界,并相应地“处理”(例如,有例外或其他情况) - 不确定这将是多么可取)。

从那里,您可能会考虑如何公开对这些条目的访问,尽量减少调用者获取完整集合的需要,而他们只需要查找并返回特定集合。

值得注意的是,一个不可编辑的集合并不一定意味着状态不能被改变,要么;如果条目由引用类型而不是值类型表示,则返回一个条目会使 容易被篡改(可能取决于类定义),因此使用结构体可能会更好条目类型。

最后,如果没有具体示例说明您遇到问题的地方,目前这有点主观和理论化。您是否尝试过限制收藏?如果是这样,表现如何?问题出在哪里?以此类推。

【讨论】:

  • 通过 NuGet 推出的一个有用的新东西是新的 Immutable Collections 命名空间。 ReadOnlyCollection 保证收件人不能更改它,但可以由有权访问基础集合的创建者修改。 ImmutableList 一旦创建就无法修改(但您仍然可以从中添加和删除,它只是创建新列表(它在列表之间共享内部状态,因此新列表不会占用太多内存)) .
猜你喜欢
  • 2018-03-17
  • 2015-10-07
  • 1970-01-01
  • 2011-06-19
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 2016-04-10
相关资源
最近更新 更多