delphi – 为什么不在返回对象时直接使用Result变量?
发布时间:2020-12-15 09:23:35 所属栏目:大数据 来源:网络整理
导读:我在很多例子中看到过创建一个与Result类型相同的变量,并在函数末尾分配它而不是仅仅使用Result变量. 例如,在System.JSON中的代码中 class function TJSONObject.ParseJSONValue( const Data: TArrayByte; const Offset: Integer; const ALength: Integer; O
我在很多例子中看到过创建一个与Result类型相同的变量,并在函数末尾分配它而不是仅仅使用Result变量.
例如,在System.JSON中的代码中 class function TJSONObject.ParseJSONValue( const Data: TArray<Byte>; const Offset: Integer; const ALength: Integer; Options: TJSONParSEOptions ): TJSONValue; var Parent: TJSONArray; Answer: TJSONValue; Br: TJSONByteReader; begin Parent := TJSONArray.Create; Answer := nil; { Why not just use Result directly here? } Br := TJSONByteReader.Create( Data,Offset,ALength,TJSONParSEOption.IsUTF8 in Options ); try ConsumeWhitespaces(Br); if (ParseValue(Br,Parent,TJSONParSEOption.UseBool in Options) = ALength) and (Parent.Count = 1) then Answer := Parent.Pop; { Why not just use Result directly here? } Result := Answer; finally Parent.Free; Br.Free; end; end; 为什么要创建变量Answer而不是仅仅使用Result? 这只是程序员决定这样做的方式还是背后的原因? 解决方法
这里没有充分的理由使用额外的局部变量.这样做只会增加复杂性.我会这样写: class function TJSONObject.ParseJSONValue( const Data: TArray<Byte>; const Offset: Integer; const ALength: Integer; Options: TJSONParSEOptions ): TJSONValue; var Parent: TJSONArray; Br: TJSONByteReader; begin Parent := TJSONArray.Create; try Br := TJSONByteReader.Create( Data,TJSONParSEOption.IsUTF8 in Options ); try ConsumeWhitespaces(Br); if (ParseValue(Br,TJSONParSEOption.UseBool in Options) = ALength) and (Parent.Count = 1) then Result := Parent.Pop else Result := nil; finally Br.Free; end; finally Parent.Free; end: end; 这也纠正了生命周期管理和潜在的内存泄漏,如评论中所述. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |