2009-10-26 13 views
21

Przeczytałem niezliczone blogi, posty i pytania StackOverflow na temat nowych funkcji C# 4.0. Nawet nowe funkcje WPF 4.0 zaczęły pojawiać się na otwartej przestrzeni. Czego nie mogłem znaleźć i chciałbym wiedzieć:Różnica między CLR 2.0 a CLR 4.0

  1. Jakie są główne zmiany w CLR 4.0 z perspektywy programisty C#/WPF?
  2. Jakie są główne zmiany w CLR 4.0 jako całości?

Myślę, że wewnętrznie większość zmian dotyczy nowych języków dynamicznych i programowania równoległego. Ale czy są jakieś inne istotne ulepszenia? Ponieważ ulepszenia językowe są właśnie takie, ulepszenia językowe. Po prostu potrzebujesz nowego kompilatora i te funkcje mogą być używane z niższą wersją .Net, oprócz wersji 1.0/1.1 (przynajmniej większość z nich może być używana).

A jeśli powyższe funkcje są jedynymi, tylko dla tych funkcji wersja zostanie zmieniona na 4.0, co moim zdaniem jest 4.0, ponieważ opiera się na wersji .Net 4.0 (tj. Po 1.0/1.1, 2.0 & 3.0/3.5). Czy wzrost wersji jest uzasadniony?

Zmieniano:

Jak Pavel Minaev zauważył w komentarzach, nawet te dwie cechy są niezależne CLR. W wersjach 3.0 i 3.5 wprowadzono także szybkość i inne ulepszenia. Dlaczego więc wersja rośnie?

+1

Bezpośrednie wsparcie CLR nie obsługuje obsługi języków dynamicznych, a nie programowania równoległego. Języki dynamiczne są obsługiwane przez DLR, który jest zbudowany na podstawie CLR (i nie używa niczego specyficznego dla niego i może działać na 2.0 po prostu dobrze). Parallel FX to tylko biblioteka. –

Odpowiedz

11

Jedną z nowości CLR, o której wiem, jest forma typowania strukturalnego dla interfejsów, struktur i delegatów na rzecz NoPIA support - w zasadzie pozwala to programom obsługi traktować różne typy z równoważnymi definicjami tak, jakby były one takie same - więc jeśli dwa zestawy A i B mają zaimportowany interfejs COM IFoo zadeklarowany w nich, z tym samym IID i tymi samymi członkami, środowisko wykonawcze potraktuje je jako równoważne typy; więc jeśli istnieje instancja klasy Foo implementująca, można ją przesłać do [B]IFoo, a rzutowanie będzie działało.

Jedną z rzeczy jest możliwość jednoczesnego hostowania kilku wersji CLR w jednym procesie. Na przykład nie można hostować wersji 1.x i 2.0 w jednym procesie, ale można hostować wersje 2.0 i 4.0. Główną zaletą tego jest możliwość równoczesnego ładowania wtyczek napisanych dla obu wersji CLR.

Jednym drobnym bitem jest to, że kilka dodatkowych wyjątków zostało nieprzeniknionych, jak na przykład StackOverflowException w wersji 2.0 - nie można już na przykład przechwycić numeru AccessViolationException.

Ponadto, here jest prezentacją PowerPoint na CLR 4.0 od PDC 2008. Może być nieco przestarzały, ale większość rzeczy, o których wspomniano, wydaje się być w betach.

+0

@Pavel, dlaczego nie możesz już wychwycić tych wyjątków w 4? Czy są przestarzałe? –

+0

Zostały one wykonane nieprzyłączalne celowo, ponieważ nie ma uzasadnionego powodu dla aplikacji do ich złapania. W przypadku 'StackOverflowException' jest to spowodowane tym, że jakikolwiek kod obsługi błędów nie byłby w stanie zrobić wiele, tak czy inaczej (jeśli nie masz sterty, nie możesz nawet wywołać metody ...). Dla 'AccessViolationException' jest tak, ponieważ ze swej natury jest niedeterministyczny - operacja, która spowodowałaby, że równie dobrze można odczytać (lub, co gorsza, zapisać) jakiś niespokrewniony region pamięci; więc złapanie go jest zawsze problemem projektowym. –

+2

Wyjątek "AccessViolationException" mógł zostać niezwiązany, ponieważ program Security Access Security Code został uznany za przestarzały, co powoduje, że wyjątek jest przestarzały: http://www.infoq.com/news/2010/01/CAS-.NET-4.0. To nigdy nie było niedeterministyczne, z pewnością nie w obszarach, w których chcesz zezwolić na uruchamianie obcego kodu. – Abel

