为什么C#静态类包含非静态类/结构?

时间:2017-10-05 10:14:52

标签: c# static-classes

我最近开始学习C#而且我对某些事感到困惑。静态类的documentation告诉我它们只能包含静态成员。然而,我可以在我的静态类中定义非静态嵌套类和结构。

我猜测类/结构定义不算作成员,但为什么允许这样做?如果可以实例化静态类的嵌套类,那是否与静态类相矛盾?我在这里误解了一些明显的东西吗?

2 个答案:

答案 0 :(得分:7)

在C#中,嵌套类不是子类,周围的类更像是另一个名称空间。您无法从内部类(而不是f.e.Java)访问外部类的实例。这就是静态类可以包含嵌套类型的原因。

一个着名的例子,LINQ class Enumerable是静态的。它包含许多辅助类:

public static class Enumerable
{
    // many static LINQ extension methods...

    class WhereEnumerableIterator<TSource> : Iterator<TSource>
    {
       // ...
    }

    internal class EmptyEnumerable<TElement>
    {
        public static readonly TElement[] Instance = new TElement[0];
    }

    public class Lookup<TKey, TElement> : IEnumerable<IGrouping<TKey, TElement>>, ILookup<TKey, TElement>
    {
        // ...
    }

     // many others
}

因此,周围的静态类是内部类的逻辑容器。它属于那里,因为它是从静态类中使用的,并且通常无法从其他地方访问(如果不是公共的话)。

但你是对的,缺乏文档。他们应该说:

  

仅包含静态成员或嵌套类型

答案 1 :(得分:4)

文档有点缺乏,但嵌套类/结构在静态类中是允许的,也可以是静态的,或者可以实例化。请考虑以下代码:

namespace StaticClasses
{
    class Program
    {
        static void Main(string[] args)
        {
            new Foo(); // Cannot create an instance of the static class 'Foo'
            new Foo.Bar(); // Cannot create an instance of the static class 'Foo.Bar'
            new Foo.Baz();
        }
    }

    static class Foo
    {
        public static class Bar
        {

        }

        public class Baz
        {

        }
    }
}

在此上下文中,静态类与命名空间类似,但命名空间(可能)比嵌套类更好地描述语义关系。