嵌套类型是隐式静态的吗?
Are nested types implicitly static?
在 C# 5.0 语言规范中说:
Note that constants and nested types are classified as static members.
所以如果我写:
class A
{
int a;
class B
{
public void foo()
{
int j = a; // ERROR
}
}
}
a 到 j 的赋值给我一个 CS0120 错误
"An object reference is required for the nonstatic field, method, or
property 'member'"
所以我可以理解 foo
也是隐式静态的。
然而,当我查看反编译代码和 IL 代码时,没有指示 static 关键字!
internal class A
{
private class B
{
public void foo()
{
}
}
private int a;
}
// Nested Types
.class nested private auto ansi beforefieldinit B
extends [mscorlib]System.Object
{
// Methods
.method public hidebysig
instance void foo () cil managed
{
}
...
}
嵌套类型真的是所有方法都隐式静态的静态类型吗?
"Nested types are classified as static members"
Is a nested type really a static type with all methods implicitly static?
否 - Type 的定义是静态成员,但类型本身不是静态的。
当它说
Note that constants and nested types are classified as static members.
这意味着您可以 创建 嵌套 class 的实例而无需父 class.
的实例
换句话说,代码
public class Parent
{
public class Child
{
}
}
要调用 new Parent.Child()
,您不需要先调用 new Parent()
或类似的东西。
你的代码有问题
您的实际问题是嵌套类型的实例与父类型的实例是分开的 - 您的代码,
class A
{
int a;
class B
{
public void foo()
{
int j = a; // ERROR
}
}
}
无法编译,因为在 A.B.foo()
中,字段 a
是 A
的 instance (i.e. not static) member,而 B
没有 要参考的 A
个实例 。
如何使用嵌套类型的一种使用方法
您可以将类型嵌套视为将父项中私有成员的可访问性扩展到子项的一种方式,例如
public class Parent
{
private int field;
public class Child
{
public void WriteFieldFromParent(Parent parent)
{
Console.WriteLine(parent.field);
}
}
}
编译!您可以从 Parent.Child
class 中获取 private 字段 field
in Parent
的值,因为它是嵌套的。请注意,我需要将 Parent
的实例传递给 Parent.Child.WriteFieldFromParent
.
其实MSDN page on nested types(我不知道为什么我第一次写这个答案时没有提到它)给出了一个类似于我的例子,并说:
A nested type has access to all of the members that are accessible to its containing type. It can access private and protected members of the containing type, including any inherited protected members.
您的代码将无法编译,因为 a
超出范围。你应该这样写:
class A
{
int a;
class B
{
public void foo()
{
int j = new A().a;
}
}
}
或
class A
{
static int a;
class B
{
public void foo() {
int j = a;
}
}
}
在 C# 5.0 语言规范中说:
Note that constants and nested types are classified as static members.
所以如果我写:
class A
{
int a;
class B
{
public void foo()
{
int j = a; // ERROR
}
}
}
a 到 j 的赋值给我一个 CS0120 错误
"An object reference is required for the nonstatic field, method, or property 'member'"
所以我可以理解 foo
也是隐式静态的。
然而,当我查看反编译代码和 IL 代码时,没有指示 static 关键字!
internal class A
{
private class B
{
public void foo()
{
}
}
private int a;
}
// Nested Types
.class nested private auto ansi beforefieldinit B
extends [mscorlib]System.Object
{
// Methods
.method public hidebysig
instance void foo () cil managed
{
}
...
}
嵌套类型真的是所有方法都隐式静态的静态类型吗?
"Nested types are classified as static members"
Is a nested type really a static type with all methods implicitly static?
否 - Type 的定义是静态成员,但类型本身不是静态的。
当它说
Note that constants and nested types are classified as static members.
这意味着您可以 创建 嵌套 class 的实例而无需父 class.
的实例换句话说,代码
public class Parent
{
public class Child
{
}
}
要调用 new Parent.Child()
,您不需要先调用 new Parent()
或类似的东西。
你的代码有问题
您的实际问题是嵌套类型的实例与父类型的实例是分开的 - 您的代码,
class A
{
int a;
class B
{
public void foo()
{
int j = a; // ERROR
}
}
}
无法编译,因为在 A.B.foo()
中,字段 a
是 A
的 instance (i.e. not static) member,而 B
没有 要参考的 A
个实例 。
如何使用嵌套类型的一种使用方法
您可以将类型嵌套视为将父项中私有成员的可访问性扩展到子项的一种方式,例如
public class Parent
{
private int field;
public class Child
{
public void WriteFieldFromParent(Parent parent)
{
Console.WriteLine(parent.field);
}
}
}
编译!您可以从 Parent.Child
class 中获取 private 字段 field
in Parent
的值,因为它是嵌套的。请注意,我需要将 Parent
的实例传递给 Parent.Child.WriteFieldFromParent
.
其实MSDN page on nested types(我不知道为什么我第一次写这个答案时没有提到它)给出了一个类似于我的例子,并说:
A nested type has access to all of the members that are accessible to its containing type. It can access private and protected members of the containing type, including any inherited protected members.
您的代码将无法编译,因为 a
超出范围。你应该这样写:
class A
{
int a;
class B
{
public void foo()
{
int j = new A().a;
}
}
}
或
class A
{
static int a;
class B
{
public void foo() {
int j = a;
}
}
}