当你设置一个属性值,MATLAB®触发这个属性预设
和PostSet
事件,调用属性集方法(如果定义一个),并设置属性值。即使属性的当前值与新值相同时,也会发生这些操作。
您可以通过设置属性来阻止这些操作AbortSet
属性来真的
.当AbortSet
时,MATLAB将当前属性值与分配给该属性的新值进行比较。如果新值与当前值相同,则MATLAB不做:
设置属性值。
触发预设
和PostSet
事件。
如果存在,调用属性集方法。
为了比较值,MATLAB必须得到属性的当前值。获取当前值将导致属性get方法(得到的。
),如果存在则执行。调用属性get方法时发生的任何错误对用户都是可见的,即使MATLAB没有改变当前值。财产
MATLAB使用isequal
函数确定属性的当前值是否与新值相同。方法确定特定值的值是否相等AbortSet
属性,看到isequal
功能文档或任何isequal
方法为属性值的类重载。
使用AbortSet
属性在当前和新属性值的比较中确实产生了一些开销。使用AbortSet
属性会减慢所有属性的赋值,因为在赋值之前总是比较当前值和已赋值。的AbortSet
属性在以下情况下最有用:
你想要阻止通知预设
和PostSet
当属性值不会更改时,侦听器回调的事件和执行。
设置属性值的成本大于比较当前属性值和被分配值的成本,并且您愿意对所有属性赋值产生比较成本。
以下示例显示了如何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
有关属性验证的信息,请参见验证属性值.