【问题标题】:Static property of inner static class of non-static class shared between instances of the non-static class?非静态类的实例之间共享的非静态类的内部静态类的静态属性?
【发布时间】:2012-11-29 20:01:45
【问题描述】:

一个例子胜过一千个愚蠢的问题,所以:

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 == ?
}

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

【问题讨论】:

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


【解决方案1】:

Instance1.InnerClassEventArgs.SomeInt 等于 2。静态字段在类的所有实例之间共享 -- 或 as MSDN puts it

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

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

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

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

【讨论】:

  • 其实根本编译不了:Cannot reference a type through an expression
  • 啊,关于 NullReference 的观点很好。我可以在这里说谢谢吗?
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-06-11
    • 2013-07-05
    • 1970-01-01
    • 2011-01-17
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多