主要内容

验证属性值

类定义中的属性验证

MATLAB®属性验证允许您对属性值施加特定的限制。可以使用验证来约束属性值的类和大小。此外,您还可以使用函数来建立属性值必须遵循的标准。MATLAB定义了一组验证函数,您可以编写自己的验证函数。

在类定义中,属性验证的使用是可选的。

属性验证的附加信息

有关属性验证的更多信息,请参见属性类和大小验证属性验证函数属性验证的元数据接口

验证语法

下面代码中突出显示的区域显示了属性验证的语法。

属性验证包括以下任何一种:

  • Size -每个维度的长度,用正整数或冒号指定。冒号表示该维度中允许任何长度。分配给属性的值必须符合指定的大小或与指定的大小兼容。有关更多信息,请参见财产规模验证

  • 类-单个MATLAB类的名称。指定给属性的值必须属于指定的类别或可转换为指定的类别。使用MATLAB支持的任何MATLAB类或外部定义的类,Java除外金宝app®和COM类。有关详细信息,请参阅房地产类验证

  • Functions——用逗号分隔的验证函数名称列表。在应用任何可能的类和大小转换后,MATLAB将赋值给属性的值传递给每个验证函数。如果验证失败,验证器函数会抛出错误,但不会返回值。有关更多信息,请参见属性验证函数

    有关MATLAB验证函数的列表,请参见属性验证函数

使用属性的验证

使用公共属性的属性验证来控制用户代码分配给属性的值。

如果希望将属性值限制为一组固定的标识符,则为这些标识符创建一个枚举类,并将属性约束为这个类。有关枚举类的信息,请参见定义枚举类

MATLAB类型转换规则适用于属性验证。例如,MATLAB可以强制从一个数值类型转换到另一个数值类型。因此,将属性值限制为特定的数字类型(例如double)并不会阻止将其他数字类型赋值给属性。

要确保只能为属性指定特定类型的值,请将属性限制为仅支持所需类型转换的类型,或使用验证函数指定属性允许的确切类,而不是指定属性类型。在执行任何验证函数之前,MATLAB会评估类型规范。有关详细信息,请参阅金宝app订单的验证

指定有效的默认值

确保分配给属性的任何默认值满足指定验证施加的限制。如果不指定默认值,MATLAB通过指定类的空对象或调用默认构造函数(如果大小限制不允许使用空默认值)创建默认值。默认构造函数必须返回大小正确的对象。

使用属性验证的示例类

ValidateProps类定义了三个具有验证的属性。

