Имеет ли статическое ключевое слово Delphi какой-либо смысл в нативном коде? - PullRequest
8 голосов
/ 17 июля 2009

Насколько я понимаю, ключевое слово static было введено для совместимости с .NET (наряду с strict)

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

Различия между процедурами First и Second заключаются в следующем: -

  1. First может быть переопределено в классе-потомке
  2. First передает неявный собственный параметр, ссылающийся на класс TExample.

Процедура классаSecond не может быть переопределено и не передает параметров и, следовательно, является .NET-совместимым.Так есть ли смысл использовать ключевое слово static в коде, предназначенном только для нативного кода, теперь, когда есть расхождение между синтаксисом Delphi & Prism?

Ответы [ 2 ]

21 голосов
/ 17 июля 2009

Методы статического класса не имеют скрытого аргумента ссылки на класс . Из-за этого они совместимы по присваиванию с простыми указателями старых функций и поэтому могут использоваться для взаимодействия с Windows API и другими API C. Пример:

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;

(Конечно, вы могли бы вместо этого использовать глобальную функцию, но кроме глобальных функций статические функции класса имеют четкую связь с классом.)

4 голосов
/ 17 июля 2009

со статическим, это немного быстрее. В методе First есть один add esp, -8, которого нет во втором.

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.

Во-первых:

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 

Второе:

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

Короче - не вижу причины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...