C# címkéhez tartozó bejegyzések

Delphi Prism – Mit tud, amit a C# nem?

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.