我知道这是一个古老的话题,但在编程过程中,我总会遇到这样的问题:如何平衡内存使用和代码大小?
以下是一个例子:
我想实现一个类(在C#中),我希望构造函数接受大量不同类型的参数。所以我需要一个构造函数来接受一个IEnumerable对象(这包括数组,列表等),但我还需要一个consstructor来接受可变长度参数(使用 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*/}
虽然使用这种方式减少了代码大小,但它引入了一个临时列表对象,因此增加了内存使用量(虽然也是临时的)。
我知道这个例子会有很好的讨论,关于哪一个更好的方式。但我想知道,你们所有人如何处理这种平衡问题。在许多情况下,情况会更复杂,有时您还需要考虑执行时间的平衡。
有一个名为“不要重复自己”的原则,这可能也适用于像这里的例子那样的小段代码吗?
答案 0 :(得分:4)
您无需从params
数组创建列表。 Bar[]
数组为IEnumerable<Bar>
,因此您无需创建任何新对象即可使用它。只是强制转换它以便它调用正确的构造函数,而不是它自己(或者只是为了清楚它的作用):
Foo(params Bar[] a) : this((IEnumerable<Bar>)a) {}
对于任何无法实现的情况,通常可以添加一个可以执行其他构造函数的私有构造函数,因此仍然只能将代码放在一个位置。即使可以处理更多情况的代码变得更复杂,通常仍然希望有两段代码几乎完全相同。