为什么C# static 类 可以包含non-static classes/structs?
Why can C# static classes contain non-static classes/structs?
我最近开始学习 C#,但我对某些事情感到困惑。 documentation for static classes 告诉我它们只能包含静态成员。然而,我可以在我的静态 class.
中定义非静态嵌套 classes 和结构
我猜 class/struct 定义不算作 成员 ,但为什么允许这样做?如果静态class的嵌套class可以被实例化,这不是与静态class的观点相矛盾吗?我是不是误解了一些明显的东西?
文档有点欠缺,但是static类中允许嵌套classes/structs,也可以是static,也可以实例化。考虑以下代码:
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
{
}
}
}
在这种情况下,静态 类 类似于命名空间,但命名空间(可能)比嵌套 类 更好地描述了语义关系。
在 C# 中嵌套的 classes 不是子 classes,周围的 class 更像是另一个命名空间。您无权从内部 class 访问外部 class 的实例(与 f.e. Java 相对)。这就是静态 classes 可以包含嵌套类型的原因。
一个著名的例子,静态的 LINQ class Enumerable
。它包含许多助手 classes:
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
}
所以周围的静态 class 是内部 class 的逻辑容器。它属于那里,因为它是从静态 class 使用的,并且通常无法从其他地方访问(如果不是 public)。
但你是对的,这是缺少文档。他们应该说:
Contains only static members or nested types
我最近开始学习 C#,但我对某些事情感到困惑。 documentation for static classes 告诉我它们只能包含静态成员。然而,我可以在我的静态 class.
中定义非静态嵌套 classes 和结构我猜 class/struct 定义不算作 成员 ,但为什么允许这样做?如果静态class的嵌套class可以被实例化,这不是与静态class的观点相矛盾吗?我是不是误解了一些明显的东西?
文档有点欠缺,但是static类中允许嵌套classes/structs,也可以是static,也可以实例化。考虑以下代码:
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
{
}
}
}
在这种情况下,静态 类 类似于命名空间,但命名空间(可能)比嵌套 类 更好地描述了语义关系。
在 C# 中嵌套的 classes 不是子 classes,周围的 class 更像是另一个命名空间。您无权从内部 class 访问外部 class 的实例(与 f.e. Java 相对)。这就是静态 classes 可以包含嵌套类型的原因。
一个著名的例子,静态的 LINQ class Enumerable
。它包含许多助手 classes:
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
}
所以周围的静态 class 是内部 class 的逻辑容器。它属于那里,因为它是从静态 class 使用的,并且通常无法从其他地方访问(如果不是 public)。
但你是对的,这是缺少文档。他们应该说:
Contains only static members or nested types