私のプログラムを計画するとき、私はしばしば次のような一連の思考から始めます。
サッカーチームは、サッカー選手のリストにすぎません。したがって、私はそれを次のように表現する必要があります:
var football_team = new List<FootballPlayer>();このリストの順序は、プレーヤーが名簿にリストされている順序を表しています。
しかし、後でチームが記録する必要があるのは、単なるプレーヤーのリストに加えて、他のプロパティもあることに気づきました。たとえば、今シーズンのスコアの累計、現在の予算、均一な色、stringチームの名前を表すなど。
だから私は思う:
さて、サッカーチームは選手のリストのようなものですが、それに加えて、名前(a
string)と現在の合計スコア(anint)があります。.NETはサッカーチームを格納するためのクラスを提供していないため、自分でクラスを作成します。最も類似し、関連する既存の構造はList<FootballPlayer>なので、それを継承します。class FootballTeam : List<FootballPlayer> { public string TeamName; public int RunningTotal }
しかし、ガイドラインでは、から継承してはならないList<T>ことがわかっています。このガイドラインは2つの点で完全に混乱しています。
何故なの?
どうやらList、何らかの形でパフォーマンスが最適化されています。どうして?拡張すると、どのようなパフォーマンスの問題が発生しListますか?正確には何が壊れますか?
私が見たもう1つの理由Listは、Microsoftから提供されたものであり、私はそれを制御できないため、「パブリックAPI」を公開した後で後で変更することはできません。しかし、私はこれを理解するのに苦労しています。パブリックAPIとは何ですか。なぜ気にする必要があるのですか。現在のプロジェクトにこのパブリックAPIが含まれていない可能性がある場合、このガイドラインを無視しても安全ですか?私は、継承を行う場合List と、、それは私が公共のAPIを必要と判明し、どのような困難私が持っているのだろうか?
なぜそれが重要なのですか?リストはリストです。何が変わる可能性がありますか?何を変更したいですか?
そして最後に、Microsoftがからの継承を望まないのであればList、なぜ彼らはクラスを作らなかったのでしょうか。sealedですか?
他に何を使うべきですか?
どうやら、カスタムコレクションの場合、Microsoft Collectionはの代わりに拡張する必要のあるクラスを提供していListます。しかし、このクラスは非常に裸であり、たとえばなどAddRange、多くの有用なものはありません。jvitor83の答えは、その特定のメソッドのパフォーマンスの根拠を提供しますが、遅いのAddRangeは遅いよりも良いですAddRangeどうしてですか
からのCollection継承はList、からの継承よりもはるかに多くの作業であり、私には利点がないと思います。確かにMicrosoftは理由もなく余分な作業をするように言わないので、何かを誤解しているように感じずにはいられず、継承Collectionは私の問題の正しい解決策ではありません。
実装などの提案を見てきました IList。いいえ。これは何十行ものボイラープレートコードで、何も得られません。
最後に、List何かを何かにラップすることを提案する人もいます:
class FootballTeam 
{ 
    public List<FootballPlayer> Players; 
}これには2つの問題があります。
- それは私のコードを不必要に冗長にします。 - my_team.Players.Countただ電話をする代わりに今すぐ電話しなければなりません- my_team.Count。ありがたいことに、C#を使用すると、インデックス作成を透過的にするようにインデクサーを定義し、内部のすべてのメソッドを転送できます- List...しかし、これは大量のコードです。すべての作業で何が得られますか?
- それだけでは意味がありません。サッカーチームは、選手のリストを「持っていません」。これは、ある選手のリスト。「John McFootballerがSomeTeamのプレーヤーに参加した」とは言わないでください。あなたは「ジョンがSomeTeamに参加した」と言います。「文字列の文字」に文字を追加するのではなく、文字列に文字を追加します。図書館の本に本を追加するのではなく、本を図書館に追加します。 
「内部で」起こることは「XをYの内部リストに追加する」と言うことができることを私は理解していますが、これは世界について非常に直観に反する考え方のようです。
私の質問(要約)
、「論理的に」(「人間の心に」、と言うことであるが)だけで、データ構造、表現の正確なC#の方法は何であるlistのthings少数の添えものとは?
からの継承はList<T>常に受け入れられませんか?それはいつ受け入れられますか?なぜ/なぜしないのですか?継承するかどうかを決定するとき、プログラマは何を考慮しなければなりませList<T>んか?
stringすべて行うために必要とされてobject行うことができ、よりを。
                
