当前位置: 首页 > news >正文

Delphi 关于函数返回值变量Result

Result 概要:

  • Result 是 Delphi 编译器自动为有返回值的函数创建的局部变量

  • 它的类型自动匹配函数的返回类型

  • 不需要手动声明,直接使用即可

  • 这是 Delphi/Object Pascal 语言的核心特性之一

  • 对于记录类型,Result 就是一个完整的记录实例,可以直接访问其字段

下面以一个记录类型为例进行说明

typeTDeptSupplierInfo = recordDeptID: Integer;SupplierID: Integer;// 辅助方法function isDept: Boolean;          // 是否部门function IsSupplier: Boolean;      // 是否供应商function IsValid: Boolean;         // 是否有效function AsString: string;         // 返回 "部门ID,供应商ID" 格式end;

 

1. Result 是自动声明的

在 Delphi 中,任何有返回值的函数都会自动拥有一个名为 Result 的局部变量,它的类型就是函数的返回类型。

function GetDeptAndSupplierID(const ATag: Integer): TDeptSupplierInfo;
//                                  ↑返回类型              ↑编译器自动声明了 Result: TDeptSupplierInfo
begin// 等价于在函数内部自动声明了:// var Result: TDeptSupplierInfo;
    Result.DeptID := ATag div 10;      // 可以直接使用Result.SupplierID := 0;            // 不需要手动声明
end;

 

2. 编译器层面的等价代码

// 您写的代码:
function TfraModuleCPRK.GetDeptAndSupplierID(const ATag: Integer): TDeptSupplierInfo;
beginResult.DeptID := ATag div 10;Result.SupplierID := 0;
end;// 编译器内部等价于:
function TfraModuleCPRK.GetDeptAndSupplierID(const ATag: Integer): TDeptSupplierInfo;
var_Result: TDeptSupplierInfo;  // 编译器自动添加
begin_Result.DeptID := ATag div 10;_Result.SupplierID := 0;// 函数结束时,自动返回 _Result 的值
end;

 

3. 适用于所有返回类型

Result 变量适用于任何返回类型:

// 基本类型
function GetInteger: Integer;
beginResult := 42;  // Result 是 Integer 类型
end;function GetString: string;
beginResult := 'Hello';  // Result 是 string 类型
end;// 记录类型
function GetRecord: TDeptSupplierInfo;
beginResult.DeptID := 10;      // Result 是 TDeptSupplierInfo 类型Result.SupplierID := 20;
end;// 类类型
function GetObject: TObject;
beginResult := TObject.Create;  // Result 是 TObject 类型
end;// 接口类型
function GetInterface: IInterface;
beginResult := nil;  // Result 是 IInterface 类型
end;// 动态数组
function GetArray: TArray<Integer>;
beginSetLength(Result, 3);  // Result 是 TArray<Integer> 类型Result[0] := 1;
end;

 

4. 两种赋值方式

对于记录类型,有两种使用方式:

// 方式1:直接给 Result 赋值一个完整记录
function CreateInfo(const ATag: Integer): TDeptSupplierInfo;
beginif (ATag mod 10) = 0 thenResult := TDeptSupplierInfo.Create(ATag)  // 需要构造函数elseResult := Default(TDeptSupplierInfo);     // 使用默认值
end;// 方式2:逐个字段赋值(您使用的方式)
function CreateInfo(const ATag: Integer): TDeptSupplierInfo;
beginif (ATag mod 10) = 0 thenbeginResult.DeptID := ATag div 10;Result.SupplierID := 0;endelsebeginResult.DeptID := 0;Result.SupplierID := (ATag - 1) div 10;end;
end;

 

5. 新旧语法对比

Delphi 也支持使用函数名作为返回值(旧语法),但 Result 是推荐方式:

// 旧语法(不推荐)
function GetValue: Integer;
beginGetValue := 42;  // 使用函数名
end;// 新语法(推荐)
function GetValue: Integer;
beginResult := 42;  // 使用 Result
end;

 

6. 注意事项

// Result 默认值是不确定的
function GetRecord: TDeptSupplierInfo;
begin// 此时 Result.DeptID 和 Result.SupplierID 的值是未定义的(随机值)// 字符串类型会被初始化为空字符串// 接口和动态数组会被初始化为 nil// 但记录类型不会被自动清零!
    Result.DeptID := 10;  // 必须显式赋值Result.SupplierID := 20;
end;// 如果希望清零,可以这样:
function GetRecord: TDeptSupplierInfo;
beginResult := Default(TDeptSupplierInfo);  // 清零所有字段Result.DeptID := 10;
end;

 

http://www.jsqmd.com/news/751403/

相关文章:

  • 多级泛型接口嵌套
  • 新手福音:用快马AI助手轻松学习《我的世界》复杂指令,告别死记硬背
  • 终极指南:使用BilibiliDown从B站视频中提取无损音频的完整教程 [特殊字符]
  • 为OpenClaw智能体工作流配置统一的模型调用后端
  • 自动驾驶安全新视角:用DriveAct数据集,聊聊如何让AI看懂司机的‘小动作’
  • 3步轻松解密微信聊天记录:WechatDecrypt工具使用全攻略
  • 紧急!.NET 9 RC2已移除旧AI API——3小时内迁移至Microsoft.AI.Inference新命名空间(含兼容性映射表与单元测试迁移模板)
  • 告别兼容性烦恼!OpenTabletDriver跨平台数位板驱动终极指南
  • STC32F12单片机驱动WS2812B灯带:一个IO口搞定炫彩灯效(附完整代码)
  • League-Toolkit:英雄联盟玩家的智能游戏管家
  • 如何用3分钟掌握WindowResizer:彻底解决Windows窗口尺寸限制难题
  • Shiro框架下Secure Cookie引发的302循环重定向,一个配置项如何让登录接口‘罢工’?
  • FHIR R5 to 2026版迁移实录:C# .NET 6+医疗系统零停机适配的7步工业级实施手册
  • 终极指南:如何将你的旧电视盒子变成强大的Linux服务器
  • 利用快马AI五分钟生成Python串口调试助手原型,加速硬件调试
  • 3个数据洞察让《碧蓝幻想:Relink》输出效率翻倍:GBFR Logs实战指南
  • SoC验证实战:从C代码到波形,手把手教你定位CPU挂死和MEM_COMPARE失败
  • 2026移动排插什么牌子好?安全与实用性兼具的选择 - 品牌排行榜
  • 3步掌握Translumo:终极免费实时屏幕翻译工具使用指南
  • 为 Hermes Agent 工具链配置 Taotoken 作为自定义模型提供方
  • [笔记] P4824 [USACO15FEB] Censoring S
  • 3步实现单机游戏分屏协作:Nucleus Co-Op终极指南
  • 5分钟掌握Unlock Music:终极浏览器音频解密转换完全指南
  • PPTX2HTML:纯JavaScript前端技术实现PPTX到HTML的无服务器转换方案
  • 5个简单技巧:用Windows Cleaner快速解决C盘空间不足问题
  • 5分钟快速上手:打造macOS桌面歌词显示的终极解决方案
  • DDR5内存的On Die ECC到底有啥用?和传统ECC内存条有啥区别?
  • GDSDecomp终极指南:如何高效反编译Godot游戏资源与脚本
  • 021、PCIE IO读写事务:从一次诡异的设备失联说起
  • 2026 国内可用稳定临时邮箱最新指南