【问题标题】:Is constructor returning object never used wasteful?构造函数返回对象从不使用是浪费吗?
【发布时间】:2016-05-06 09:45:39
【问题描述】:

我正在使用一个代码库来实例化对象而不分配给变量,如下所示:

new MyNonStaticClass();

无论如何,构造函数内部都是对静态类/方法的调用...

虽然这是有效的,但它是构造函数的唯一用途,可以转换为静态方法或静态类。

这在代码库中随处可见,所以问题是:

将这些更改为静态类有性能优势吗?

如果我有时间,我想这样做,但我需要优先考虑工作量。

【问题讨论】:

  • 我个人认为可读性很重要:)
  • 我也是@JonSkeet,虽然有工作量,我需要优先考虑:-)
  • 我不明白为什么性能似乎会导致您对此感到担忧。在没有赋值的情况下调用 ctor 只会导致对象被创建,然后在下一次 GC 时被释放。唯一没有副作用的方法是构造函数修改了一些静态状态。
  • 我想问题是使用的内存比需要的多@Matt

标签: c# performance constructor static


【解决方案1】:

将这些更改为静态类有性能优势吗?

是的 - 您不会构建大量无意义的对象,然后 GC 必须收集这些对象。这在您的应用程序中很重要吗?很难说。

更重要的是,它具有显着的可读性优势。构造一个对象具有关于每个对象状态很重要的含义。 void 静态方法调用会在异常和全局状态方面产生副作用,因此调用的目的变得更加清晰。另外,你可以给它一个有意义的名字。

我希望通过搜索和替换来重构它会很容易。 (我不知道有什么工具可以轻松进行这种排序或重构,因为这是一种奇怪的情况。它们可能存在,但搜索和替换可能比找到它们更快。)

【讨论】:

  • 就我个人而言,我想清理它,就像我在问题中所说的那样。我更喜欢可读性。请问构造函数创建的未使用对象会发生什么?它是否像已分配和未使用一样超出范围?
  • @SimonBosley:对象没有范围 - 变量有。但基本上不会有对它的引用,所以它会立即有资格进行垃圾回收。正如我在回答中所说,我真的不认为需要很长时间来反思这一点......特别是如果有很多调用者但以这种方式构造的类相对较少。
  • 这是一项我可以添加到项目中的任务,但作为大型软件开发团队的一部分,它必须优先考虑。不幸的是,我正在尝试清理很多此类代码,而不仅仅是我展示的示例。就我个人而言,我一开始不会写这段代码 ;-)
  • new Thing()(如果 Thing 是一个类)在堆上创建一个分配(其中至少包含 16 字节的标头,加上 Thing 所持有的任何状态),但不会引用该分配堆栈。 GC 将出现,暂停所有线程并找到所有未引用的分配,并且您的 new Thing() 将立即成为候选对象,因此将被回收。
  • @JonSkeet 感谢您的回答,很高兴了解情况的性能方面。将在适当的时候标记为答案:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 2022-12-18
相关资源
最近更新 更多