在delphi中为分支声明块级变量

Vib*_*nRC 4 delphi

在Delphi prism中,我们可以声明仅在特殊场合需要的变量.

例如:在棱镜中

 If acondition then
     begin
        var a :Integer;
     end;
    a := 3; //this line will produce error. because a will be created only when the condition is true
Run Code Online (Sandbox Code Playgroud)

这里'a'不能与3分配,因为它嵌套在分支内.我们如何声明一个只能在delphi win32中的分支内部使用的变量.所以我可以减少内存使用量,因为它只在某个条件成立时才会被创建;

如果减少内存使用不是问题我们有什么缺点(或者我们没有)

spl*_*ash 8

Delphi不支持Java中的局部变量声明语句的概念,但您可以声明一个子过程:

procedure foo(const acondition: boolean);

  procedure subFoo;
  var
    a: integer;
  begin
    a := 3;
  end;

begin
  If acondition then
  begin
    subFoo;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

  • 你怎么说太长了?如果"a"代表一个大的内存使用变量,例如:TVeryBigArray肯定值得额外的开销吗?也许您应该像Lieven所评论的那样查看代码的其他方面. (4认同)
  • 我真的不知道你在这里得到了什么,你真的只想输入更少的字符吗?如何移动声明有帮助?如果已经太久了?好吧,抱歉,Delphi/Pascal是一种"罗嗦"的语言,它使得维护和阅读变得容易.它可以做聪明的事情,只是不是这个特殊的派对技巧. (2认同)
  • 对于具有名称的子过程+1,并在代码中引入可读性和清晰度.我希望Delphi不要支持块作用域变量. (2认同)
  • 单通道和局部范围没问题.这样的功能是可选的.我现在告诉你我不会强迫你使用这样一个新功能. (2认同)

Rob*_*edy 8

你的问题的前提是错误的.您假设在允许块级变量的语言中,当控制进入或离开这些变量的范围时,程序会为这些变量分配和释放内存.因此,例如,您认为何时acondition为真,程序会调整堆栈,以便在a变量进入该块时为变量腾出空间.但你错了.

编译器计算所有声明的变量和临时变量所需的最大空间,然后在进入函数时保留那么多空间.分配该空间就像调整堆栈指针一样简单; 所需时间通常与预留的空间量无关.最重要的是,你的想法实际上不会节省任何空间.

块级变量的真正优势在于它们的范围有限.

如果您确实需要某些变量仅在一个代码分支中有效,那么请将该分支分解为单独的函数并将变量放在那里.