首页 > 编程知识 正文

规范和约束公权力是什么意思,保护性约束规范

时间:2023-05-04 06:15:01 阅读:59181 作者:4305

我们在开发时经常对泛型类型指定约束条件,只允许类型参数满足条件的用于此泛型类型。 但是,约束的定义可能太多或太少。 如果约束太多,其他开发人员在使用你创建的方法和类时会做很多工作来满足这些约束。 如果约束过少,则在程序运行时需要进行更多检查,并执行更多强制类型转换操作。 此外,还必须使用反射生成运行时错误,以防止用户误用类。 要解决这些问题,必须写下确实必要的约束。 这句话很简单,但实际上并不简单。 本节介绍如何正确创建规范约束。

零,约束是什么? 约束是使编译器能够知道类型参数除了在System.Object中定义的公共接口之外,还需要满足的条件。 创建泛型类型时,编译器必须为此泛型类型定义有效的IL代码。 即使不知道其中的类型参数何时被哪个类型替换,也尝试创建有效的组件。 如果未指定类型参数,则缺省情况下类型参数设置为System.Object类型。 用约束条件表示对泛型类型参数的约束要求时,将营销编译器及其类的开发人员。 通过查看指定的约束条件,编译器可以看到除了System.Object中定义的公共接口之外,还需要满足哪些条件。 编译器有两种帮助。

编译器创建此泛型类型时可以获得更多信息。 编译器确保使用此泛型类型的开发人员提供的参数类型满足指定的条件。 一、在说明如何规范约束之前,先看看判断输入的两个值是否相等的例子。

publicbooldemoequalt(TT1,T t2 ) if ) T1==null ) { return t2==null; }if(T1isicomparablet ) icomparabletval1=t1 asicomparablet; if (T2 asicomparablet (returnval1.com Pareto ) T2 )==0; 未实现else { thrownewargumentexception ($ ' { name of ) T2 ) }为IComparableT )。 } else { thrownewargumentexception ($ ' { name of ) T1 ) IComparableT此代码执行大量强类型转换,在转换前传递的参数是I comparable inter 使用通用约束时,此代码很简单。

publicbooldemoequalt(tT1,T t2 ) wheret : icomparablet=t1.com Pareto ) T2 )==0; 该代码大大简化了前面的代码,在编译时加快了程序运行时可能出现的错误,编译器提前阻止了不符合要求的用法。 到此为止,你不认为上述代码是个好的解决方案吗? 其实严格地说,上述代码是真实的。 为什么会这样呢? IComparable接口很常见,大多数开发人员在设计类型时都提前具有此接口,因此修改了上述代码。 这次不是使用比较到比较两个值是否相等,而是使用Equals比较:

publicbooldemoequalt(TT1,T t2 )=T1.equals ) T2; 上述代码需要注意。 如果DemoEqual定义为通用类,而通用类定义了IComparable约束,则他调用的Equals是IComparable.Equals,相反调用的是System.Object.Equals。 这两个Equals在性能上没有很大的差异。 前者的执行效率只比后者高,很快就会失去。 这是因为在运行时不需要检查程序是否重写了System.Object.Equals,并且如果通用参数类型为值类型,则不执行装箱或开箱操作。 但是,对于重视性能的开发者来说,前者是最好的方案。

Tip :如果有好的方法,我还是建议用好的方法。 例如,上面提到的IComparable.Equals。

在创建泛型类时,建议您在内部创建多个相互重载的方法,以便根据情况调用不同的方法,而其他开发人员调用这些方法时也没有严格的约束。 如果我们定义的约束太严格,通用类的适用范围可能会变窄。 在这种情况下,我们需要考虑自己用通用类的类型编写代码,以确定传入的类型是否从类继承,或者接口是否实现。 泛型约束有三个约束:新约束、结构约束和类约束。 必须谨慎使用这些约束条件,除非对象的默认值必须以0、null或new ) )的形式创建,以限制如何构建对象。

二、归纳约束是为了对调用方提出要求,但如果约束太多,调用方需要做更多的工作来满足这些约束,因此在制定约束时应该权衡利弊,消除多余的约束只留下必要的约束。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。

  • 相关阅读