Ссылочный экземпляр объекта создал использование “с” в Delphi

Команда Scio предоставила решение этой проблемы. В основном добавьте --nullableCoders=true в аргумент командной строки.

8
задан 26 April 2009 в 17:15
поделиться

5 ответов

Ну, вы можете использовать такой подход:

// implement:

type
  TSimpleMethod = procedure of object;

function GetThis(const pr: TSimpleMethod): TObject;
begin
  Result := TMethod(pr).Data;
end;

// usage:

  with TStringList.Create do
  try
    CommaText := '1,2,3,4,5,6,7,8,9,0';
    ShowText(TStringList(GetThis(Free)));
  finally
    Free;
  end;

или помощники класса:

type 
  TObjectHelper = class helper For TObject
  private
    function GetThis: TObject; Inline;
  public
    property This: TObject read GetThis;
  end;

...

function TObjectHelper.GetThis: TObject;
begin
  Result := Self;
end;

Но, на самом деле, предыдущие ответы верны: вам лучше забыть об утверждении «с».

15
ответ дан 5 December 2019 в 05:19
поделиться

Вы никогда не должны использовать с , потому что будущие изменения могут внести в эту область больше, чем вы предполагали.

Возьмите это, например:

procedure Test;
var
    x: Integer;
begin
    with TSomeObject.Create do
    begin
        DoSomethingWithX(x);
        Free;
    end;
end;

, а затем позже вы добавляете свойство X в класс TSomeObject. Теперь, какой X вы думаете, он будет использовать? Локальная переменная или свойство X объекта?

Лучшее решение всегда состоит в том, чтобы просто создать локальную переменную с коротким именем и присвоить объекту псевдоним этой переменной.

procedure Test;
var
    x: Integer;
    o: TSomeObject;
begin
    o := TSomeObject.Create;
    o.DoSomethingWithX(x);
    o.Free;
end;
12
ответ дан 5 December 2019 в 05:19
поделиться

Вы сами ответили: объявите локальную переменную. Если вы хотите, вы можете использовать для этого ключевое слово с .

var
  MyInstance: TMyObject;
begin
  MyInstance := TMyObject.Create;
  with MyInstance do
  try
    Foo;
    Bar;
    DoSomething(MyInstance);
  finally
    Free;
  end;
end;

В приведенном выше примере единственной причиной использования с является читаемость кода, которая очень субъективна, вы также можете отказаться от с ключевым словом и используйте MyInstance напрямую. Это просто вопрос личного вкуса. Я не согласен с ответами «никогда не использовать с», но вы должны знать о его недостатках.

См. Также этот вопрос: Является ли ключевое слово delphi «with» плохой практикой?

3
ответ дан 5 December 2019 в 05:19
поделиться

В дополнение к примеру Брайана о обработчике уведомлений используется абсолютная переменная (только для win32):

procedure Notify( Sender : TObject ); 
var 
  Something : TSomeThing absolute Sender;
begin 
  if Sender is TSomething then 
  begin
    VerySimpleProperty := Something.Something;
    OtherProperty := Something.SomethingElse;
  end;
end;

Он в основном избегает необходимости присваивать локальную переменную или иметь много типов типов.

2
ответ дан 5 December 2019 в 05:19
поделиться

Я усвоил трудный путь - используйте «С» только в следующих сценариях:

With TMyForm.Create( Owner ) do
  try
    ShowModal
  finally
    Free;
  end;


procedure Notify( Sender : TObject );
begin
  With Sender as TSomething do
    VerySimpleProperty := Something      
end;

, т.е. сохраняйте видимость С как можно более простой.

1
ответ дан 5 December 2019 в 05:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: