C# 使用';I';接口的前缀是否为
这就是问题所在?那么,在开发c#项目时不使用这种约定有多大的罪恶呢?此约定在.NET类库中广泛使用。然而,至少可以说,我不是一个球迷,不仅仅是因为哮喘的原因,但我不认为这有任何贡献。例如,IPSec是PSec的接口吗?IIOPConnection是IOPConnection的接口吗?我通常都会去定义看看C# 使用';I';接口的前缀是否为,c#,java,C#,Java,这就是问题所在?那么,在开发c#项目时不使用这种约定有多大的罪恶呢?此约定在.NET类库中广泛使用。然而,至少可以说,我不是一个球迷,不仅仅是因为哮喘的原因,但我不认为这有任何贡献。例如,IPSec是PSec的接口吗?IIOPConnection是IOPConnection的接口吗?我通常都会去定义看看 那么,使用这个约定不会引起混乱吗 是否有任何著名的c#项目或库放弃此约定 有没有像ApacheWicket那样混合约定的c#项目 Java类库已经有很多年没有它了,我觉得我从来没有在没有它的
- 那么,使用这个约定不会引起混乱吗
- 是否有任何著名的c#项目或库放弃此约定
- 有没有像ApacheWicket那样混合约定的c#项目
IMyClass
是MyClass
的接口。这是有道理的,可以避免不必要的混乱。还要记住:
语法与实现/扩展的对比。最后,您可以通过简单地在VS中检查工具提示/转到来绕过所有这些,但是对于纯粹的可读性,我认为标准很重要
我想说,不遵守这个惯例会让你陷入.NET地狱。这是一个惯例,对我来说,它几乎与在Python中使用实例方法中的
self
一样重要。Java和C的区别在于Java允许您轻松区分是实现接口还是扩展类,因为它有相应的关键字实现和扩展
由于C#只有:
来表示实现或扩展,我建议遵循标准,在接口名称前加上I。现有的惯例可以帮助我们所有人。如果有其他.net开发人员可能与您合作,那么是的,遵循约定。使用I for interfaces违背了接口imo的全部观点,即它是一个可以将不同具体实现插入到依赖项中的连接器
使用数据库的对象需要一个数据存储,而不是IDataStore,它应该由配置决定是否获得一个DatabaseDataStore或FileSystemDataStore或插入其中的任何东西(或用于测试的MockDataStore)。恕我直言,在你的帖子中,你只考虑了你的需求(I,I,I),而不是代码读者的需求。如果你是一个一人的商店,那么就足够公平了,但是如果你的代码被别人阅读过,那就考虑他们希望界面有一个i-前缀——这就是它在.NET中的方式,现在有太多的人习惯于改变它。
此外,如果您为类使用更可读的名称,也会有所帮助。什么是PSec?当我甚至不知道什么是PSec时,我如何判断IPSec是否是一个接口?如果PSec改名为PersonalSecurity,则IPersonalSecurity更可能是一个接口。一个想法是“I”部分后面可以跟一个动词,说明实现接口的类的作用;像ISaveXmlData
,形成了一个很好的人类语言名称。关键是一致性——只要你坚持在所有接口前面加上I前缀,或者根本不加前缀,这是一个偏好问题
我对工作中的接口使用I前缀,因为现有代码已经将其用于每个接口的命名约定。我发现,只需在基类名称中查找I前缀,就可以更直观地快速确定一个类是实现了接口还是实现了另一个类
另一方面,工作中的一些旧项目不使用这种命名约定,这使得代码的可读性稍差,但可能只是因为我习惯了前缀。在我看来,这也是一种不好的做法。除您的原因外,还有以下原因:
- 接口的全部目的是抽象出实现细节。因此,如果使用ipram或Param调用一个方法,这应该无关紧要李>
- 精心设计的工具有自己的可能性用图标标记接口李>
- 如果您的眼睛在IDE中搜索名称,最重要的部分是字符串的开头。也许你的类是按字母表排序的,现在你有了一组相似的名字,都是从I开始的。。。在一起它们看起来很相似,但容易区分会有好处。从人体工程学角度来看,使用I字头是错误的李>
- 更烦人的是:implist,impltthat,AFoo代表抽象Foo,AImplFooBar代表抽象Foo,哪个实现了Bar?SSomething作为Singleton,还是SMath作为static类?住手!:)李>
看看BCL。在基类库中有IList、IQueryable和IDisposable。
如果你不在它前面加上一个“I”,人们怎么知道它是一个接口而不是定义
不管怎样,在我看来,有时候,只有我的2美分的最佳实践会凌驾于惯例之上。虽然我个人可能不喜欢该公约,但不使用它违背了最佳实践,这种最佳实践已经存在了很长时间,我不想去想
在这种情况下,我会更多地从其他人如何做的角度来看待它。因为99%的普通世界都会在前面加上“我”,这足以保持这种最佳实践。如果你必须引进一个承包商或一个新的开发者,你应该能够
SqlDataReader dr = cmd.ExecuteReader (CommandBehavior.SequentialAccess);
if (!dr.HasRows) {
// ...
}
while (dr.Read ()) {
string name = dr.GetString (0);
// ...
}
IDataReader dr = cmd.ExecuteReader (CommandBehavior.SequentialAccess);
if (!dr.HasRows) {
// ...
}
while (dr.Read ()) {
string name = dr.GetString (0);
// ...
}
List foo = new List(); // Why does it fail?
ISomeInterface s = factory.create();