非静态类的内部静态类的静态属性是否在非静态类的实例之间共享?

时间:2012-11-29 20:01:46

标签: c# .net inner-classes static-members

一个例子值得一千个愚蠢的问题:

public class OuterClass
{
    public static class InnerClassEventArgs : EventArgs
    {
        public static int SomeInt;
    }
}

并且在遥远的星系中:

public void SomeFunkyFunc()
{
    OuterClass Instance1;
    OuterClass Instance2;

    Instance1.InnerClassEventArgs.SomeInt = 1;
    Instance2.InnerClassEventArgs.SomeInt = 2;

    //WHAT WOULD Instance1.InnerClassEventArgs.Someint == ?
}

是的,我现在意识到我输入了这个,我几乎编码了所有我需要回答我自己的问题。我宁愿不创建一个新项目,如果比我聪明的人知道他们的头脑,那就不会遇到麻烦。

2 个答案:

答案 0 :(得分:3)

Instance1.InnerClassEventArgs.SomeInt等于2.静态字段在课程的所有实例中共享 - 或as MSDN puts it

  

静态成员始终由类名访问,而不是实例名。无论创建了多少个类实例,都只存在一个静态成员的副本。

请注意,您的特定示例将无法编译 - 您将收到一条错误消息,指出“无法在非静态上下文中访问静态类'InnerClassEventArgs'。”

您必须使用以下代码,这有望使行为更容易理解:

OuterClass.InnerClassEventArgs.SomeInt = 1;
OuterClass.InnerClassEventArgs.SomeInt = 2;

答案 1 :(得分:0)

静态类只有一个实例,它的所有用法“共享”(在你的例子中,是所有OuterClass的实例)。因此,该对象的状态将是任何用法所做的所有更改的总和。在这个简单的示例中,SomeInt将为2,无论您使用哪个OuterClass实例再次访问它(Instance1或Instance2)。

我方便地忽略了以下所有内容:

  • 静态类不能从任何其他类继承。因此,InnerClassEventArgs不能从EventArgs继承。
  • Instance1和Instance2未初始化;如果使用ReSharper(“X可能在访问之前可能未初始化”),这将导致自己的编译时错误。
  • 无法基于任何一个实例访问静态成员(包括嵌套的静态类);您将在静态上下文中访问InnerClassEventArgs。