TL; DR - 使用Child
上のParent
ローカルスコープで好ましいです。読みやすさだけでなく、オーバーロードされたメソッド解決が適切に機能し、効率的なコンパイルを可能にすることも必要です。
ローカルスコープでは、
Parent obj = new Child(); // Works
Child obj = new Child(); // Better
var obj = new Child(); // Best
概念的には、可能な限り多くの型情報を維持することです。にダウングレードする場合Parent
、基本的には有用である可能性のある型情報を取り除くだけです。
完全な型情報を保持することには、主に4つの利点があります。
- コンパイラーに詳細情報を提供します。
- 読者に詳細情報を提供します。
- よりクリーンで、より標準化されたコード。
- プログラムロジックをより可変にします。
利点1:コンパイラーへの詳細情報
見かけの型は、オーバーロードされたメソッド解決および最適化で使用されます。
例:オーバーロードされたメソッド解決
main()
{
Parent parent = new Child();
foo(parent);
Child child = new Child();
foo(child);
}
foo(Parent arg) { /* ... */ } // More general
foo(Child arg) { /* ... */ } // Case-specific optimizations
上記の例では、両方のfoo()
呼び出しが動作しますが、ある場合には、より優れたオーバーロードメソッド解決を取得します。
例:コンパイラーの最適化
main()
{
Parent parent = new Child();
var x = parent.Foo();
Child child = new Child();
var y = child .Foo();
}
class Parent
{
virtual int Foo() { return 1; }
}
class Child : Parent
{
sealed override int Foo() { return 2; }
}
上記の例では、両方の.Foo()
呼び出しが最終的にoverride
を返す同じメソッドを呼び出します2
。ちょうど、最初のケースでは、正しいメソッドを見つけるための仮想メソッドルックアップがあります。この仮想メソッドのルックアップは、2番目のケースではそのメソッドのなので必要ありませんsealed
。
彼の答えで同様の例を提供した@Benに感謝します。
利点2:読者への詳細情報
正確なタイプを知っている、つまりChild
、コードを読んでいる人にもっと多くの情報を提供し、プログラムが何をしているのかを見やすくします。
確かに、多分それは両方以来の実際のコードには問題ではないparent.Foo();
とchild.Foo();
意味をなさないが、最初の時間のためのコードを見て誰かのために、より多くの情報は、単なる便利です。
さらに、開発環境によっては、IDEはについてChild
より役立つツールチップとメタデータを提供できる場合がありますParent
。
利点3:よりクリーンで標準化されたコード
私が最近見たほとんどのC#コード例var
は、基本的には略記ですChild
。
Parent obj = new Child(); // Sub-optimal
Child obj = new Child(); // Optimal, but anti-pattern syntax
var obj = new Child(); // Optimal, clean, patterned syntax "everyone" uses now
非var
宣言文を見ると、ただ見えます。状況的な理由がある場合は素晴らしいですが、そうでない場合はアンチパターンに見えます。
// Clean:
var foo1 = new Person();
var foo2 = new Job();
var foo3 = new Residence();
// Staggered:
Person foo1 = new Person();
Job foo2 = new Job();
Residence foo3 = new Residence();
利点4:プロトタイピングのためのより可変的なプログラムロジック
最初の3つの利点は大きなものでした。これははるかに状況的です。
それでも、他の人がExcelを使用しているようにコードを使用する場合、コードを常に変更しています。多分私達はに固有のメソッドを呼び出す必要はありませんChild
で、このコードのバージョンが、我々は、後でコードを再利用したり手直しすることがあります。
強力な型システムの利点は、プログラムロジックに関する特定のメタデータを提供し、可能性をより簡単に明らかにすることです。これは、プロトタイピングに非常に役立つため、可能な限り保管することをお勧めします。
概要
Parent
オーバーロードされたメソッド解決を台無しにして、いくつかのコンパイラの最適化を禁止し、リーダーから情報を削除し、コードをくします。
var
実際に使用する方法です。素早く、きれいで、パターン化されており、コンパイラとIDEが適切に仕事をするのに役立ちます。
重要:この回答は、Parent
vsChild
。メソッドのローカルスコープに関するものです。Parent
vsの問題はChild
、戻り値の型、引数、およびクラスフィールドによって大きく異なります。