2

Nie wierzę, że są jakieś nowe instrukcje IL. Nowy CLR ma ulepszenia takie jak inline i usuwanie śmieci, które wykonują tę samą pracę co 2.0 CLR, ale lepiej. Maszyna wirtualna (taka jak CLR lub JVM) jest abstrakcyjną koncepcją z wieloma możliwymi implementacjami. Wierzę, że CLR 4.0 to ta sama abstrakcyjna maszyna co w CLR 2.0, tylko z ulepszoną implementacją.

Nawet nowy dynamiczny rzeczy to tylko sztuczka kompilator nowe API (w przeciwieństwie Java where it's being proposed as a new opcode.)

Jeśli się mylę o tym, chciałabym wiedzieć!

+0

Musi być jeden (107), Reflector rzuca wyjątki na tym :) – leppie

4

Istnieje ogromna liczba zmian.

W samym CLR jest kilka zmian. Śmieciarka jest zmieniana w celu obsługi równoczesnego zbierania gen0/1 i gen2 w trybie stacji roboczej. Ponadto wprowadzono pewne zmiany w sposobie wdrażania zabezpieczeń. Struktura równoległa zmienia niektóre z implementacji CLR w wątku (który nie jest w pełni zarządzany, ale jest częścią samego środowiska wykonawczego). Wprowadzono również zmiany w systemie typów, związane głównie z nową obsługą PIA COM.

Największe zmiany to prawdopodobnie więcej zmian w bibliotece/strukturze szkieletu niż zmian CLR. takie jak integracja DLR z ramą i nowy typ dynamiczny. Pod względem frameworku masz reaktywne ramy, równoległe rozszerzenia bibliotek, umowy kodu, obsługę krotek i wiele drobnych zmian (np. Enum.TryParse, Lazy<T> i mnóstwo innych małych, ale miłych usprawnień).

+3

'dynamic' jest artefaktem C# i nie jest typem CLR. A o jakiej "integracji DLR z CLR" mówisz? DLR to po prostu biblioteka. –

+0

Prawda, mogę edytować moją odpowiedź. –

+0

Edytowane. Niektóre z nich wymagają jednak konkretnych zmian. –

0

Próbowałem patrząc na niektóre z nowych C# rzeczy w reflektor, aby zobaczyć, czy jest coś nowego antypodów:

  • dynamiczny typy są przeliczane na obiektu s, przez kompilator magii, która dodaje wywołania biblioteki do obsługi powiązań czasu wykonywania.
  • Parametry opcjonalne są obsługiwane przez kompilator. Jeśli wywołasz Foo (int x = 5), bez podania wartości x, zobaczysz wywołanie Foo (5) w Reflectorze.

Sądzę, że zmiany są niczym, co można łatwo zauważyć (jak ogólne wsparcie w CLR 2.0).

+1

Nie próbowałem typów dynamicznych, ale parametry opcjonalne działają dobrze nawet z .Net 2.0. Jedyne czego potrzebujesz to kompilator C# VS2010. Może nawet dynamika może działać. Nie jestem tego pewien. – Yogesh

+0

Nie, 'dynamic' wymaga DLR, a także C# binder dla tego w' Microsoft.CSharp'. Te pojawiają się tylko w wersji 4.0. –

+1

Zespoły występują tylko w .NET 4.0, ale to wszystko. Potrzebujesz tylko kompilatora, złożeń iw teorii powinieneś być w stanie uruchomić go na CLR 2.0. –

1

Wiele podstawowych interfejsów i typów delegatów w CLR zostało zaktualizowanych do wsparcia generic covariance and contravariance. Na przykład IEnumerable<T> został zmieniony na IEnumerable<out T>.

+1

To nie jest CLR (Common Language __Runtime__), to BCL (Base Class Library). CLR to VM. –

+0

Wystarczająco fair. Zmiany w popularnych interfejsach stanowiły aktualizacje BCL, aby skorzystać z nowej funkcji w CLR. –

+0

Ogólna współwystępowanie i kontrawariancja zostały dodane w .NET 2.0 i od tego czasu są dostępne w językach, które je obsługują (np. Eiffel.NET). Nie jest to nowa funkcja ani w VES, ani w CLR, to czysta funkcja C#. Jeśli BCL zostały napisane w Eiffelu zamiast C#, adnotacje wariancji mogły zostać dodane lata temu. (W rzeczywistości mogły one zostać dodane z krokiem przetwarzania kodu bajtowego lub czymś podobnym). –

Powiązane problemy