C# 我应该将接口定义与其实现放在同一命名空间中吗

C# 我应该将接口定义与其实现放在同一命名空间中吗,c#,interface,C#,Interface,如果我定义一个接口ITestInterface,然后立即创建一个实现该接口的类,以便在应用程序中使用,那么可以将类和接口保持在同一名称空间中,还是将它们分开。i、 e.Test.Interfaces和Test.Interfaces.Implementation 我的接口和它的实现都将在它自己的程序集中,所以我不打算创建另一个程序集来包含接口本身 这与c语言特别相关,但我想它可以涵盖任何语言。System.Collections.ArrayList实现System.Collections.ILis

如果我定义一个接口
ITestInterface
,然后立即创建一个实现该接口的类,以便在应用程序中使用,那么可以将类和接口保持在同一名称空间中,还是将它们分开。i、 e.
Test.Interfaces
Test.Interfaces.Implementation

我的接口和它的实现都将在它自己的程序集中,所以我不打算创建另一个程序集来包含接口本身


这与c语言特别相关,但我想它可以涵盖任何语言。

System.Collections.ArrayList实现System.Collections.IList。如果微软这样做了,你为什么不呢?

这是一个非常抽象的问题。接口的原因是什么?它是一个公共API/框架还是一个简单的应用程序?您是否将拥有同一接口的多个实现


如果接口位于它们自己的程序集中,那么基本名称空间与程序集名称匹配是一种很好的做法。但是听起来好像是说类和接口在同一个程序集中。

最好使用.NET预定义类的既定约定。例如,在
System.Collections.Generic
命名空间中,我们可以看到
IDictionary
Dictionary
都在那里。因此,将它们放在同一名称空间中可能是最好的主意

此外,由于接口和实现很可能都有相同的用途,因此最好将它们分组在同一名称空间中

这与c#有关,但我想它可以涵盖任何 语言

在Java中,将两者放在同一个包中是很典型的。我能想到的一个例外可能是包持久性中的DAO接口,以及该包下的子包中的不同实现(例如jdbc、hibernate、jdo等)

您可以将公共接口看作是从包中公开的API。我可以看到实现类可能是包私有的,从而阻止用户通过接口以外的任何方式访问实现。必须提供公共工厂方法才能授予访问权限。

您的意图是什么

如果您希望对代码的其余部分“隐藏”实现和/或选择在运行时“注入”几个可用实现中的哪一个,那么您的类无论如何都不应该是公共的,因此它驻留在哪个命名空间中并不重要


否则,驻留在同一命名空间中的接口和类都没有问题。

同一命名空间中的独立程序集如何?我喜欢。这取决于目标。这里的许多答案都依赖于MS库的现有示例。这很好,也不一定是错的,但MS在创建这些库方面的目标与其他人或团队在创建业务应用程序方面的目标不同

如果您的目标是依赖项反转,例如作为一个应用程序的一部分,那么您的接口和实现就不会在同一名称空间中


另请参见:.

Test.Interfaces.Implementation似乎有点矛盾,因为接口和实现是相互排斥的。我不会根据名称空间包含的内容类型来组织名称空间,而是根据它们的用途来组织名称空间。干杯。这似乎也与@Tudor对微软的做法所说的一致。@Tim我看不出你的相关性。问题是把接口放在哪里,而不是它是否需要。当您向包含实现接口的类的程序集添加引用时,这可能会导致问题。如果没有对包含接口的程序集的引用,编译器将抛出错误。然后,调用者的任务是跟踪包含接口的程序集。我认为问题在于添加实现程序集的人没有接口程序集。您不必根据其他人可能错误地使用它们的方式来设计解决方案。