嵌套类型是否隐式静态?

xdevel2000

在C#5.0语言规范中,它表示:

请注意,常量和嵌套类型被归类为静态成员。

所以如果我写:

class A
{
   int a;

   class B
   {
       public void foo()
       {
           int j = a; // ERROR
       } 
   }
}

分配给j给我CS0120错误

“非静态字段,方法或属性“成员”需要对象引用”

所以我可以理解这也是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 
        {

        } 
        ...
    }

嵌套类型真的是所有类型的方法都隐式静态的静态类型吗?

李慧夏|

“嵌套类型被分类为静态成员”

嵌套类型真的是所有类型的方法都隐式静态的静态类型吗?

否-类型的定义是静态成员,但是类型本身不是静态的。

当它说

请注意,常量和嵌套类型被归类为静态成员。

这意味着您可以创建嵌套类的实例而无需父类的实例。

换句话说,用代码

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,并B没有实例A引用。


如何使用 使用嵌套类型的一种方法

您可以将类型嵌套视为扩展父级中私有成员对孩子的可访问性的一种方式,例如

public class Parent
{
    private int field;

    public class Child
    {
        public void WriteFieldFromParent(Parent parent)
        {
            Console.WriteLine(parent.field);
        }
    }
}

编译!你可以得到的值私人领域fieldParentParent.Child因为它的嵌套类。请注意,我需要将的实例传递ParentParent.Child.WriteFieldFromParent

实际上,关于嵌套类型MSDN页面(我不知道为什么在初次编写此答案时没有引用它)给出了类似于我的示例,并说:

嵌套类型可以访问其包含类型可以访问的所有成员。它可以访问包含类型的私有成员和受保护成员,包括任何继承的受保护成员。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章