Listing 1 uses System.ComponentModel; extension method Object.TryConvert(out target: T): Boolean; begin var sourceType := typeOf(self); var destinationType := typeOf(T); var sourceConverter: TypeConverter := TypeDescriptor.GetConverter(self); if assigned(sourceConverter) and sourceConverter.IsValid(self) and sourceConverter.CanConvertTo(destinationType) then begin try target := T(sourceConverter.ConvertTo(self, destinationType)); exit true; except end; end; var destinationConverter := TypeDescriptor.GetConverter(destinationType); if assigned(destinationConverter) and destinationConverter.CanConvertFrom(sourceType) then begin try target := T(destinationConverter.ConvertFrom(self)); exit true; except end; end; exit false; end; // Listing 1 Listing 2 method MyClass.GetEvenNumbers: sequence of Int32; iterator; begin for i: Int32 := 0 to Int32.MaxValue step 2 do yield i; end; method MyClass.UseEvenNumbers; begin for each number in self.GetEvenNumbers do begin Console.WriteLine(number.ToString()); if number > 500 then break; end; // alternative Schreibweise zur Erläuterung: var enumerator := self.GetEvenNumbers().GetEnumerator(); while enumerator.MoveNext do begin Console.WriteLine(enumerator.Current.ToString()); if enumerator.Current > 500 then break; end; end; // Listing 2 Listing 3 method MyClass.CreateAndUseAnAnonymousMethod: Integer; begin // Deklaration der anonymen Methode: var theAnonymousMethod := method(a: integer; b: integer): integer; begin exit a + b; end; // Der Compiler mach daraus eine eigene Methode und die Zuweisung: // var theAnonymousMethod := @self.CompilerGeneratedMethodName; // Verwendung bzw. Aufruf: result := theAnonymousMethod(1, 2); end; Listing 3 Listing 4 uses System.Collections.Generic; extension method IEnumerable.MyWhere(condition: Predicate): IEnumerable; iterator; begin for each element in self do begin if condition(element) then yield element; end; end; method MyClass.UseEvenNumbers; begin for each number in self.GetEvenNumbers.MyWhere(n -> n > 30) do begin Console.WriteLine(number.ToString()); if number > 50 then break; end; end; // Listing 4 Listing 5 class method ConsoleApp.Main(args: array of String); begin for each elem in typeOf(String).Assembly.GetTypes() .Where(t -> t.IsPublic) .Select(t -> new class( Name := t.Name, AssemblyName := t.Assembly.FullName, IsAbstract := t.IsAbstract )) do begin Console.WriteLine(if elem.IsAbstract then 'Abstract TYPE' else String.Empty + elem.Name + ", " + elem.AssemblyName); end; Console.ReadKey; end; // Listing 5 Listing 6 var addressesToPrint := from entry in AddressList where entry.ZipCode < 12345 and entry.City.StartsWith(“A“) order by entry.Name select entry.Name, entry.Street, entry.ZipCode, entry.City skip 20 take 10; var addresses := AddressList .Where(a -> a.ZipCode < 12345 and a.City.StartsWith(“A”) .OrderBy(a -> a.Name) .Select(a -> new class(Name := a.Name, Street := a.Street, City := a.City)) .Skip(20) .Take(10); // Listing 6 Listing 7 method MyClass.AssignEventHandlers; begin var btn := GetReferenzeToJavaSwingButton(); // erster Fall: Methode auf diesem Objekt als handler var eventHandlerOnThisObject := new interface ActionListener(actionPerformed := @self.HandleActionPerformed); btn.addActionListener(eventHandlerOnThisObject); // zweiter Fall: Komplett inline, inkl. Implementierung btn.addActionListener(new interface ActionListener(actionPerformed := ae -> Button(ae.GetSource()).Text := 'Clicked')); end; method MyClass.HandleActionPerformed(ae: ActionEvent); begin Button(ae.GetSource()).Text := 'Clicked'; end; Ende Listing 8 MyClass = class(ISomeInterface, ISomeOtherInterface, IFoo) private var fHolder := new SomeInterfaceImplementer; readonly; public implements ISomeInterface; var fOtherHolder := SomeOtherInterfaceImplementer; readonly; implements ISomeOtherInterface; method DoSomething; implements IFoo.DoFoo; end; Ende Listing 9 ISoftButton = soft interface property Caption: String; property Enabled: Boolean; event OnClick: EventHandler; end; Ende Seite 3, Druckdatum: 10.11.2011, 10:57 Uhr