码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • (delphi11最新学习资料) Object Pascal 学习笔记---第10章第1节(通过引用设置属性)


    10.1.7 通过引用设置属性
    本节讲述一个较少使用的语言功能,这节内容相当高级。如果你还没有使用Object Pascal 的经验,那么你可以跳过。但是,即使你已经熟练掌握了 Object Pascal,那么你也很可能从未听说过这项功能。
    
    当 Object Pascal 编译器被扩展为直接支持 Windows COM 编程时,它获得了处理 "Put by Ref "属性(COM 术语)的能力,或可以接收引用而不是值的属性的能力。
    
    • 1
    • 2
    • 3

    注意: "Put by ref "是 Chris Bensen 在介绍该功能的博文中给它起的名字:http://chrisbensen.blogspot.com/2008/04/delphi-put-by-ref-properties.html(当时 Chris 是 Delphi 的研发工程师)。

    这是通过在 setter 方法中使用 var 参数来实现的。鉴于这可能会导致相当尴尬的情况,该功能(尽管仍是语言的一部分)很大程度上被视为例外而非语言规则,这也是该功能默认不激活的原因。换句话说,要启用该功能,必须使用以下编译器指令:
    
    • 1
    {$VARPROPSETTER ON}
    
    • 1
    如果不使用该指令,以下代码将无法编译,并会出现 "E2282 Property setters cannot take var parameters"(E2282 属性设置器不能接受 var 参数)的错误:
    
    • 1
    type
    	TMyIntegerClass = class
    	private
    		FNumber: Integer;
    		function GetNumber: Integer;
    		procedure SetNumber(var Value: Integer);
    	public
    		property Number: Integer read GetNumber write SetNumber;
    	end;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    该类是 VarProp 示例的一部分。现在非常奇怪的是,你可以在属性设置函数中产生副作用:

    procedure TMyIntegerClass.SetNumber(var Value: Integer);
    begin
    	Inc(Value); // Side-effect
    	FNumber := Value;
    end;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    另一个非常不寻常的情况是,你不能为属性分配一个常量值,只能分配一个变量(这应该是意料之中的,就像任何涉及通过引用传递参数的调用一样):

    var
    	Mic: TMyIntegerClass;
    	N: Integer;
    begin
    	...
    	Mic.Number := 10; // Error: E2036 Variable required
    	Mic.Number := N;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    虽然这不是你经常使用的一个功能,但这是思考属性相当高级的一种方式,它允许你初始化或改变给它赋值的变量的值。这就可能会导致像这样极其奇怪的代码:
    
    • 1
    N := 10;
    Mic.Number := N;
    Mic.Number := N;
    Show(Mic.Number.ToString);
    
    • 1
    • 2
    • 3
    • 4
    这两个连续的、完全相同的赋值看起来相当奇怪,但它们确实导致了意外后果,将实际数字变成了 12。这可能是获得该结果的最复杂、最无意义的方法!
    
    • 1
  • 相关阅读:
    七夕来袭——属于程序员的浪漫
    AI语音系统电销机器人系统搭建|AI智能|电话机器人源码|《各版本机器人部署》
    Vue快速入门
    Android Room的使用详解
    2023年中国奶牛平均单产量、奶类产量及发展趋势分析:液态奶市场向高端化发展[图]
    新电脑的正确打开方式——(近万字图文并茂详细分步骤讲解)【包括个性锁屏,磁盘分区……】等你来解锁哦
    【完整解题】2023年第四届MathorCup高校数学建模挑战赛——大数据竞赛B题 思路代码文章电商零售商家需求预测及库存优化问题
    “揭秘淘宝店铺所有商品接口:一键获取海量热销宝贝信息!“
    第十三届蓝桥杯JavaB组省赛E题——求阶乘 (AC)
    Debian12系统下LAMP环境中Nubuilder4.5的安装
  • 原文地址:https://blog.csdn.net/langfengyl/article/details/138031740
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号