主要内容

当属性值不变时赋值

当值没有改变时中止设置

当你设置一个属性值,MATLAB®触发这个属性预设PostSet事件,调用属性集方法(如果定义一个),并设置属性值。即使属性的当前值与新值相同时,也会发生这些操作。

您可以通过设置属性来阻止这些操作AbortSet属性来真的.当AbortSet时,MATLAB将当前属性值与分配给该属性的新值进行比较。如果新值与当前值相同,则MATLAB不做:

  • 设置属性值。

  • 触发预设PostSet事件。

  • 如果存在,调用属性集方法。

为了比较值,MATLAB必须得到属性的当前值。获取当前值将导致属性get方法(得到的。财产),如果存在则执行。调用属性get方法时发生的任何错误对用户都是可见的,即使MATLAB没有改变当前值。

如何MATLAB比较价值

MATLAB使用isequal函数确定属性的当前值是否与新值相同。方法确定特定值的值是否相等AbortSet属性,看到isequal功能文档或任何isequal方法为属性值的类重载。

何时使用abortset

使用AbortSet属性在当前和新属性值的比较中确实产生了一些开销。使用AbortSet属性会减慢所有属性的赋值,因为在赋值之前总是比较当前值和已赋值。的AbortSet属性在以下情况下最有用:

  • 你想要阻止通知预设PostSet当属性值不会更改时,侦听器回调的事件和执行。

  • 设置属性值的成本大于比较当前属性值和被分配值的成本,并且您愿意对所有属性赋值产生比较成本。

实现AbortSet

以下示例显示了如何AbortSet属性工作。的AbortTheSet类定义一个属性,陈述,有听众PreGet预设期刊, 和PostSet事件,并启用AbortSet属性。

请注意

要使用这个类,请保存AbortTheSet在MATLAB路径上的文件夹中具有相同名称的文件中的类。

classdefAbortTheSet <处理特性PropOne = 7结束方法功能obj = abortset addlistener(obj,“陈述”“预装”, @obj.getPrePropEvt);addlistener (obj,“陈述”“预设”,@ obj.setprepropevt);addlistener (obj,“陈述”“PostGet”, @obj.getPostPropEvt);addlistener (obj,“陈述”“邮政”, @obj.setPostPropEvt);结束功能proval = get. proone (obj) disp(”得到的。倡言“proval = obj.PropOne;结束功能set.propone(obj,val)disp(的设置。倡言“)obj.propone = val;结束功能src, getPrePropEvt (obj evnt) disp ('Pre-Get事件触发'%......结束功能src, setPrePropEvt (obj evnt) disp ('预设事件触发'%......结束功能src, getPostPropEvt (obj evnt) disp (Post-get事件引发的%......结束功能SetPostPropevt(OBJ,SRC,EVNT)DISP(即“后设事件引发的%......结束功能disp (obj)加载磁盘以避免访问属性disp(类(obj))结束结束结束

该类指定初始值7为了陈述财产。因此,如果您创建对象并分配属性值7,没有必要触发预设事件。然而,getPropOne方法获取属性的当前值以与已赋值值进行比较。

obj = AbortTheSet;obj。倡言= 7;
get.propone叫

如果指定的值不是7, MATLAB执行以下步骤:

  • 获取当前属性值

  • 触发了这一点预设事件

  • 将属性设置为指定的值

  • 触发了这一点PostSet事件

obj = AbortTheSet;obj。倡言= 9;
get.propone叫Pre-set event triggered set.PropOne called Post-set event triggered

如果您查询属性值,则PreGet期刊事件被触发。

obj。陈述
preget事件触发get。陈述called Post-get event triggered ans = 9

使用具有属性验证的替代

当类使用属性验证和AbortSet在属性定义中,MATLAB在比较当前值和被赋值之前评估属性验证。例如,修改AbortTheSet类添加1乘3的大小限制陈述财产。

classdefAbortTheSet <处理特性(GetObservable SetObservable AbortSet)%限制大小为1乘3% ***********************陈述(1,3)= [7 7 7]% ***********************结束方法功能obj = abortset addlistener(obj,“陈述”“预装”, @obj.getPrePropEvt);addlistener (obj,“陈述”“预设”,@ obj.setprepropevt);addlistener (obj,“陈述”“PostGet”, @obj.getPostPropEvt);addlistener (obj,“陈述”“邮政”, @obj.setPostPropEvt);结束功能proval = get. proone (obj) disp(”得到的。倡言“proval = obj.PropOne;结束功能set.propone(obj,val)disp(的设置。倡言“)obj.propone = val;结束功能src, getPrePropEvt (obj evnt) disp ('Pre-Get事件触发'%......结束功能src, setPrePropEvt (obj evnt) disp ('预设事件触发'%......结束功能src, getPostPropEvt (obj evnt) disp (Post-get事件引发的%......结束功能SetPostPropevt(OBJ,SRC,EVNT)DISP(即“后设事件引发的%......结束功能disp (obj)加载磁盘以避免访问属性disp(类(obj))结束结束结束

由于MATLAB应用标量扩展以满足大小限制,因此以下作业不会触发预设要么PostSet事件。

obj = AbortTheSet;obj。倡言= 7;
get.propone叫
obj。陈述
preget事件触发get。陈述called Post-get event triggered ans = 7 7 7

有关属性验证的信息,请参见验证属性值

相关话题