(delphi11最新学习资料) Object Pascal 学习笔记---第10章第1节(通过引用设置属性)

本文主要是介绍(delphi11最新学习资料) Object Pascal 学习笔记---第10章第1节(通过引用设置属性),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

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

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

procedure TMyIntegerClass.SetNumber(var Value: Integer);
beginInc(Value); // Side-effectFNumber := Value;
end;

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

varMic: TMyIntegerClass;N: Integer;
begin...Mic.Number := 10; // Error: E2036 Variable requiredMic.Number := N;
虽然这不是你经常使用的一个功能,但这是思考属性相当高级的一种方式,它允许你初始化或改变给它赋值的变量的值。这就可能会导致像这样极其奇怪的代码:
N := 10;
Mic.Number := N;
Mic.Number := N;
Show(Mic.Number.ToString);
这两个连续的、完全相同的赋值看起来相当奇怪,但它们确实导致了意外后果,将实际数字变成了 12。这可能是获得该结果的最复杂、最无意义的方法!

这篇关于(delphi11最新学习资料) Object Pascal 学习笔记---第10章第1节(通过引用设置属性)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/934031

相关文章

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Feign Client超时时间设置不生效的解决方法

《FeignClient超时时间设置不生效的解决方法》这篇文章主要为大家详细介绍了FeignClient超时时间设置不生效的原因与解决方法,具有一定的的参考价值,希望对大家有一定的帮助... 在使用Feign Client时,可以通过两种方式来设置超时时间:1.针对整个Feign Client设置超时时间

CSS will-change 属性示例详解

《CSSwill-change属性示例详解》will-change是一个CSS属性,用于告诉浏览器某个元素在未来可能会发生哪些变化,本文给大家介绍CSSwill-change属性详解,感... will-change 是一个 css 属性,用于告诉浏览器某个元素在未来可能会发生哪些变化。这可以帮助浏览器优化

PyCharm如何设置新建文件默认为LF换行符

《PyCharm如何设置新建文件默认为LF换行符》:本文主要介绍PyCharm如何设置新建文件默认为LF换行符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录PyCharm设置新建文件默认为LF换行符设置换行符修改换行符总结PyCharm设置新建文件默认为LF

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在

浅析CSS 中z - index属性的作用及在什么情况下会失效

《浅析CSS中z-index属性的作用及在什么情况下会失效》z-index属性用于控制元素的堆叠顺序,值越大,元素越显示在上层,它需要元素具有定位属性(如relative、absolute、fi... 目录1. z-index 属性的作用2. z-index 失效的情况2.1 元素没有定位属性2.2 元素处

查看Oracle数据库中UNDO表空间的使用情况(最新推荐)

《查看Oracle数据库中UNDO表空间的使用情况(最新推荐)》Oracle数据库中查看UNDO表空间使用情况的4种方法:DBA_TABLESPACES和DBA_DATA_FILES提供基本信息,V$... 目录1. 通过 DBjavascriptA_TABLESPACES 和 DBA_DATA_FILES

最新Spring Security实战教程之Spring Security安全框架指南

《最新SpringSecurity实战教程之SpringSecurity安全框架指南》SpringSecurity是Spring生态系统中的核心组件,提供认证、授权和防护机制,以保护应用免受各种安... 目录前言什么是Spring Security?同类框架对比Spring Security典型应用场景传统