IObservable <t>或IObserver <t>中的“I”是什么意思?

时间:2015-11-05 03:06:09

标签: system.reactive rxjs

我正在尝试学习/理解Rx,特别是RxJS,并继续看到对IObservable,IObserver等的引用。

有人能告诉我领先I的含义和/或来自何处?

从我的搜索来看,<T>似乎是该类型。如果这是错误的或天真的,我也会对此有所澄清。

谢谢!

1 个答案:

答案 0 :(得分:4)

在MFC for C ++的旧时代,微软将匈牙利语符号归结为一种非常恼人的艺术形式,其中所有具体类都以C为前缀,其COM接口为I,这有助于避免COM接口和类可能共享相同名称并使项目变得混乱的冲突。

这种表示法的一部分延续到.NET中,除了只有接口保留I前缀,但类和其他类型都删除了C。这确实使得非界面繁重的代码更易于查看,但是如果您开始使用以I开头的2个字母的缩写,可能会导致歧义(因为两个字母的首字母缩略词必须根据.NET风格指南),但这种情况很少见。

(我注意到通用类型名称占位符也以T为前缀,例如TKey中的TValueDictionary

为什么这是必要的一个例子是在.NET中处理集合时,如果你正在构建一个可重用的库并且不想公开实现细节(例如,如果你使用List<T>或{{1作为底层集合字段类型),您可以使用作为接口的T[]IList<T>。如果简单地将接口称为IReadOnlyList<T>,它将与实际类型List<T>冲突,并且List<T>(接口)可能会与ReadOnlyList<T>(类)混淆。

如果类和接口具有不同的命名空间,您可能会认为这不会成为问题。 C这样做:ReadOnlyCollection<T>类型和标量存在于不同的名称空间中,遗憾的是,每次使用struct类型名称时,其使用必须以struct为前缀(例如声明: struct)。人们通过使用带有匿名结构的struct Foo foo来解决这个问题,但我觉得最终结果是混乱的(Linux内核编码指南也禁止这样做)。

但是,在Java中,接口不以typedef为前缀,而是具有类似名称的名称。这是“正确的”还是“更好的”完全有争议。 C ++没有接口类型,只有纯抽象类和多重继承,因此在COM之外通常不会看到I前缀。