【问题标题】:Delphi typed constants in case statements案例语句中的 Delphi 类型常量
【发布时间】:2010-06-08 16:55:35
【问题描述】:

在 Delphi 的 case 语句中使用类型常量最优雅(或最不丑)的方式是什么?

也就是说,假设对于这个问题,您需要声明一个类型化常量,如

const
  MY_CONST: cardinal = $12345678;
  ...

那么Delphi编译器就不会接受

case MyExpression of
  MY_CONST: { Do Something };
  ...
end;

但你需要写

case MyExpression of
  $12345678: { Do Something };
  ...
end;

容易出错,难以更新,也不优雅。

有没有什么技巧可以让编译器插入常量的值(最好通过检查源代码中const 下的常量值,但也可以在运行时查找值)?我们在这里假设您不会在运行时更改“常量”的值。

【问题讨论】:

  • 取出“:红衣主教”。问题解决了。您不需要使用 TYPE DECLARATIONS,事实上您也不需要使用它们。
  • 是的,我知道。但是我明确地写了“假设这个问题你需要声明一个类型化的常量”......

标签: delphi case-statement


【解决方案1】:

根据为什么您需要输入常量,您可以尝试类似

const
  MY_REAL_CONST = Cardinal($12345678);
  MY_CONST: Cardinal = MY_REAL_CONST;

case MyExpression of
  MY_REAL_CONST: { Do Something };
  ...
end;

【讨论】:

  • @Andreas:如果你觉得这个答案比我的更好,你可以接受它。 SO 允许您更改接受的答案。
  • @Mason Wheeler:你是对的。虽然我同意大多数问题都可以在没有类型常量的情况下解决(最终我使用普通常量重写了我的代码),但这是对实际问题的回答,所以我会接受它。
【解决方案2】:

如果你不改变常量的值,那么你不需要它是一个类型化的常量。编译器可以获取您声明的数字并将其正确地放入您分配给它的任何变量或参数中。类型化常量有点像 hack,它们实际上是作为变量实现的,因此编译器不能将它们用作值需要在编译时修复的常量。

【讨论】:

  • 我知道。但这并不能回答这个问题,因为我确实写了“假设这个问题你需要声明一个类型化的常量”。但总的来说,我同意:我也会回答这样的问题:“为什么你需要使用类型化常量?”。
  • 但是,我想得越多,我就越意识到如果这是一个问题,你应该“破解”其他东西......
  • IF 您正在使用类型化常量,因为您希望它是特定类型(例如本例中的 Cardinal),您可以声明为 MyConst = Cardinal($FFFFFFFE); case MyExpression of MY_CONST: { Do Something }; ...结束;
【解决方案3】:

类型化常量不能用在case语句中,因为类型化常量实际上更像是一个静态变量(并且可以赋值...),因此不能在case语句中使用,这需要常量。

【讨论】:

  • 我不会写“我们在这里假设您不会在运行时更改“常量”的值。”如果我不知道! :)
  • 太糟糕了,Delphi 不假设这一点,并允许更改类型常量。
猜你喜欢
  • 2014-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-13
  • 2012-12-20
  • 1970-01-01
相关资源
最近更新 更多