如何初始化局部变量使用的布尔类型?

Mik*_*nni 2 delphi boolean delphi-xe7

我试图改变我如何使用布尔参数来获得有意义的名称,所以我不需要检查每个方法的真/假意味着什么.在这个例子中我使用True/False:

procedure ProcessData(Param1, Param2: string; CreateOnEmpty: boolean = False);

procedure TForm1.Button1Click(Sender: TObject);
begin
  ProcessData(P1, P2, True);  // when CreateOnEmpty should be True
  ProcessData(P1, P2);        // when CreateOnEmpty should be False
  ProcessData(P1, P2, False); // when CreateOnEmpty should be False
end;
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,我需要查找ProcessData方法来查看True/False参数的含义.

所以,我从这个例子开始,为参数分配有意义的名字:

procedure TForm1.Button2Click(Sender: TObject);
var
  vCreateWhenEmpty: boolean;
  vDontCreateWhenEmpty: boolean;
begin
  // Init control params
  vCreateWhenEmpty := True;
  vDontCreateWhenEmpty := False;

  ProcessData(P1, P2, vCreateWhenEmpty);     // When CreateOnEmpty should be True
  ProcessData(P1, P2, vDontCreateWhenEmpty); // When CreateOnEmpty should be False
end;
Run Code Online (Sandbox Code Playgroud)

但是,我想避免初始化局部变量,并考虑这样的事情:

procedure TForm1.Button3Click(Sender: TObject);

Type
  TBoolTrue = Boolean = True;    // Init to True and all local vars will be True
  TBoolFalse = Boolean = False;  // Init to False and all local vars will be False

var
  vCreateWhenEmpty: TBoolTrue;      // Variable should default to True
  vDontCreateWhenEmpty: TBoolFalse; // Variable should default to False
begin
  ProcessData(P1, P2, vCreateWhenEmpty);     // When CreateOnEmpty should be True
  ProcessData(P1, P2, vDontCreateWhenEmpty); // When CreateOnEmpty should be False
end;
Run Code Online (Sandbox Code Playgroud)

所以,我可以跳过赋值True/False.

我有100个接受布尔参数的方法,所以我可以用作参数的100个常量或全局变量听起来有点过分.

是否有可能以某种方式将布尔类型初始化为True/False或避免使用其他技巧初始化局部变量?

编辑:

我在示例中重新设置了我将布尔类型设置为本地类型,我的意思是将它们设置为全局,因此它们只设置一次而不是每次在每个方法中设置.所以,这将是全球性的,而不是本地的:

Type
      TBoolTrue = Boolean = True;    // Init to True and all local vars will be True
      TBoolFalse = Boolean = False;  // Init to False and all local vars will be False
Run Code Online (Sandbox Code Playgroud)

编辑2:

我希望这个问题不会被解决,因为答案中有一些好的建议.所以我的选择是:

  • 全局常量(我最终将得到100个新常量)

  • 全局枚举字段(即使我最终会有100个字段,就像使用consts一样,如果我添加第三个值,它们可以更容易地扩展值)

  • 本地的consts(我喜欢这个,它是短的,每个const 1行,它是本地的,不是全局的)
  • 局部变量(每个变量2行,定义和值init - 太多)
  • 本地枚举字段(我喜欢这个字段,因为它可以使用第三个或第四个值进行扩展...)
  • Rufo先生的例子有自动初始化记录(虽然有点超过顶部,但正是我正在寻找的;不幸的是真的超过顶级实现;性能可能会被击中,但解决方案可用 - 很好)
  • 保持原样并依靠代码洞察来快速理解参数 - 遗憾的是,XE7不稳定且无法依赖; 也许在较新版本中更好,但从对较新版本的反馈来看,我怀疑它是否会按预期工作.

决策

尽管Rufo爵士关于如何做我想到的事情的诀窍是独一无二的,但我意识到我正在努力实现一些当前Delphi版本并不存在的东西.因此,我将使用consts和枚举类型的组合,并且仅在真正需要的地方应用,而不是在任何地方应用,并且将避免100个全局局部变量.

Ken*_*ite 10

没有办法自动初始化局部变量.你必须在代码中这样做,或者(尽管不想)使用const而不是类型,在与使用它们的函数相同的范围内声明.

const
  vCreateWhenEmpty = True;
  vDontCreateWnenEmpty = False;

procedure ProcessData(Param1, Param2: string; CreateOnEmpty: boolean = False);
Run Code Online (Sandbox Code Playgroud)

后来:

  ProcessData(P1, P2, vCreateWhenEmpty); 
  ProcessData(P1, P2, vDontCreateWhenEmpty);
Run Code Online (Sandbox Code Playgroud)

我个人会用带有公共前缀的枚举类型替换布尔变量.

type
  TProcessDataCreateOpt = (coCreate, coSkip);

  procedure ProcessData(Param1, Param2: string; CreateOpt: TProcessDataCreateOpt = coSkip);
Run Code Online (Sandbox Code Playgroud)

这使得它更具可读性,Code Insight和Code Completion可以帮助您获得正确的值,并且您根本不需要任何本地或全局变量.

  • 在这种情况下,枚举类型是完美的+1 (2认同)
  • @RemyLebeau:OP通过尝试创建两种类型然后创建两个预初始化类型的局部变量来有效地完成更多工作.这是四行代码(两个类型声明加上两个var声明),而不是enum的单个类型声明.问题本身就是一个XY问题; 使用枚举的正确设计意味着不存在所解决的问题. (2认同)

Uwe*_*abe 7

正如其他人所说,目前没有办法初始化局部变量,但真正的问题是为什么它应该是变量.根据您的代码,我的理解是,在代码中初始化这些变量后,它们永远不会改变它们的值.此方法也不会将这些参数声明为变量.在这种情况下,它也可以通过局部常量来完成(只是为了避免全局常量).因此,不要声明局部变量并在代码中初始化它们,而只是声明局部常量.

procedure TForm1.Button3Click(Sender: TObject);
const
  cCreateWhenEmpty = True;
  cDontCreateWhenEmpty = False;
begin
  ProcessData(P1, P2, cCreateWhenEmpty);     // When CreateOnEmpty should be True
  ProcessData(P1, P2, cDontCreateWhenEmpty); // When CreateOnEmpty should be False
end;
Run Code Online (Sandbox Code Playgroud)

从长远来看,我还建议使用声明的枚举类型作为参数,但如果您不能更改声明,上述解决方案应该很好地符合您的问题中提到的要求.