質問

最近、私はいつでも長方形変数を使用していることに気づいています と...します 声明、それは何らかの理由でまったく機能しません。

例えば:

var bounds:=new Rectangle(0,0,0,0);

with bounds do
begin
  X:=1;
  Y:=2;
  Width:=33;
  Height:=44;
end;

Boundsの値はゼロのままです。ただし、次のことを行うと、うまく機能します。

var bounds:=new Rectangle(0,0,0,0);

bounds.X:=1;
bounds.Y:=2;
bounds.Width:=33;
bounds.Height:=44;

それがそうする理由はありますか。

役に立ちましたか?

解決

ハンス・パサントが暗示しようとしているのは、「with」ステートメントが境界のコピーを作成し、それに取り組み、それを捨てることです。私はそれを確認するのに十分な情報を持っていませんが、それはありそうもないと感じています - Delphiの割り当てオペレーターは参照によって機能しますので、暗黙の浅いコピーは実際にはそれほど頻繁に発生しません。

ただし、「with」ステートメントは、意図的に特別な種類の可変スコーピング地獄を作成します。境界内のフィールドをつかむことも、含有方法からフィールドをつかむことも、以前の「閉鎖されていない」ステートメントでフィールドをつかむこともできます。自動リファクタリングはステートメントで触れられません。クラスにフィールドを追加すると、ステートメントが動作する可能性があります 君の 方法。

検討

with myLongNamedComponent.anotherLongNamedChild.pedanticRectangle do
begin
    x:=1;
    y:=2;
    width:=33;
    height:=44;
end;

これは実際にはASとして書かれています

var bounds := new Rectangle(0,0,0,0);
bounds.x := 1;
bounds.y := 2;
bounds.width := 33;
bounds.height := 44;
myLongNamedComponent.anotherLongNamedChild.pedanticRectangle := bounds;

TL:dr; 「with」ステートメントは、優れたコーディングプラクティスとは見なされなくなりました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top