2010-04-06 12 views
7

Rozwijam aplikacje .NET od 4 lat. Do tej pory nie musiałem tworzyć żadnych niejawnych konwersji dla klas, które stworzyłem.
Czy możesz podać rzeczywiste sytuacje, w których nie można się obejść bez tworzenia niejawnych konwersji?Jak często tworzysz niejawne konwersje dla swoich zajęć?

Dzięki

+0

Nie mogę myśleć o żadnych prawdziwych przyczynach poza tym, co jest już dostarczane za pośrednictwem typów numerycznych .NET. – leppie

+2

To powinno być wiki społecznościowe (brak ostatecznej odpowiedzi). Lub przeredagowany, aby zapytać, kiedy i dlaczego należy, a czego nie. To byłoby lepsze. –

+0

@Martinho Odpowiedź została już zaakceptowana i nadal nie jest to wiki społecznościowe, więc myślę, że straciłem wszelką nadzieję. :) – bzlm

Odpowiedz

4

Pośrednia konwersji powinien być określony jedynie wtedy, gdy typ może być przekształcony lub (korzystnie i) do innego typu z bez strat danych. Innym kryterium jest to, że niejawne konwersje powinny być dość tanie, ponieważ deweloper korzystający z Twojej klasy prawdopodobnie nie będzie świadomy, kiedy nastąpią niejawne konwersje.

Jeden przykład: konwersja między układami współrzędnych. Na przykład biegunowy wektor współrzędnych, który może przekształcić się we współrzędne kartezjańskie, może być wygodny. Jednak z powodu zaokrąglenia zmiennoprzecinkowego lepiej byłoby pozostawić to jako konwersję jawną, aby programista musiał typograficznie wymusić konwersję.

Konieczna jest konwersja niejawna, jeśli istnieją dwa typy danych przechowujące dane w tym samym formacie, ale jedyne rozróżnienie między typami jest semantyczne - w jaki sposób są używane lub co oznaczają. Przykład w realnym świecie: Konwersja między typami danych datetime, które mają taką samą (lub zgodną) reprezentację podstawową, ale różnią się jedynie datą rozpoczęcia epoc. Znajdziesz je podczas migracji starszych baz kodów do nowszych frameworków, gdzie oba definiują typ datetime, ale semantyka jest nieco inna. Niejawna konwersja tutaj (zakładając, że w ogóle nie ma utraty danych) jest prawdopodobnie w porządku i jest to dobry pomysł.

Jeśli masz zestaw typów i zdefiniowałeś własne reguły dotyczące konwersji typów między sobą, to niektóre z tych konwersji mogą być niejawne, a niektóre jawne w zależności od "wagi" konwersji. Podstawową instancją, w której wykorzystałem niejawną konwersję podczas implementacji klasy w .NET, była implementacja semantyki Win32 Variant dla biblioteki wykonawczej Delphi. Język Win32 i język Delphi określają liczbę konwersji na danych Variant, które można wykonać w sposób dorozumiany.

To, że nie znalazłeś potrzeby tworzenia niejawnych konwersji, jest w rzeczywistości dobrą rzeczą. Tylko dlatego, że nie może to oznaczać, że powinieneś. Konwersje w sposób niejawny istnieją w .NET głównie w celu umożliwienia różnym językom programowania reprezentowania ich własnej semantyki w sposób, który powinien być interoperacyjny i zrozumiały dla innych języków .NET.

+4

Dobry przykład z BCL: promocja ciągu znaków do XName. Tylko dobro pochodzi z tego. –

+0

XName jest piękne. Trochę dziwne, aby dowiedzieć się, jak budować z XNamespace, ale gdy już dostaniesz wzór jest taki słodki. – dthorpe

Powiązane problemy