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 和其他类型放弃了它们的 C
s。这确实使非接口繁重的代码更易于查看,但如果您以 I
开头的 class 名称以两个字母的首字母缩写词开头(因为两个字母的首字母缩写词必须完全根据 .NET 风格指南大写),但这种情况很少见。
(我注意到通用类型名称占位符也以 T
为前缀,例如 Dictionary
中的 TKey
和 TValue
。
为什么这是必要的一个例子是在处理 .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 之外根本看不到。
我正在尝试 learn/understand Rx,特别是 RxJS,并不断看到对 IObservable、IObserver 等的引用
谁能告诉我开头的 I
是什么意思 and/or 它来自哪里?
根据我的搜索,<T>
似乎适用于该类型。如果这是错误的或幼稚的,我也希望对此做出一些澄清。
谢谢!
在过去的 C++ MFC 时代,Microsoft 将匈牙利符号简化为一种非常恼人的艺术形式,其中所有具体的 classes 都以 C
为前缀,而它们的 COM 接口则以 I
,这确实有助于避免 COM 接口和 class 可能共享相同名称的冲突,从而使您的项目变得混乱。
此表示法的一部分延续到 .NET 中,除了只有接口保留了 I
前缀,但 classes 和其他类型放弃了它们的 C
s。这确实使非接口繁重的代码更易于查看,但如果您以 I
开头的 class 名称以两个字母的首字母缩写词开头(因为两个字母的首字母缩写词必须完全根据 .NET 风格指南大写),但这种情况很少见。
(我注意到通用类型名称占位符也以 T
为前缀,例如 Dictionary
中的 TKey
和 TValue
。
为什么这是必要的一个例子是在处理 .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 之外根本看不到。