【问题标题】:Memory and code balance [closed]内存和代码平衡[关闭]
【发布时间】:2013-01-11 17:15:29
【问题描述】:

我知道这是一个老话题了,但是在我的编程过程中我总是遇到这样一个问题:如何平衡内存使用和代码大小?

这是一个例子:

我想实现一个类(在 C# 中),并且我希望构造函数接受各种不同类型的参数。所以我需要一个构造函数来接受一个 IEnumerable 对象(这包括数组、列表等),但我还需要一个构造函数来接受可变长度参数(使用 params)。这两个构造函数的内部构造例程完全相同,但是为了允许变长参数,我还是需要后一个。

Foo(IEnumerable<Bar> a) {/*construction*/}
Foo(params Bar[] a) {/*the same construction like above*/}

但是,我可以使用 params 转换一个参数数组并调用另一个构造函数:

Foo(params Bar[] a) : this(new List<Bar>(a)) {/*here empty*/}

虽然使用这种方式减少了代码大小,但它引入了一个临时列表对象,因此增加了内存使用量(虽然也是临时的)。

我知道会有很多关于这个例子的讨论,关于哪种方式更好。但是我想知道,你们一般会如何处理这种平衡问题。很多情况下情况会比较复杂,有时还需要考虑执行时间的平衡。

有一个原则叫做“不要重复自己”,这是否也适用于像这里的示例这样的小段代码?

【问题讨论】:

  • 为什么是新的List?该数组实现IEnumerable&lt;Bar&gt; - 直接提供它。我知道,这不是一般问题的答案,但是...
  • 我怀疑人们会同意一个“一般”的答案。根据要求,我的每段代码在内存使用或速度方面都有一些优先级。对我来说,代码的大小通常排在这两个之后。
  • @DavidM 我猜他遇到了this(a) 不起作用的问题,并且不知道如何获得重载决议来选择其他构造函数。
  • @DavidM 不是很直接,但我需要将参数数组转换为IEnumerable,否则编译器会说构造函数调用自己。正如我所说,这个具体的例子可能会有很大的讨论,但一般的平衡问题是一个有趣的开放话题:-)

标签: c# memory balance


【解决方案1】:

您不需要从params 数组创建列表。 Bar[] 数组是 IEnumerable&lt;Bar&gt;,因此您可以在不创建任何新对象的情况下使用它。只需将其强制转换,以便它调用正确的构造函数,而不是它本身(或者只是为了清楚它的作用):

Foo(params Bar[] a) : this((IEnumerable<Bar>)a) {}

对于这不可能的任何情况,通常您可以添加一个私有构造函数,该构造函数可以完成其他构造函数的工作,因此仍然只将代码放在一个地方。即使可以处理更多情况的代码变得有点复杂,这通常仍然比两段代码几乎完成相同的事情更可取。

【讨论】:

  • 或者,如果您更喜欢扩展方法语法,a.AsEnumerable() 做同样的事情。
  • 您可能想解释为什么this(a) 不起作用,但this((IEnumerable&lt;Bar&gt;)a) 起作用。
  • @Guffa 这实际上是我的具体示例的一个很好的解决方案,有时我无法回忆起一种语言的所有可用特性或事实。谢谢!
  • @CodesInChaos 我试过这个,但显然没有数组的AsEnumerable() 方法。而对于this(a)的使用,构造函数调用自己是错误的(和其他的重载一样)。
  • @WeixiangGuan AsEnumerable 如果您的using 列表中有System.Linq,则可用。它是IEnumerable&lt;T&gt; 上的扩展方法,因此可以在数组上使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多