在Delphi 2006中使用'WITH'语句调试问题

Cha*_*iga 6 delphi

可能重复:
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上调试器的已知问题都是关键.

  • 我很想看到有必要的例子......我已经完成了Delphi 10年了,根据Fabricio的回答,已经花了9.5个删除WITH子句,并替换别名 (3认同)

Hol*_*rwa 8

当鼠标悬停在变量上时,调试器无法在您要检查的源代码中显示的变量与相关的with语句之间建立连接.您必须检查debug-watch窗口中的值并在那里指定完整变量,例如MyNumber.Num.

  • 我觉得"不能"太慷慨了.我会说它"没有"设计. (2认同)

Too*_*the 6

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)

在我看来哪个好多了.


Mas*_*ler 6

语句语法阿斯巴甜:它的味道像很多语法糖,但留下一个不好的回味和原来实际上是在长期内对人体有害.最好不要使用它.


Fab*_*ujo 5

我很少使用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的一个不错的名字也不会受到伤害.而且我认为它比使用和调试器发现自己更好更清楚.所以,我非常喜欢'快捷'变量.