Ha próbálta már használni valaki élesben mindkettőt, akkor tudja igazán mérlegelni, hogy melyikkel egyszerűbb és rövidebb kódot írni. Lehet a sok begin…end idegesítő egyeseknek, de azon kívül nincs olyan feature, ami egy fokkal kevesebb értékűvé tenné a C#-al szemben, épp ellenkezőleg… Egyszer írtam már egy hasonló összehasonlítást, de most kiegészítem még néhány dologgal:
Named indexed properties | A C# csak a default indexelt tulajdonságokhoz tud hozzáférni. Delphi Prismben te tudsz definiálni és használni egyéb indexelt tulajdonságokat is a nevük által. |
Sets | Egy halmaz egy kollekciója azonos típusú ordinálás értékeknek. A halmaz kényelmes módja tárolni és hozzáférni értékekhez, melyek összetartoznak. További részletek… |
Parallel Support |
Ellátva az async kulcsszóval egy metódust az automatikusan egy külön szálon fog futni. Ha a metódus visszaad értékeket, akkor az egy Future-é fog válni. |
Colon Operator | Ez alapvető a mi nullázható típus támogatásunkhoz, de ugyanúgy meglepően hasznos fícsör az általános kódoláshoz. Alapvetően ahelyett, hogy használnánk a ‘.’, hogy hozzáférjünk tagokhoz és kapjunk egy NullReferenceException-t, inkább használjuk a ‘:’ operátort és a hívás elhagyott lesz, ha a referencia nil, illetve nil-t fog visszaadni, ha szükséges visszatérési érték.
IDisposable(SomeObject):Dispose; // only call dispose if the interface is implemented. x := Button:Parent:Parent:Parent // access the 3rd parent of a control, where any level might be nil. |
Inline Property Accessors | Definiálj egyszerű tulajdonságokat az osztály deklaráción belül extra setterek/getterek nélkül.
property Foo: string; // Local field is implied; property Right: Integer read Left + Width; // Reader expression is provided in line. |
Class Contracts | 1. Publikus invariantok 2. Require, Ensure (pre/post conditions) Ezt nem részletezem, mert van már .NET 4.0-ba is, csak nem a nyelvbe építve. |
Class References | Definiállj “class of X” típusokat és virtuális osztály-metódusokat, hasonlóan a Delphi for Win32-höz. |
“implies” operator | Ez a leghasznosabb operátor invariantokhoz vagy pre/post conditionökhöz. Alapvetően a második rész csak akkor szükséges, hogy legyen igaz, ha az első is az. Ha az első hamis, a teljes kifejezés igaz. Illusztrálva:
require assigned(Customer) implies Customer.CreditRatio > 5; Ez fordul a következőbe: require not Assigned(Customer) or (Customer.CreditRatio > 5); C fejlesztőknek az Assigned nem biztos, hogy világos. Majdnem az, mint a <> nil, vagy != null, csak ez tulajdonképp egy compiler intrinsic függvény, ami automatikusan annak megfelelő szintaxist választ, hogy milyen típust vizsgál. Ha egy eventet, akkor pl. automatikusan @Click <> nil,de ez valójában csak a Delphi Win32-vel való kompatibilitás miatt van itt. |
“case type of” | Írj egy switch/case statement-et ami futtat különböző eseteket attól függően, hogy mi a típusa az adott objektumnak:
case type MyControl of: Edit: // do something Button: // do something else end; |
Property Notifications | Ezek megmentek rengeteg felesleges kódolástól. Kapcsold a “notify” kulcsszót egy tulajdonsághoz, mint direktívát (mint pl. a virtual), és a compiler automatikusan generál minden infrastruktúrát és interfészt ami szükségelt a property notification-höz. (C#-ban neked szükséges implementálni gettereket/settereket, hozzáadni az interfészt az osztályhoz, stb.) |
Enhanced Nullable Types | Ellenben a C#-al, a Delphi Prism compiler ad teljes támogatást a nullázható típusokhoz. Te megtudod hívni az ő tagjaikat és használni őket kifejezésekben. Kiterjesztett támogatás van a nullázható kifejezésekhez. Ha például egy aritmetikai kifejezésnek bármely része nullázható, a teljes kifejezés nullázhatóvá válik. Amennyiben bármely rész null, a teljes kifejezés válik nullá.
x: nullable Integer; y: Integer; var a := x + y; // Result is a nullable Integer. var b := 5 * x; // If x is null, so is b. |
Improved “for each” loop |
for each matching x: Button in Controls do // Only run loop for buttons. // Use i to count; also type of x is inferred // automatically from type of "Controls", if its a generic enum for each x in Controls index i do |
“locked” directive | A locked direktíva engedi metódusoknak, eseményeknek és tulajdonságoknak, hogy legyenek deklaráltak impliciten thread safe-nek. |
Extended Constructor Calls | Állíts be tulajdonságokat, mint részeit a konstruktor hívásnak. Ez különösen hasznos, amikor nem rendeled hozzá az létrehozott objektumra hivatkozó referenciát egy lokális referenciához. Például:
Controls.Add(new Button(Width := 100; Height := 50)); Enélkül szükség lenne egy átmeneti temp változóra a gombhoz. Ez már lehetséges a C# 3.0-al is. |
Boolean Double Comparison |
if 0 <= x < Count then // ... |
Iteration delegation | A yield kulcsszó támogatja a delegációját az iterátornak egy második szekvenciába. További részletek… |
Empty Methods | Ellátva az “empty” direktívával egy metódus interfész deklarációját nincs szükség definiálni az üres metódus testet. |
Exception Filters | Kapj el kiválaszott kivételeket nem csak típus, hanem bármilyen egyéni feltétel alapján. (Ez a feature támogatt VB.NET által, de a C# által nem) |
Raising/Firing Events | Te megtudod határozni a láthatóságot az esemény kiváltáshoz/eltüzeléshez. A C#-ban csak az osztály, ami definiálja az eseményt tudja eltüzelni azt. Kívülről csak az add/remove handlerekkel tudod ezt megtenni. Viszont Delphi Prismbe tudod írni a következő kódot és a leszármazottak el tudják tüzelni az eseményt:
public event Foo: EventHandler protected raise; |
Illetve a korábban már bemutatott feature lista: C# vs. Delphi Prism. Én kezdek odáig lenni ezért a nyelvért, tényleg fantasztikus. Tudom, fúúúúj Pááászkááál… 😀 Én meg krix-kraxoktól kapot frászt. Nem azt mondom, lazán átlátom a C# kódot is, de kinek a pap, kinek a papné. Mint ahogy más a németet kedvelni, én inkább az angolt, ezért is inkább szeretem a begin…end-et, mint a krix-kraxokat.