纠正'in'运算符的使用

时间:2012-01-29 09:41:42

标签: 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;

in运算符代替if

  if (N = 6) or (N = 8) or (N = 10)
    then ShowMessage('OK');

使代码更加紧凑和可读,但Delphi文档对此保持沉默,您应该意识到潜在的问题。

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

  if N in [6, 8, 10]
    then ShowMessage('OK');

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

2 个答案:

答案 0 :(得分:4)

这绝对是一种很好的做法。它使代码更具可读性,并且不需要逻辑运算符,括号等。我会一直使用in进行这样的测试。

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

答案 1 :(得分:1)

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

 if Token in [TokenString, TokenNumber, TokenChar] then

......将被视为良好做法,这:

 if N in [2, 12, 14, 19] then

......不会。

然而,在第一种情况下(命名为令牌),显式集类型将是更好的做法:

 type TokenSet = ( TokenNone, TokenString, TokenChar,... )

然后第一个样本绝对是一个好习惯。