2

これは古いトピックであることは承知していますが、プログラミング中に常に次のような問題に遭遇します。メモリ使用量とコード サイズのバランスを取るにはどうすればよいですか?

次に例を示します。

クラスを (C# で) 実装したいのですが、コンストラクターがさまざまな種類のパラメーターのワイルド レンジを受け入れるようにしたいと考えています。したがって、IEnumerable オブジェクト (配列、リストなどを含む) を受け入れるコンストラクターが必要ですが、可変長パラメーター ( paramsを使用) を受け入れるコンストラクターも必要です。これら 2 つのコンストラクターの内部構築ルーチンはまったく同じですが、可変長パラメーターを使用できるようにするためには、後者が必要です。

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*/}

この方法を使用している間、コード サイズは縮小されますが、一時リスト オブジェクトが導入されるため、(一時的ではありますが) メモリ使用量が増加します。

この例については、どちらがどの方法で優れているかについて、大きな議論があることを私は知っています。しかし、私は知りたいのですが、皆さんはこの種のバランスの問題全般にどのように対処しますか. 多くの場合、状況はより複雑になり、実行時間のバランスも考慮する必要がある場合があります。

「同じことを繰り返すな」という原則がありますが、これはここの例のような小さなコードにも当てはまりますか?

4

1 に答える 1

4

params配列からリストを作成する必要はありません。Bar[]配列はであるIEnumerable<Bar>ため、新しいオブジェクトを作成せずに使用できます。それ自体ではなく、適切なコンストラクターを呼び出すように(または、それが何をするのかが明確になるように)キャストするだけです。

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

これが不可能な場合は、多くの場合、他のコンストラクターの作業を実行できるプライベートコンストラクターを追加できます。したがって、コードは1か所にしかありません。より多くの状況を処理できるコードが少し複雑になったとしても、通常は、ほぼ同じことを実行する2つのコードを使用するよりも望ましい方法です。

于 2013-01-28T11:20:31.857 に答える