Bővítő metódusok

Megjegyzés:

Ezt a tartalmat a Pearson Education, Inc. engedélyével nyomtatjuk újra a Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition című műből. Ezt a kiadást 2008-ban adták ki, és a könyvet azóta teljesen átdolgozták a harmadik kiadásban. Előfordulhat, hogy az oldalon található információk némelyike elavult.

A bővítménymetódusok olyan nyelvi funkciók, amelyek lehetővé teszik a statikus metódusok meghívását a példánymetódus hívási szintaxisával. Ezeknek a metódusoknak legalább egy paramétert kell használniuk, amely azt a példányt jelöli, amelyen a metódusnak működnie kell.

Az ilyen kiterjesztési módszereket meghatározó osztályt "szponzor" osztálynak nevezzük, és statikusként kell deklarálni. A bővítménymetelyek használatához importálni kell a szponzorosztályt meghatározó névteret.

❌ KERÜLJE a bővítménymetalógusok komolytalan definiálását, különösen a nem saját típusok esetében.

Ha saját típusú forráskódot használ, fontolja meg inkább a normál példánymódszerek használatát. Ha nem Ön a tulajdonos, és módszert szeretne hozzáadni, legyen nagyon óvatos. A bővítménymetelyek szabad használata olyan típusok API-jainak zsúfoltságára is képes, amelyek nem ezekre a módszerekre lettek tervezve.

✔️ GONDOLJA ÁT a kiterjesztési módszerek használatát az alábbi forgatókönyvek bármelyikében:

  • Az interfész minden implementációja szempontjából releváns segítő funkciók biztosítása érdekében, ha az említett funkciók az alapfelület szempontjából írhatók. Ennek az az oka, hogy a konkrét implementációkat egyébként nem lehet interfészekhez rendelni. Az operátorok például LINQ to Objects bővítménymeteként vannak implementálva minden IEnumerable<T> típushoz. Így minden IEnumerable<> implementáció automatikusan LINQ-kompatibilis.

  • Ha egy példánymetódus függőséget vezetne be valamilyen típushoz, de egy ilyen függőség megszakítaná a függőségkezelési szabályokat. Előfordulhat például, hogy a String és System.Uri közötti függőség nem kívánatos, ezért a String.ToUri() példánymetódus, amely System.Uri-t ad vissza, nem megfelelő kialakítás a függőségkezelés szempontjából. A statikus kiterjesztési metódus Uri.ToUri(this string str), amely visszatér System.Uri, sokkal jobb tervezés lenne.

❌ KERÜLJE a kiterjesztési módszerek definiálását a System.Object.

A VB-felhasználók nem tudják meghívni ezeket a metódusokat az objektumhivatkozásokon a bővítménymetódus szintaxisával. A VB nem támogatja az ilyen metódusok meghívását, mivel a VB-ben a hivatkozás objektumként való deklarálása az összes metódushívást késői kötésre kényszeríti (a tényleges tagot futásidőben határozzák meg), míg a bővítménymetódusokhoz való kötések fordításkor (korai kötésben) vannak meghatározva.

Vegye figyelembe, hogy az útmutató azokra a nyelvekre vonatkozik, ahol ugyanaz a kötési viselkedés jelen van, vagy ha a bővítménymetelyek nem támogatottak.

❌ NE helyezze a bővítménymetelyeket ugyanabba a névtérbe, mint a kiterjesztett típus, kivéve, ha metódusokat ad hozzá az interfészekhez vagy a függőségkezeléshez.

❌ NE definiáljon két vagy több azonos aláírású bővítménymetelyt, még akkor is, ha különböző névterekben találhatók.

✔️ FONTOLJA meg a bővítménymetelyek meghatározását a kiterjesztett típussal azonos névtérben, ha a típus egy interfész, és ha a bővítménymetelyeket a legtöbb esetben vagy minden esetben használni kell.

❌ NE definiáljon olyan bővítménymetelyeket, amelyek más funkciókhoz általában társított névterekben implementálnak egy funkciót. Ehelyett definiálja őket a hozzájuk tartozó szolgáltatáshoz társított névtérben.

❌ KERÜLJE a bővítménymetelyekhez (pl. "Bővítmények") dedikált névterek általános elnevezését. Ehelyett használjon leíró nevet (például "Útválasztás").

© Részletek 2005, 2009 Microsoft Corporation. Minden jog fenntartva.

Újranyomva a Pearson Education, Inc. engedélyével, Krzysztof Cwalina és Brad Abrams Framework Design Guidelines: Konvenciók, Idiomák és Minták az Újrafelhasználható .NET Könyvtárak Számára, 2. kiadás című könyvéből, közzétéve 2008. október 22-én, a Addison-Wesley Professional által, a Microsoft Windows Fejlesztési Sorozat részeként.

Lásd még