在你的Delphi程序中有多少个地方可以找到这样的行?
var s : string; begin ...<here the string result is manipulated>... if combo.Text='' then s := 'null' else s := QuotedStr(combo.Text); result := result + s; end;
其中一个简单
result := result + (combo.text='')?'null':quotedStr(combo.text);
就足够了。我喜欢这是,它不仅缩短代码,这种方式我也避免宣告一些帮助s:字符串变量。
为什么条件运算符不是Delphi的一部分,他们是否会被支持?我注意到有相当多的语言扩展为2009版本的Delphi(泛型),所以为什么不添加这个功能?
解决方法
Delphi在Math和StrUtils单元中提供了一组IfThen函数,但是它们具有评估它们的值参数的不幸属性,因此这样的代码将失败:
Foo := IfThen(Obj = nil,'<none>',Obj.Name);
要真正做到这一点,需要编译器的帮助。在Delphi社区中,我感觉到一个普遍的不喜欢的C风格的语法使用问号和冒号。我看过使用这样的语法的提议:
Foo := if Obj = nil then '<none>' else Obj.Name;
使条件运算符如此吸引人的部分是它们让你写简洁的代码,但是Delphi的写出一切东西的风格使得上述没有吸引力,即使放在一条线上。
它不需要是一个运算符的形式。 Delphi Prism提供了一个编译器魔法函数Iif
,它只评估它的两个值参数之一:
Foo := Iif(Obj = nil,Obj.Name);
你问为什么这样的功能不会与所有其他语言功能添加在Delphi 2009中添加。我认为这是你的原因。有很多其他语言的变化,已经需要微妙的处理;开发人员不需要更多的负担。功能不是免费的。
你问德尔福是否会有这样的功能。我不是Embarcadero的规划会议的秘密,我不得不派我的水晶球去修理,所以我不能肯定地说,但我预测,如果它会有这样的功能,它会以形式的Delphi Prism的Iif函数。这个想法显示在接近the discussion in Quality Central结束,并且反对,作为一个新的保留字,它将破坏向后兼容性已经定义了相同名称的函数的其他人的代码。这不是一个有效的对象,但是,因为它不需要是一个保留字。它可以是一个标识符,就像Writeln和Exit,它可以有资格在其他单位重新定义,即使来自系统单元的一个被特别处理。