为什么C#静态类包含非静态类/结构体?
问题描述:
我最近开始学习C#,并且对某些东西感到困惑。静态类的documentation告诉我他们只能包含静态成员。然而,我可以在静态类中定义非静态嵌套类和结构。为什么C#静态类包含非静态类/结构体?
我猜测类/结构定义不包括成员,但为什么这是允许的?如果一个静态类的嵌套类可以被实例化,是不是与静态类的观点相矛盾?我在这里误解了一些明显的东西吗?
答
在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
}
所以周围的静态类是内部类的逻辑容器。它属于那里,因为它是从静态类中使用的,并且通常不能从其他地方访问(如果不公开)。
但是你说得对,这是缺乏文档。他们应该说:
只包含静态成员或嵌套类型
对我而言
答
该文档有点缺乏,但嵌套的类/结构体允许在静态类中,也可以是静态的,或者可以实例化。请看下面的代码:
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
{
}
}
}
在此背景下,静态类类似的命名空间,但命名空间(可能)描述的语义关系比嵌套类更好。
不好措辞,我的意思是说嵌套类。 –
我会说你错过了明显的......静态类的主要目的是防止该类的实例化。 – Phil1970
我认为嵌套类是它的封闭类的*静态成员*,不管它是否是静态类*。 (这与Java不同,Java中嵌套类不是*永远是封闭类的静态成员,而术语“静态类”意味着*是静态成员的嵌套类。) –