我最近开始学习C#而且我对某些事感到困惑。静态类的documentation告诉我它们只能包含静态成员。然而,我可以在我的静态类中定义非静态嵌套类和结构。
我猜测类/结构定义不算作成员,但为什么允许这样做?如果可以实例化静态类的嵌套类,那是否与静态类相矛盾?我在这里误解了一些明显的东西吗?
答案 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
{
}
}
}
在此上下文中,静态类与命名空间类似,但命名空间(可能)比嵌套类更好地描述语义关系。