なぜ…ステートメントと長方形は完璧に連携しないのですか?
-
26-10-2019 - |
質問
最近、私はいつでも長方形変数を使用していることに気づいています と...します 声明、それは何らかの理由でまったく機能しません。
例えば:
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」ステートメントは、優れたコーディングプラクティスとは見なされなくなりました。
所属していません StackOverflow