2011-11-30 21 views
4

最近,我一直注意到,我隨時使用Rectangle變量With ... do聲明,因爲某種原因它根本不起作用。爲什麼不......與語句和矩形一起工作完美無瑕?

例如:

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

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

界限值保持零沒有什麼在with語句。但是,如果我執行以下操作,效果會很好。

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

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

是否有任何理由這樣做。

+4

發現該值類型不像引用類型那樣行爲是任何.NET程序員的學習曲線。您正在更新副本。馬虎,編譯器沒有警告你。 –

+0

@digitalanalog你使用了什麼棱鏡版本?我剛剛嘗試過,最新的和它的作品。 –

+0

它是4.0.25版本。 – ThN

回答

1

Hans Passant試圖暗示的是,「with」語句會創建一個邊界副本,對其進行處理,然後將其拋棄。我沒有足夠的信息來驗證,但我認爲這不太可能--Delphi的賦值運算符通過引用工作,所以隱式淺拷貝實際上並不經常發生。

但是,「with」語句有意創建了一種特殊的變量範圍地獄。你可以在邊界內抓取一個字段,或者你可以從包含的方法中抓取一個字段,或者你甚至可以從先前未封閉的「with」語句中抓取一個字段。自動重構不能觸及with語句。在with語句操作的類中添加一個字段可以打破您的方法。

考慮

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

這實際上是更好的寫法如下

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」語句不再被認爲是良好的編碼習慣。

+0

感謝您的最後一點信息。你的回答非常有幫助。謝謝。 – ThN

相關問題