IObservable<T> 或 IObserver<T> 中的 'I' 是什么意思?

What does the 'I' in IObservable<T> or IObserver<T> mean?

我正在尝试 learn/understand Rx,特别是 RxJS,并不断看到对 IObservable、IObserver 等的引用

谁能告诉我开头的 I 是什么意思 and/or 它来自哪里?

根据我的搜索,<T> 似乎适用于该类型。如果这是错误的或幼稚的,我也希望对此做出一些澄清。

谢谢!

在过去的 C++ MFC 时代,Microsoft 将匈牙利符号简化为一种非常恼人的艺术形式,其中所有具体的 classes 都以 C 为前缀,而它们的 COM 接口则以 I,这确实有助于避免 COM 接口和 class 可能共享相同名称的冲突,从而使您的项目变得混乱。

此表示法的一部分延续到 .NET 中,除了只有接口保留了 I 前缀,但 classes 和其他类型放弃了它们的 Cs。这确实使非接口繁重的代码更易于查看,但如果您以 I 开头的 class 名称以两个字母的首字母缩写词开头(因为两个字母的首字母缩写词必须完全根据 .NET 风格指南大写),但这种情况很少见。

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

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

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

然而,在 Java 中,接口没有前缀 I 而是具有类似 class 的名称。这是 "correct" 还是 "better" 完全有待商榷。 C++ 没有接口类型,只有纯抽象 classes 和多重继承,因此 I 前缀通常在 COM 之外根本看不到。