Archive for the ‘.NET 2.0 SP1’ Category

C# 3 features med .NET 2

Thursday, September 11th, 2008

Skønt C# 3 efterhånden har været ude længe, hører jeg ofte spørgsmål vedrørende hvilke af de nye features, der kræver .NET 3.5. En del af forvirringen skyldes, at de enkelte komponenter har eget versionsnummer, hvilket er årsag til en del misforståelser. Jeg har forsøgt at redde trådene ud i dette indlæg, men i håb om at gøre det helt klart har jeg lavet nedenstående oversigt.

Hvis der står “Ja” i højre kolonne, kan man således tage en .NET applikation, der benytter den aktuelle feature og afvikle den på en maskine, der kun har .NET 2 installeret.

C# 3 Feature Fungerer på .NET 2
Automatisk implementerede properties Ja
Implicit erklærede lokalvariable Ja
Udvidelsesmetoder Nej*
Udvidelsesmetoder kræver ExtensionAttribute, der er defineret i System.Core.dll, som er i .NET 3.5.

* se her

Lambda-udtryk Ja
Object initializers Ja
Array initializers Ja
Implicit erklærede arrays Ja
Partial methods Ja
LINQ Nej
Kræver reference til System.Linq.dll, som er i .NET 3.5

Det var en fejl

Friday, February 15th, 2008

For knap et år siden beskrev jeg, hvordan instanser af Control-klassen ikke blev ryddet ordentlig op. Jeg konkluderede, at den opførsel, vi kunne konstatere ved et lille testprogram og en tur i WinDbg, gav anledning til en del undren, men jeg kunne ikke forklare, hvorfor det forholdt sig som tilfældet var.

På det tidspunkt var jeg tilbageholdende med at kalde fænomenet for en fejl, og det var min antagelse, at i praksis ville det ikke betyde det store, eftersom at oprydningen faktisk blev udført, hvis vi blot huskede at kalde CreateControl() på instansen. WinForms er ret funky, og der foregår en masse bag facaden, så min antagelse var, at det nok var mere sandsynligt, at der skulle være et eller andet jeg havde overset, end at der faktisk skulle være en fejl i noget så basalt som Control-klassen. På det tidspunkt var min teori, at problemet var relateret til brugen af CreateControl() og Dispose(). Min ide var, at Controls (eller rettere baseklassen Component) fik en eller anden speciel behandling af CLRen.

Jeg tog fejl. Ser vi listen af rettelser i Service Pack 1 til .NET Framework 2.0 igennem, finder vi nemlig følgende: FIX: A memory leak may occur when you create and then delete Windows form control objects in an application that is built on the .NET Framework 2.0. Der var altså blot tale om en banal fejl. Opretter man instanser af Control, bliver de ikke ryddet op. Jeg kunne altså have påpeget problemet helt uden at se på Dispose() og CreateControl(). Jeg kan dog stadig ikke forklare, hvorfor jeg kunne konstatere, at et kald til CreateControl() kunne gøre en forskel, men det forhold har sikkert være årsag til at fejlen ikke har skabt større opmærksomhed.