我正在尝试学习/理解Rx,特别是RxJS,并继续看到对IObservable,IObserver等的引用。
有人能告诉我领先I
的含义和/或来自何处?
从我的搜索来看,<T>
似乎是该类型。如果这是错误的或天真的,我也会对此有所澄清。
谢谢!
答案 0 :(得分:4)
在MFC for C ++的旧时代,微软将匈牙利语符号归结为一种非常恼人的艺术形式,其中所有具体类都以C
为前缀,其COM接口为I
,这有助于避免COM接口和类可能共享相同名称并使项目变得混乱的冲突。
这种表示法的一部分延续到.NET中,除了只有接口保留I
前缀,但类和其他类型都删除了C
。这确实使得非界面繁重的代码更易于查看,但是如果您开始使用以I
开头的2个字母的缩写,可能会导致歧义(因为两个字母的首字母缩略词必须根据.NET风格指南),但这种情况很少见。
(我注意到通用类型名称占位符也以T
为前缀,例如TKey
中的TValue
和Dictionary
。
为什么这是必要的一个例子是在.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
前缀。