W jakich okolicznościach (scenariusze użycia) zdecydowałbyś się na napisanie rozszerzenia zamiast podklasy obiektu?ocena kosztów/korzyści zastosowania metod rozszerzających w C# => 3.0
< pełne ujawnienie: Nie jestem pracownikiem MS; Nie znam osobiście Mitsu Furota; Wiem, że autor wspomnianej tutaj biblioteki Componax o otwartym kodzie źródłowym, ale nie mam z nim żadnych kontaktów biznesowych; Nie tworzę ani nie planuję stworzyć żadnego produktu komercyjnego z wykorzystaniem rozszerzeń: w sumie: ten wpis pochodzi z czystej inteligencji i ciekawości związanej z moją próbą (ciągłego) uświadamiania sobie "najlepszych praktyk">
Znajduję ideę Metody rozszerzeń "fajne" i oczywiście możesz robić z nimi "dalekie" rzeczy, jak w wielu przykładach, które możesz znaleźć w blogach Mitsu Furota (MS) link text.
Osobisty przyjaciel napisał bibliotekę Componax o otwartym kodzie źródłowym link text i jest tam kilka niezwykłych udogodnień; ale on jest w pełni dowództwem swojej małej firmy z całkowitą kontrolą nad wytycznymi kodowymi, a każda linia kodu "przechodzi przez jego ręce".
Chociaż są to spekulacje z mojej strony: sądzę/przypuszczam, że inne problemy mogą pojawić się w sytuacji, w której średnie i duże zespoły programowe używają rozszerzeń.
Patrząc na wytycznych MS pod adresem link text, można znaleźć:
W ogóle, prawdopodobnie będzie wywoływanie metod przedłużania znacznie bardziej częściej niż wdrażaniu własnych. ... Ogólnie zaleca się, aby implementować metody rozszerzające oszczędnie i tylko wtedy, gdy jest to konieczne. Ilekroć jest możliwy, kod klienta, który musi rozszerzyć się na , istniejący typ powinien to zrobić przez , tworząc nowy typ pochodzący z istniejącego typu . Aby uzyskać więcej informacji, zobacz zobacz Dziedziczenie (C# Programowanie Przewodnik). ... Gdy kompilator napotyka wywołanie metody, najpierw szuka dopasowania w typach instancji tego typu: . Jeśli nie zostanie znaleziona żadna dopasowana , wyszuka ona wszystkie typy rozszerzeń zdefiniowane dla typu i powiąże z pierwszą znalezioną metodą rozszerzenia .
I w ms za link text:
rozszerzenie metod przedstawić żadnych konkretnych luk w zabezpieczeniach. Nie można ich używać do podszywania się pod istniejące metody , ponieważ wszystkie kolizje nazw są rozstrzygane na korzyść instancji lub metody statycznej zdefiniowanej jako przez sam typ. Metody rozszerzeń nie mają dostępu do żadnych prywatnych danych w rozszerzonej klasie .
Czynniki, które wydają się dla mnie oczywiste, że to:
Zakładam, że nie byłoby napisać rozszerzenie chyba że spodziewane go stosować bardzo ogólnie i bardzo często.Z drugiej strony: czy nie możesz powiedzieć tego samego o subklasie?
Wiedząc, że możemy je skompilować do osobnej biblioteki dll i dodać skompilowaną bibliotekę dll, a następnie odwołać się do niej, a następnie użyć rozszerzeń: "jest cool", ale czy to "wyrównuje" koszt związany z kompilatorem jako pierwszym konieczności sprawdzenia, czy metody instancji są zdefiniowane jak opisano powyżej. Lub koszt, w przypadku "zderzenia nazw", korzystania z metod wywoływania statycznego, aby upewnić się, że wywoływane jest rozszerzenie, a nie definicji instancji?
Jak częste korzystanie z rozszerzeń wpłynęłoby na wydajność pracy lub zużycie pamięci: Nie mam pojęcia.
Tak, doceniam twoje myśli lub wiedząc o tym, jak/kiedy robisz, lub czego nie robisz, użyj Rozszerzeń, w porównaniu do podklasy.
dzięki, Bill
wiele innych pytań dotyczących tego samego tematu: http://stackoverflow.com/questions/487904/what-advantages-ofextext-methods-have-you-found – snicker
"Jak często korzystano z rozszerzeń wpływa na wydajność pracy lub zużycie pamięci: nie mam pojęcia. " - w żaden sposób nie wpływa na żadną z nich. Wywołanie metody statycznej jest dokładnie takie samo jak wywołanie nie-wirtualnej, nieinterfejsowej metody instancji z taką samą liczbą argumentów (zliczanie niejawnego "tego" w tym ostatnim przypadku). –