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

问题描述:

我最近开始学习C#,并且对某些东西感到困惑。静态类的documentation告诉我他们只能包含静态成员。然而,我可以在静态类中定义非静态嵌套类和结构。为什么C#静态类包含非静态类/结构体?

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

+0

不好措辞,我的意思是说嵌套类。 –

+0

我会说你错过了明显的......静态类的主要目的是防止该类的实例化。 – Phil1970

+0

我认为嵌套类是它的封闭类的*静态成员*,不管它是否是静态类*。 (这与Java不同,Java中嵌套类不是*永远是封闭类的静态成员,而术语“静态类”意味着*是静态成员的嵌套类。) –

在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 
} 

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

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

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

对我而言
+0

从某种意义上说,嵌套类类定义是静态的。 – Haukinger

+0

@Haukinger:不,您可以创建多个实例:var i1 = new OuterC.InnerC(); var i2 = new OuterC.InnerC();'(如果可以访问) –

+0

当然,定义的类型可能是静态的或者不是,但_defnition_是静态的。你不写'var x = new OuterC(); var y = new x.InnerC();'... – Haukinger

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

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 
     { 

     } 
    } 
} 

在此背景下,静态类类似的命名空间,但命名空间(可能)描述的语义关系比嵌套类更好。