2009-07-17 23 views
8

sự hiểu biết của tôi là từ khóa static đã được giới thiệu để tương thích với .NET (cùng với strict)Từ khóa tĩnh của Delphi có bất kỳ điểm nào trong mã duy nhất không?

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

Sự khác biệt giữa thủ tục FirstSecond là: -

  1. First thể được ghi đè trong một lớp hậu duệ
  2. First chuyển một tham số tự tiềm ẩn tham chiếu đến lớp TExample.

Quy trình lớp Second không thể ghi đè và không chuyển tham số và do đó tương thích .NET. Vì vậy, có bất kỳ điểm nào trong việc sử dụng từ khóa static trong mã chỉ dành riêng cho bản địa bây giờ có sự phân kỳ giữa cú pháp lăng kính Delphi & Prism không?

Trả lời

20

Static class methods have no hidden class reference argument. Bởi vì điều này, chúng được gán tương thích với các con trỏ hàm đồng bằng cũ và do đó có thể được sử dụng để tương tác với API Windows và các API C khác. Ví dụ:

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; 

(. Tất nhiên, bạn có thể đã sử dụng một chức năng toàn cầu thay thế, nhưng không phải là chức năng toàn cầu, chức năng lớp tĩnh có một liên kết rõ ràng với một lớp)

3

với tĩnh, nhanh hơn một chút. Có một add esp, -8 trong phương pháp Đầu tiên không có trong Thứ hai.

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. 

Đầu tiên:

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 

Thứ hai:

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 

Nói tóm lại - Tôi thấy không có lý do.

+0

Cái này là cái đầu tiên tiết kiệm eax. Có lẽ một số phần mở đầu được mã hóa cứng trong trình biên dịch. IOW apparantly đầu tiên có một tham số và thứ hai không. Nó có thể giảm đến cùng với tối ưu hóa mặc dù. –

Các vấn đề liên quan