纠正'in'运算符的使用

klu*_*udg 11 delphi

请考虑以下过程

procedure InTests;
var
  N, K: Integer;

begin
  N:= 1111;
  if N in [6, 8, 10]          // this is correct, readable and effective code
    then ShowMessage('OK');

  K:= 11;
  if N in [6, 8, 10, K]       // this is correct but less effective
    then ShowMessage('OK');   //  (compiler creates local 16-bytes set var)

  K:= 1111;
  if N in [6, 8, 10, K]       // this is a bug (K > 255)
    then ShowMessage('OK');
end;
Run Code Online (Sandbox Code Playgroud)

in运营商而不是if

  if (N = 6) or (N = 8) or (N = 10)
    then ShowMessage('OK');
Run Code Online (Sandbox Code Playgroud)

使代码更紧凑和可读,但Delphi文档没有提及它,你应该意识到潜在的问题.

问题是:例如,in运算符只能在括号中使用常量

  if N in [6, 8, 10]
    then ShowMessage('OK');
Run Code Online (Sandbox Code Playgroud)

被认为是德尔福的一个好习惯?

Dav*_*nan 5

这绝对是一个好的做法。它使代码更具可读性,并且消除了对逻辑运算符、括号等的需要。我总是会用于in这样的测试。

唯一的缺点是 Delphi 对集合的支持非常有限(基本序数类型不能有超过 256 个值)。但是,如果您不受这些限制的约束,那么您应该毫不犹豫地使用in.


Kor*_*icz 1

你这里有一个set of byte. 您应该问自己的问题是 a 是否set of byte真的是您的数字所代表的内容?你这里有“神奇的数字”,虽然我知道这只是一个样本,但你必须考虑到

 if Token in [TokenString, TokenNumber, TokenChar] then
Run Code Online (Sandbox Code Playgroud)

...将被认为是好的做法,这:

 if N in [2, 12, 14, 19] then
Run Code Online (Sandbox Code Playgroud)

...不会。

然而,在第一种情况(命名标记)中,显式集合类型将是更好的实践:

 type TokenSet = ( TokenNone, TokenString, TokenChar,... )
Run Code Online (Sandbox Code Playgroud)

那么第一个样本绝对是一个好的实践。