TSL语言基础 > TSL语言基础 > 基础知识 > 运算符

?.模式    

简述
对对象与数组进行引用时增加判断逻辑,对象与数组是否为nil(即不存在),若为nil则返回nil,否则返回正常引用结果。
注:此为新一代TSL语言功能。
  • 即是对对象引用与数组访问的一个容错处理。
    该功能也可以通过系统参数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