当属性达到目的时,标记接口的需求是什么?

Man*_*ish 13 .net c#

我有点困惑

标记接口与属性的目的.

他们的目的对我来说是一样的(如果我错了,请原谅我).

任何人都可以解释他们的目的有何不同?

Ond*_*cny 14

以下是两者的一些优点.

标记界面:

  • 使用动态类型检查更容易检查('obj is IMarker');
  • 允许将来的功能和数据可扩展性(即将"标记"接口转换为实际声明某些成员的"完整"接口);
  • 可用于泛型类型约束;

另一方面,属性:

  • 提供更清晰的元数据分离;
  • 允许通过其构造函数或属性指定其他信息;
  • 允许对实体进行多次申请;
  • 在适用于不同类型的实体方面是通用的,而不仅仅是类;

它在很大程度上取决于特定应用程序的体系结构和设计,是否适合在特定情况下使用标记接口或属性.


Luc*_*ero 9

几年前,在Java 5之前的时代,Java并不支持属性.因此,要"标记"类或接口以便在运行时检查它们,您将使用标记接口,这基本上是一个空接口,但您仍然可以检查是否可以将实例转换为此接口.

在.NET中,除了特殊用例(例如允许使用扩展方法)之外,不应使用标记接口,因为属性提供了使用元信息标记类(以及更多)的更好方法.Java 5和更新版本也是如此,其中引入了注释,应该使用它.

  • @RonaldV:IMO,标记接口是空的*根据定义*.因此,如果接口不为空,则接下来必须不是标记接口.我肯定会说你提到的接口都不是标记接口.在IDisposable的情况下尤其如此,它具有由语言原语调用的方法. (10认同)
  • 我不同意属性比标记接口"更好".属性是运行时可访问的元数据.阅读它们是一种痛苦,需要反思,与"是"相比,本质上是缓慢的,不是类型安全的.你也不能创建像`where T:[Serializable]`这样的通用约束,但你可以做`其中T:ISerializable`. (4认同)

Cod*_*aos 9

如果可以使用它,则首选属性.

但是有一些与静态类型相关的功能只有接口可以提供:

  1. 您可以为其添加扩展方法
  2. 您可以将其用作通用约束


Mar*_*ell 7

另外,检查接口要快得多,因为CLI是为此而设计的,并且具有操作码(就像c#:is/as一样).

检查属性需要反思; 慢得多.

虽然看起来虽然其他答案涵盖了大多数要点,但是:属性在可以传递给它们的值方面受到更多限制; 主要是原语和字符串.

  • 如果属性的反射应该成为性能问题,则可以轻松地使用类型为键的字典作为缓存.因此,单独的性能优势通常不应该使用接口而不是属性. (2认同)
  • 与简单的RTTI检查相比,即使字典访问也非常慢 (2认同)