即是对对象引用与数组访问的一个容错处理。
该功能也可以通过系统参数CalcCTRLWord值为0x100和0x200进行指定,与?.模式区别为,系统参数设置为全局有效,而?.模式只是在具体使用时有效。
FAQ:
pn_CalcCTRLWord
具体为:
1、a?.b?.c对象引用中,允许对nil调用返回nil,即当对象存在时,则等同于a.b.c,否则返回nil,方便缺省时未创建对象在引用时可能引发报错的问题
2、t?.[]数组访问中,支持对nil类型操作返回nil,即当t为nil时t?.[1]返回nil,当t为数组时,t?.[1]等同于t[1]
注:仅支持数组访问时,不支持数组写入时如此引用。
算符优先级:与[],.等算符同级
示例01:
如对一个nil类型进行引用时返回nil,而非报错
objA:=new tstringlist();
objB:=nil;
return array(objA?.Count,objB?.Count);
返回结果为array(0,nil)
示例02:
如对一个nil类型进行指定下标访问时返回nil,而非报错
A:=array((1,2),(2,3));
B:=nil;
return array(A?.[1][1],B?.[1],A[2]?.[1]);
返回结果为:array(3,nil,nil)
其中,B?.[1]因B为nil所以返回nil
A[2]?.[1]因A[2]不存在所以返回nil
示例03:
连用模式如:
Type AAA=class
tt;
bb;
function Create();
begin
tt:=array(1,2,3,4);
bb:=new BBB();
end;
end;
Type BBB=class
s;
function Create();
begin
s:="BBB";
end;
end;
//调用
obj:=new AAA();
echo obj?.tt?.[1]; //若对象obj或数组tt不存在时,则返回nil
echo obj?.bb?.s; //若对象obj或bb不存在时,则返回nil
return 1;
打印:
2
BBB