2

私はこのコードを使用して、TStringListが作成されているかどうかを確認しています。

procedure TForm1.Button1Click(Sender: TObject);
var

  sVariable : TStringList;
begin
   if not Assigned(sVariable) then
   sVariable:= TStringList.Create;
end; 

しかし、条件はFalse常にあります、なぜそれが起こるのですか?TStringListオブジェクトが作成されているかどうかを確認するにはどうすればよいですか?

追伸私は同様の質問を知っています、私はその質問に投稿された解決策を試しましたが、それは私にとってはうまくいきません。

4

5 に答える 5

15

スタックにオブジェクト参照を割り当てると、ランダムな値で埋められます(つまり、スタック上の以前の値-一部の境界の場合はnilになる可能性があります)。これは仕様によるものです。

変数が初期化されているかどうかを確認するには、最初に手動でに設定する必要がありnilます。これは非常に高速な割り当てです。

一般的なコードパターンは次のとおりです。

procedure TForm1.Button1Click(Sender: TObject);
var
  sVariable : TStringList;
begin
  sVariable := nil; // initialize explicitely
  try
    (...) // in this hidden part sVariable may be instantiated
    if not Assigned(sVariable) then // instantiate if not already done
      sVariable:= TStringList.Create; 
    (...)
  finally
    sVariable.Free; // will do nothing if sVariable=nil
  end;
end; 

上記のコードにはtry...finally、メモリを解放するための(必須のIMHO)ブロックが含まれていることに注意してください。割り当てられていない場合sVariableでもnil、割り当てられており、この場合sVariable.Freeは何もしません。これは、Delphiの通常のベストプラクティスパターンです。

于 2011-11-04T10:53:45.300 に答える
8

オブジェクトが作成されておらず、変数がガベージで初期化されていると想定できます(ローカル変数であるため)。StringListを作成するだけで、すべて問題ありません。

于 2011-11-04T10:35:20.790 に答える
7

まず第一に、あなたが公開したコードは意味がありません。sVariableはローカル変数であるため、常に初期化されていません。ただし、object-scopeの変数とは異なり、初期化されていないということは、それがnilであることを意味するわけではありません。Delphiはローカル変数をnilに設定しません。したがって、sVariableには完全にランダムな値が含まれます。Assigned()は、値がnilであるかどうかのみをチェックし、オブジェクトの有効なインスタンスを指しているかどうかはチェックしません。

于 2011-11-04T10:48:04.723 に答える
3

ローカル変数なので、これを直接行うことができます

procedure TForm1.Button1Click(Sender: TObject);
var
  sVariable : TStringList;
begin
  sVariable:= TStringList.Create;
end;
于 2011-11-04T10:39:40.277 に答える
3

質問を更新した後、私が見るものは非常に正常なようです。

オブジェクト変数(sVariable)を定義すると、初期化されません。これは、Createコンストラクターを使用する必要があります。この場合、それが存在するかどうかを確認する必要はありません。

procedure TForm1.Button1Click(Sender: TObject);
var
  sVariable : TStringList;
begin
   sVariable:= TStringList.Create;
   //Work with the stringlist e.g add items:
   sVariable.Add('Blah');
   //Make sure it finally gets freed 
   sVariable.Free;
end; 
于 2011-11-04T10:41:40.837 に答える