Ostatnio studiowałem więcej na temat typów dynamicznych w C #. W niektórych przykładach zrozumiałem, że po skompilowaniu kod nie wymaga ponownej kompilacji, ale można go wykonać bezpośrednio.
Uważam, że elastyczność zapewniana przez słowo kluczowe w celu faktycznej zmiany typu danych do woli jest wielką zaletą .
Pytanie,
Czy są jakieś specyficzne niedociągnięcia oprócz niewłaściwych wywołań metod dynamicznych, które rzucają wyjątki czasu wykonywania, które programiści muszą znać przed rozpoczęciem implementacji.
c#
.net
visual-studio-2010
Karthik Sreenivasan
źródło
źródło
object
rzutowania typu bezpośredniego za zapach kodowy. W prawie każdym przypadku oznaczało to, że ja lub jeden z moich zespołów nie zaprojektowałem odpowiedniego interfejsu dla tej funkcjonalności. Zgaduję, że gdybym teraz używał C # 4, czułbym się w ten sam sposóbdynamic
. Mogę to zobaczyć, jeśli sprawisz, że wszystko stanie się dynamiczne, ale w takim przypadku możesz równie dobrze wybrać dynamiczny język maszynowy. * 8 ')dynamic
w C # oznacza, że nie musisz rezygnować z IronPython, jeśli potrzebujesz tylko dynamicznego pisania dla małej części kodu. Dla ewaluatora wyrażeń miałem duży sukcesdynamic
w reprezentowaniu operandów wyrażenia i wyników oceny.dynamic
, a ponadto chciałbym wiedzieć o IronPython, kiedy tworzyłem z .Net - mogło to ułatwić pewne rzeczy, które staraliśmy się zrobić znacznie łatwiej.Odpowiedzi:
Główną wadą jest to, że wyrzucasz jedną z głównych właściwości (niekoniecznie zalet) C # - że jest on statycznie wpisany (a dla większości typów bezpieczny).
Problem z dynamicznym pisaniem polega na tym, że często ukrywa błędy, które w innym przypadku zostałyby ujawnione podczas kompilacji. Taki błąd pojawia się wtedy tylko w czasie wykonywania, co oczywiście znacznie utrudnia jego wykrycie.
IMO ma bardzo niewiele powodów, aby używać pisania dynamicznego w C #, z których głównym jest współpraca z językami dynamicznie wpisywanymi (którym jest AFAIK, ponieważ dynamika została wprowadzona w pierwszej kolejności).
Jeśli chcesz wykonywać w pełni dynamiczne programowanie, powinieneś spojrzeć na język, który jest zaprojektowany tak, aby był dynamiczny, a nie hakować C #, aby być dynamicznym. Możesz użyć na przykład IronPython, jeśli chcesz korzystać z bibliotek .Net
źródło
dynamic
daje ci możliwość podniesienia obiektu do jego rzeczywistego typu bez żadnego hackowania odbicia. Na przykład, jeśliBase foo = new Derived();
i tam były dwie metody przeciążonyMoo(Base x)
iMoo(Derived x)
, a następnieMoo(foo)
zwracaMoo(Base x)
, aleMoo((dynamic)foo)
rozmowyMoo(Derived x)
. Prowadzi to do bardzo eleganckiej implementacji wzorca gościa, na przykład: code.logos.com/blog/2010/03/... i ogólnie jest bardzo skuteczną techniką.Nie jestem pewien, jakiego rodzaju niedociągnięć szukasz, ale jeśli chcesz wiedzieć o funkcjach, które działają przy pisaniu statycznym, ale nie z
dynamic
, istnieje kilka:Metody rozszerzeń nie działają. To chyba największy. Jeśli tak
dynamic collection
, nie możesz używać kodu podobnego docollection.Distinct()
. Jest tak, ponieważ dostępne metody rozszerzenia zależą od przestrzeni nazw,using
a DLR nie ma możliwości ich poznania.Jako obejście, można wywołać metodę jakby to była normalna metoda statyczna:
Enumerable.Distinct(collection)
. Lub możesz zmienić typ kolekcji na coś podobnegoIEnumerable<dynamic>
.foreach
wymagaIEnumerable
. W normalnym języku C #foreach
jest oparty na wzorcach. Oznacza to, że nie wymaga żadnego konkretnego interfejsu, a jedynieGetEnumerator()
metody zwracającej odpowiedni obiekt. Jeśli używaszforeach
dalejdynamic
,IEnumerable
wymagana jest implementacja . Ale ponieważ powodem takiego zachowania jest to, że C # 1.0 nie miał generycznych, to „niedociągnięcie” jest praktycznie nieistotne.źródło
Problem z typami dynamicznymi (nie zmiennymi zadeklarowanymi jako dynamiczne) w .net polega na tym, że nie mają one zbyt wielu funkcji dostępnych dla typów statycznych.
Nie pisz więc kodu z typami dynamicznymi, chyba że wiesz, co robisz.
źródło
Ponieważ
dynamic
jest to tylko zaznaczoneobject
, zawiera pola typów wartości.Może to mieć wpływ na wydajność, ale ponieważ i tak używałbym pisania statycznego w kodzie krytycznym pod względem wydajności, prawdopodobnie nie jest to problem w praktyce.
Boks ten zakłóca także zmienne typy wartości. Jeśli je zmodyfikujesz
dynamic
, zmodyfikujesz tylko kopię w pudełku. Ponieważ jednak nie powinieneś używać zmiennych typów wartości, nie jest to również duży problem.źródło