2009-07-17 14 views
8

Benim anlayış static kelime prosedürleri First ve Second arasındaDelphi'nin statik anahtar sözcüğünün yalnızca yerel kodda herhangi bir puanı var mı?

class TExample 
    class procedure First; 
    class procedure Second; static; 

farklılıkları (strict birlikte) .NET ile uyumluluk için tanıtıldı olmasıdır şunlardır: -

  1. First bir geçersiz kılınabilir
  2. First, TExample sınıfına başvuran örtülü bir self parametresi iletir.

Sınıf prosedürü Second geçersiz kılınamaz ve hiçbir parametre iletilmez ve bu nedenle .NET uyumludur. Yani, sadece yerel kodda static anahtar sözcüğünü kullanmanın bir anlamı var mı şimdi Delphi & Prism sözdizimi arasında bir ayrışma var mı?

cevap

20

Static class methods have no hidden class reference argument. Bu nedenle, düz eski işlev işaretçileriyle uyumlu atamalardır ve bu nedenle Windows API ve diğer C API'leriyle etkileşim için kullanılabilir. Örnek:

type 
    TForm = class 
    private 
    class function NonStaticWndProc (wnd: HWND; Message: Cardinal; 
     wParam: WPARAM; lParam: LPARAM): LRESULT; 
    class function StaticWndProc (wnd: HWND; Message: Cardinal; 
     wParam: WPARAM; lParam: LPARAM): LRESULT; static; 
    procedure RegisterClass; 
    end; 

procedure TForm.RegisterClass; 
type 
    TWndProc = function (wnd: HWND; Message: Cardinal; 
    wParam: WPARAM; lParam: LPARAM): LRESULT; 
var 
    WP: TWndProc; 
    WindowClass: WNDCLASS; 
begin 
    //WP := NonStaticWndProc; // doesn't work 
    WP := StaticWndProc; // works 
    // ... 
    TWndProc (WindowClass.lpfnWndProc) := WP; 
    Windows.RegisterClass (WindowClass); 
end; 

(. Tabii ki, küresel bir işlevi yerine kullanılmış olabilir, ancak küresel fonksiyonların dışında, statik sınıf fonksiyonları bir sınıf ile açık bir ilişki var)

3

statik ile biraz daha hızlıdır. Yöntemde bir add esp, -8 var. İlk önce burada yok.

İlk
program staticTest; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils; 

type 
    TExample=class 
    class procedure First; 
    class procedure Second; static; 
    end; 


{ TExample } 

class procedure TExample.First; 
var 
    i : Integer; 
begin 
    i:=61374; 
end; 

class procedure TExample.Second; 
var 
    I : Integer; 
begin 
    i:=44510; 
end; 

begin 
    { TODO -oUser -cConsole Main : Hier Code einfügen } 
    TExample.First; 
    TExample.Second; 
end. 

: İkinci

staticTest.dpr.20: begin 
00408474 55    push ebp 
00408475 8BEC    mov ebp,esp 
00408477 83C4F8   add esp,-$08 ;This is the line I mentioned 
0040847A 8945FC   mov [ebp-$04],eax 
staticTest.dpr.21: i:=61374; 
0040847D C745F8BEEF0000 mov [ebp-$08],$0000efbe 
staticTest.dpr.22: end; 
00408484 59    pop ecx 
00408485 59    pop ecx 
00408486 5D    pop ebp 
00408487 C3    ret 

: Kısacası

staticTest.dpr.27: begin 
00408488 55    push ebp 
00408489 8BEC    mov ebp,esp 
0040848B 51    push ecx 
staticTest.dpr.28: i:=44510; 
0040848C C745FCDEAD0000 mov [ebp-$04],$0000adde 
staticTest.dpr.29: end; 
00408493 59    pop ecx 
00408494 5D    pop ebp 
00408495 C3    ret 
00408496 8BC0    mov eax,eax 

- Ben neden göremiyorum.

+0

şeydir ilki olduğunu eax kaydeder. Derleyicide muhtemelen kodlanmış bazı prologlar var. IOW ilk önce, bir parametre vardır ve ikinci değil. Yine de optimizasyon ile aynı duruma düşebilir. –

İlgili konular