2009-07-03 19 views
0

以下の設定とコードスニペットを使用すると、1つを別のものに置き換える理由は何ですか?私はどちらかを使っていくつかの議論をしていますが、私は他の人が何を考えているのか不思議です。オブジェクト参照を保持する

セットアップ

public class Foo 
{ 
    public void Bar() 
    { 
    } 
} 

スニペット一つ

var foo = new Foo(); 
foo.Bar(); 

スニペット二

new Foo().Bar(); 

答えて

9

最初のバージョンは、Bar()を呼び出す前に、デバッガでfooを簡単に調べることができます。

最初のバージョンはまた、時には役立ちます(それは実際にコースの変数の名前ですが、精神的な関連が明確にあります)を使用すると、オブジェクトに名前を関連付ける意味:

var customersWithBadDebt = (some big long expression) 
customersWithBadDebt.HitWithBaseballBat(); 

はより明確です

(some big long expression).HitWithBaseballBat(); 

上記のいずれの理由も当てはまらない場合は、1行バージョンのコースにお気軽にご利用ください。それは個人的な味であり、それぞれの特定の状況に適用されます。

+0

本当に良い点。 –

3

あなたは単に私はおそらくだろうと呼び出しを行う以上をFooのインスタンスを使用しない場合2番目のもののために行くが、実際の違いがあるはずがない非常に頻繁に起こります(しかし、それは私にその構造物で非常に高い可能性があります)。

+0

これは私が逃げようとしていた要素の1つです。機能的な違いはありますか? GCは、他のものよりも1つを取り除くのに、より簡単な時間を持っていますか? –

+0

それぞれの場合に放出されるILを調べることが有益な場合があります。 – AakashM

+0

私は、GCが他のものよりも扱いにくいものを見つけることは疑いの余地があります。おそらく、最初の例で保存した参照で何を行うかによります。 –

0

私はオブジェクト参照が全く必要ないことをかなり明確にしているので、私は2番目を好むでしょう。

0

私はこれをインスタンスメソッドとして持っているあなたの動機に疑問を持っています。 私はそれを1つのメソッドを呼び出してそれを破棄するために、オブジェクトを新しくするだけで、パラメータとしてクラスの依存関係を持つ静的メソッドが行くべき方法であるはずです(私は静的ではありません)。

もっと興味深い問題につながるもの:内部状態にまったく依存しない場合、あなたは単なる関数なので、自分のクラスではなく、あるエンティティに属していると言います。

+0

この例では、XmlSerializerを使用しているため、クラスの構造は既に確立されており、その構造になっています。ちょうど他の好みがスタイルであったか見てみよう。 –

0

私はスニペットナンバーワンに行っています。

Foo do Bar()を実行する場合、Bar2()を使用すると簡単になります。

fooを見ることができるのでデバッグが簡単です。スニペットではできないもの2

関連する問題