C# 顶级通用类库的Class.Class vs Namespace.Class?

C# 顶级通用类库的Class.Class vs Namespace.Class?,c#,.net,class,nested-class,C#,.net,Class,Nested Class,哪一个更可接受(最佳实践)?: vs 同样对于#2,代码大小是通过使用分部类来管理的,因此每个嵌套类都可以位于单独的文件中,扩展方法也是如此(除了没有嵌套类) 我更喜欢#2,原因有两个,比如能够使用已经常用的类型名,比如IO,我不想替换或冲突 你喜欢哪一个?每种方法都有利弊吗?这个案例的最佳实践是什么 编辑:这两者之间还会有性能差异吗?我认为您应该避免公开(公共)嵌套类和接口,或者至少Microsoft FxCop会这么说。因此,第一个更好 编辑:(是的,改为第一个,我不应该回复,所以当我非常累

哪一个更可接受(最佳实践)?:

vs

同样对于
#2
,代码大小是通过使用分部类来管理的,因此每个嵌套类都可以位于单独的文件中,扩展方法也是如此(除了没有嵌套类)

我更喜欢
#2
,原因有两个,比如能够使用已经常用的类型名,比如
IO
,我不想替换或冲突

你喜欢哪一个?每种方法都有利弊吗?这个案例的最佳实践是什么


编辑:这两者之间还会有性能差异吗?

我认为您应该避免公开(公共)嵌套类和接口,或者至少Microsoft FxCop会这么说。因此,第一个更好

编辑:(是的,改为第一个,我不应该回复,所以当我非常累的时候)

我更喜欢#1,因为它不需要我通过一个班级呼叫到另一个班级。我认为这会让事情变得有点混乱,因为在一般情况下,对象应该有成员类、方法等,它们直接处理通过实例化类生成的对象。这意味着您没有真正遵循OOP的原则。微软也说#1是最佳实践。

我想说#1。因为当您将许多类捆绑到一个静态类中时,您所做的事情与命名空间的用途相同。这就是为什么我会说最好让名称空间为您做到这一点

在这种情况下,您还可以通过添加using-In-case-you-want来避免在所有内容前面写“NP”。我认为您应该嵌套名称空间,这样它们就不会发生冲突,或者使用比IO更多的描述名称空间的名称


大多数情况下,最佳实践是微软所做的,我从未见过他们所做的#2

我从未见过你的2号手机被使用过。它让我想起了VB6模块。

名称空间在C#程序中主要以两种方式使用。首先,.NETFramework类使用名称空间来组织其许多类。其次,声明自己的名称空间可以帮助控制大型编程项目中类和方法名称的范围

当您查看.NET framework本身时,您可以看到几乎所有内容的结构都与第一个示例(名称空间)相似,而实际上没有任何内容的结构与第二个示例(嵌套类型)相似。很少使用嵌套类型的情况是,它们与外部类型的关系如此紧密,以至于它们本质上是外部类型的一部分,但出于代码重用等原因,它们需要成为一个单独的类

因此,如果“最佳实践”的意思是“将事物用于设计的目的”、“最像.NET框架”和“与.NET设计范式最接近”,那么就没有竞争;对组织使用名称空间,而不是嵌套类型

关于您的编辑-不,在现实世界中没有重要的性能差异。

我更喜欢#1,让名称空间来做。正如其他人所说,调用类来访问其他类是非常混乱的

此外,当您执行反射或使用提供程序模型等更复杂的操作时,将嵌套类作为实际的提供程序部分或您试图达到的目标会变得棘手


最后,测试嵌套类和接口会使测试更加困难。

实际上,我有时会使用#2。我会在下一行之后讨论为什么。但是在空静态类的情况下,名称空间更理想,因为这就是它们的用途

然而,如果您有一个派生新类的用例,有时嵌套这些派生类可能是有意义的

例如,您可以:

public abstract class Vehicle
{
    int NumberOfWheels;
}

public class SportsCar : Vehicle
{
}
现在,您可能希望将它们都放在Vehicle名称空间下,这样父类就不会被所有不同的派生类弄乱。然而,这是一个想法

相反,嵌套它们会给您带来所有好处:

public abstract class Vehicle
{
    int NumberOfWheels;

    public class SportsCar : Vehicle
    {
    }
}

你不是说第一个吗?第二个是嵌套类。我想你指的是第一个;)第一个!事实上,对不起:-)我也发+1:-P
public abstract class Vehicle
{
    int NumberOfWheels;
}

public class SportsCar : Vehicle
{
}
public abstract class Vehicle
{
    int NumberOfWheels;

    public class SportsCar : Vehicle
    {
    }
}