可能重复:
Delphi的"with"有什么问题
我在调试BDS 2006中使用'WITH'语句的代码时遇到问题调试器不会在类或记录中显示变量的值.我做错了什么或者BDS 2006有错误吗?
type
TNumber = class
Num: Integer;
end;
implementation
{$R *.dfm}
var
MyNumber: TNumber;
procedure TForm2.FormCreate(Sender: TObject);
begin
MyNumber := TNumber.Create;
MyNumber.Num := 10; /// MyNumber.Num Can be seen with debugger
with MyNumber do
begin
Num := Num +1 ; /// Num is not seen by the debugger
MyNumber.Num := Num +1 ; /// MyNumber.Num is seen but Num is not seen by the debugger
end;
end;
Run Code Online (Sandbox Code Playgroud)
编辑:
当然可以使用变量的全名但是如果你有一个具有多个级别的复杂结构,事情会变得非常混乱
Cru*_*han 17
With许多其中一种语言特征被认为属于"仅仅因为你拥有它并不意味着你必须使用它"类别.有极少数场合我给它的房子,房间-我发现一个或两种情况下,它的使用非常复杂的多层次结构,编译器在哪里并不完全如你所期望离不开使用时是必不可少的它更容易包含,但在德尔福编码的10年中,我认为这些可以用一只手的手指来计算.
它确实倾向于在示例中得到相当多的使用,因为代码看起来更清晰,但实际上,在查看您没有编写或未使用的代码时,确定变量是简单还是结构的一部分会对维护产生影响一段时间很容易超过这一点.在我使用过的每个版本的Delphi上调试器的已知问题都是关键.
当鼠标悬停在变量上时,调试器无法在您要检查的源代码中显示的变量与相关的with语句之间建立连接.您必须检查debug-watch窗口中的值并在那里指定完整变量,例如MyNumber.Num.
with语句的调试问题是已知的.这是我看到它们时删除它们的原因之一.在我看来,你不应该以可维护性为代价来提高编码速度.
我看到很多(并且学会讨厌)的常见结构是:
with TMyObject.Create do
try
Method1(blah, blah, blah);
Method2(blah, blah, blah);
finally
Free;
end;
Run Code Online (Sandbox Code Playgroud)
甚至可以在with语句中添加更多构造:
with A, B, C, D do
// Aargh!
Run Code Online (Sandbox Code Playgroud)
但话说回来,如果你可以替换有时使用with语句的有效用途:
A.B.C.D.E.Method1;
A.B.C.D.E.Method2;
A.B.C.D.E.Method3;
A.B.C.D.E.Method4;
A.B.C.D.E.Method5;
A.B.C.D.E.Method6;
Run Code Online (Sandbox Code Playgroud)
同
with A.B.C.D.E do begin
Method1;
Method2;
Method3;
Method4;
Method5;
Method6;
end;
Run Code Online (Sandbox Code Playgroud)
尽管使用A.B.C.D.E有点疑问,但它往往是"delphi方式".但现在有了助手,我们可以拥有一个完美有效的解决方案:
TAHelper = class helper for TA
public
procedure Method1;
endl
procedure TAHelper.Method1;
begin
// You can (should) add sanity checks here.
B.C.D.E.Method1;
end;
Run Code Online (Sandbox Code Playgroud)
所以现在你可以使用:
A.Method1;
Run Code Online (Sandbox Code Playgroud)
在我看来哪个好多了.
我很少使用With..do,并倾向于这样做
var
Sc : TE_Type;
begin
Sc := A.B.C.D.E;
sc.Method1;
sc.Method2;
sc.Method3;
sc.Method4;
sc.Method5;
sc.Method6;
end;
Run Code Online (Sandbox Code Playgroud)
当然,Sc的一个不错的名字也不会受到伤害.而且我认为它比使用和调试器发现自己更好更清楚.所以,我非常喜欢'快捷'变量.
| 归档时间: |
|
| 查看次数: |
1287 次 |
| 最近记录: |