classdefValidateProps属性地方(1,3) double {mustBeReal, mustBeFinite}标签(1,:)字符{mustBeMember(标签,{'High','Medium','Low'}}“低”状态(1,1) matlab.lang.OnOffSwitchState终止终止
  • 地方必须是一个1乘3的类数组双重的它的值是实数,有限数。

  • 标签一定是个烧焦向量,即“高”“中等”,或“低”

  • 状态必须是的枚举成员matlab.lang.OnOffSwitchState阶级().

实例化时的验证

创建ValidateProps类对隐式和显式默认值执行验证:

a=验证操作
a = ValidateProps的属性:Location: [0 0 0] Label: 'Low' State: off

在创建对象时,MATLAB:

  • 初始化地方属性值[0 0 0]满足尺寸和档次的要求。

  • 设定标签属性设置为其默认值,“低”。默认值必须是允许的值集的成员。默认值为空烧焦隐式默认值将导致错误。

  • 设定状态财产枚举定义的枚举成员matlab.lang.OnOffSwitchState类。

有关MATLAB如何选择默认值的信息,请参见每个大小和类别的默认值

订单的验证

当一个值被赋给属性时,包括在类定义中指定的默认值,MATLAB按以下顺序执行验证:

  • 类验证-此验证可能导致转换到其他类,例如烧焦字符串.属性的赋值遵循数组的MATLAB转换规则。

  • 大小验证-此验证可能导致大小转换,例如标量扩展或将列向量转换为行向量。指定大小验证的属性的赋值行为与任何MATLAB数组的赋值行为相同。有关索引分配的信息,请参见数组索引

  • 验证器函数——MATLAB按照从左到右的顺序将类和大小验证的结果传递给每个验证函数。错误可能在调用所有验证函数之前发生,从而结束验证过程。

  • Set方法——如果为属性定义了一个方法,则MATLAB在调用属性集方法之前执行属性验证。在属性集或get方法中对属性的赋值不会再次应用验证。通常,您可以使用属性验证替换属性设置方法。

属性验证错误

ValueProp类使用大小、类和函数验证来确保对价值属性是非负的双标量。

classdefValueProp属性价值(1,1)双{mustBeNonnegative}= 0终止终止

此语句尝试将单元格数组分配给属性。此赋值违反了类验证。

a.Value = {10 20};
设置类“ValueProp”的属性“Value”时出错:数据类型无效。值必须为双精度或可转换为双精度。

该语句试图将一个1乘2的双数组赋值给属性。这个赋值违反了大小验证。

a、 数值=[10 20];
设置类“ValueProp”的属性“Value”时出错:值的大小必须为标量。

此语句试图将标量双精度值赋给属性。这个赋值失败了函数验证,这需要一个非负数。

a、 值=-10;
设置类“ValueProp”的属性“Value”时出错:值必须为非负。

验证过程以遇到的第一个错误结束。

抽象属性的验证

您可以为抽象属性定义属性验证。验证应用于实现该属性的所有子类。但是,子类不能对其属性的实现使用任何验证。当从多个类继承一个属性的验证时,只有一个超类中的一个抽象属性可以定义验证。所有的超类都不能将属性定义为nonAbstract。

更改验证时未更新的对象

如果在类的对象存在时更改属性验证,MATLAB不会尝试将新的验证应用于现有的属性值。然而,当您对现有对象的属性进行赋值时,MATLAB会应用新的验证。

负载运行期间的验证

将对象保存到小地毯文件,MATLAB保存对象的所有非默认属性值。当加载对象时,MATLAB在新创建的对象中恢复这些属性值。

如果类定义更改了属性验证,以致加载的属性值不再有效,则MATLAB将用当前定义的默认值替换该属性。但是,负载函数将抑制在从当前类定义中指定默认值之前发生的验证错误。因此,在加载操作期间,验证错误将被静默忽略。

为了说明此行为,此示例创建、保存和加载的对象蒙特姆类。这个类限制阿维坦普属性设置为单元格数组。

classdef蒙特姆属性阿维坦普单间牢房终止终止

创建一个蒙特姆对象,并将值赋给阿维坦普财产。

a=月;a.AveTemp={“可能”70};

使用以下命令保存对象拯救

拯救TemperatureFile一个

控件的属性定义更改验证类阿维坦普属性从单元格数组到容器。地图

classdef蒙特姆属性阿维坦普容器。地图终止终止

在MATLAB路径上加载带有新类定义的保存对象。MATLAB无法将保存的值分配给阿维坦普属性,因为单元格数组,{‘可能’,70},不符合当前属性值为a的要求容器。地图对象。MATLAB不能将单元阵列转换为容器。地图

为了解决不兼容问题,MATLAB设置阿维坦普属性设置为当前默认值,该默认值为空容器。地图对象。

负载TemperatureFile一个a、 AveTemp ans=地图具有特性:计数:0键类型:字符值类型:任意

加载的对象有一个不同的赋值阿维坦普属性,因为保存的值现在无效。但是,加载过程抑制了验证错误。

要防止在更改类定义和重新加载对象时丢失数据,请实现loadobj方法或类转换器方法,该方法使保存的值满足当前属性验证。

有关保存和加载对象的更多信息,请参见对象的保存和加载过程

相关的话题