Назначение, когда значение свойства не изменено

AbortSet, когда значение не меняется

Когда вы задаете значение свойства, MATLAB® запускает свойство PreSet и PostSet events, вызывает метод набора свойств (если он определен) и устанавливает значение свойства. Эти действия происходят, даже когда текущее значение свойства совпадает с новым значением.

Можно предотвратить эти действия, установив AbortSet свойства атрибут к true. Когда AbortSet включено, MATLAB сравнивает текущее значение свойства с новым значением, назначенным свойству. Если новое значение совпадает с текущим значением, MATLAB не:

  • Установите значение свойства.

  • Срабатывание PreSet и PostSet события.

  • Вызовите метод набора свойств, если он существует.

Чтобы сравнить значения, MATLAB должен получить текущее значение свойства. Получение текущего значения приводит к тому, что свойство get method (get. Property) для выполнения, если он существует. Любые ошибки, возникающие при вызове метода get свойства, видны пользователю, даже если MATLAB не меняет текущее значение.

Как MATLAB сравнивает значения

MATLAB использует isequal функция для определения, совпадает ли текущее значение свойства с новым значением. Чтобы определить, вычисляются ли определенные значения как равные при использовании AbortSet атрибут, см. isequal поиск по функциям или любая isequal метод перегружен для класса значения свойства.

Когда использовать AbortSet

Использование AbortSet атрибут несет некоторые накладные расходы при сравнении текущих и новых значений свойств. Использование AbortSet атрибут может замедлить все назначения свойств, поскольку текущее и присвоенное значения всегда сравниваются перед выполнением присвоения. The AbortSet атрибут наиболее полезен, когда:

  • Вы хотите предотвратить уведомление о PreSet и PostSet события и выполнение коллбэков прослушивателя, когда значение свойства не меняется.

  • Стоимость настройки значения свойства больше, чем стоимость сравнения текущего значения свойства с назначенным значением, и вы готовы понести затраты сравнения со всеми присвоениями свойству.

Реализация AbortSet

Следующий пример показывает, как AbortSet атрибут работает. The AbortTheSet класс задает свойство, PropOne, который имеет прослушиватели для PreGet, PreSet, PostGet, и PostSet события и включает AbortSet атрибут.

Примечание

Чтобы использовать этот класс, сохраните AbortTheSet класс в файле с таким же именем в папке на пути MATLAB.

classdef AbortTheSet < handle
    properties (SetObservable, GetObservable, AbortSet)
        PropOne = 7
    end
    methods
        function obj = AbortTheSet
            addlistener(obj,'PropOne','PreGet',@obj.getPrePropEvt);
            addlistener(obj,'PropOne','PreSet',@obj.setPrePropEvt);
            addlistener(obj,'PropOne','PostGet',@obj.getPostPropEvt);
            addlistener(obj,'PropOne','PostSet',@obj.setPostPropEvt);
        end
        function propval = get.PropOne(obj)
            disp('get.PropOne called')
            propval = obj.PropOne;
        end
        function set.PropOne(obj,val)
            disp('set.PropOne called')
            obj.PropOne = val;
        end
        function getPrePropEvt(obj,src,evnt)
            disp ('Pre-get event triggered')
            % ...
        end
        function setPrePropEvt(obj,src,evnt)
            disp ('Pre-set event triggered')
            % ...
        end
        function getPostPropEvt(obj,src,evnt)
            disp ('Post-get event triggered')
            % ...
        end
        function setPostPropEvt(obj,src,evnt)
            disp ('Post-set event triggered')
            % ...
        end
        function disp(obj)
            % Overload disp to avoid accessing property
            disp (class(obj))
        end
    end
end

Класс задает начальное значение 7 для PropOne свойство. Поэтому, если вы создаете объект и присваиваете значение свойства 7, нет необходимости запускать PreSet событие. Однако getPropOne вызывается метод, чтобы получить текущее значение свойства для сравнения с назначенной переменной.

obj = AbortTheSet;
obj.PropOne = 7;
get.PropOne called

Если вы задаете значение, отличное от 7MATLAB выполняет следующие шаги:

  • Получает текущее значение свойства

  • Запускает PreSet событие

  • Устанавливает свойство на назначенное значение

  • Запускает PostSet событие

obj = AbortTheSet;
obj.PropOne = 9;
get.PropOne called
Pre-set event triggered
set.PropOne called
Post-set event triggered

Если вы запрашиваете значение свойства, PreGet и PostGet инициируются события.

obj.PropOne
Pre-get event triggered
get.PropOne called
Post-get event triggered

ans =

     9

Использование AbortSet с валидацией свойств

Когда классы используют валидацию свойств и AbortSet в определении свойства MATLAB оценивает валидацию свойства перед сравнением текущего значения со значением, которому присваивается. Для примера измените AbortTheSet класс, чтобы добавить ограничение по размеру 1 на 3 к PropOne свойство.

classdef AbortTheSet < handle
    properties (SetObservable, GetObservable, AbortSet)
        % Restrict size to 1-by-3
        % ***********************
        PropOne (1,3) = [7 7 7]
        % ***********************
    end
    methods
        function obj = AbortTheSet
            addlistener(obj,'PropOne','PreGet',@obj.getPrePropEvt);
            addlistener(obj,'PropOne','PreSet',@obj.setPrePropEvt);
            addlistener(obj,'PropOne','PostGet',@obj.getPostPropEvt);
            addlistener(obj,'PropOne','PostSet',@obj.setPostPropEvt);
        end
        function propval = get.PropOne(obj)
            disp('get.PropOne called')
            propval = obj.PropOne;
        end
        function set.PropOne(obj,val)
            disp('set.PropOne called')
            obj.PropOne = val;
        end
        function getPrePropEvt(obj,src,evnt)
            disp ('Pre-get event triggered')
            % ...
        end
        function setPrePropEvt(obj,src,evnt)
            disp ('Pre-set event triggered')
            % ...
        end
        function getPostPropEvt(obj,src,evnt)
            disp ('Post-get event triggered')
            % ...
        end
        function setPostPropEvt(obj,src,evnt)
            disp ('Post-set event triggered')
            % ...
        end
        function disp(obj)
            % Overload disp to avoid accessing property
            disp (class(obj))
        end
    end
end

Поскольку MATLAB применяет скалярное расширение, чтобы удовлетворить ограничению размера, следующее назначение не запускает PreSet или PostSet события.

obj = AbortTheSet;
obj.PropOne = 7;
get.PropOne called
obj.PropOne
Pre-get event triggered
get.PropOne called
Post-get event triggered

ans =

     7     7     7

Для получения информации о валидации свойств см. Раздел «Валидация значений свойств».

Похожие темы