【问题标题】:How do inner classes work in c#?内部类如何在 C# 中工作?
【发布时间】:2010-08-12 15:34:44
【问题描述】:

如果我有这样的课程:

public class C1
{
    public class SC1 {}
    public class SC2 {}

    public class C1()
    {

    }

}

为什么我不能这样做:

C1 c1 = new C1();

c1.SC1.somePropety = 1234;

【问题讨论】:

标签: c#


【解决方案1】:

SC1 是一个类型定义。您仍然需要将类型实例化为变量。

编辑:delnan 提出了另一点 - 如果 SC1 将“someProperty”声明为静态,那么这也可以。

【讨论】:

  • 所以他可以做这样的事情:C1 c1 = new C1(); c1.SC1 sc1 = new SC1(); sc1.something = 1;?
  • 假设SC1内部类有一个“something”成员变量,并且所有的东西都被声明为public,那么就确定了。
【解决方案2】:

因为您创建了一个类,但没有为该类创建一个属性。

试试

public class C1
{
  public class SC1 {}
  public class SC2 {}

  public SC1 sc1;

  public C1() {};
}

C1 c1 = new C1();
c1.sc1.SomeProperty = 1234'

【讨论】:

    【解决方案3】:

    【讨论】:

      【解决方案4】:

      C1C1.SC1C1.SC2 是独立的类。对于C1.SC1C1.SC2,外部C1 类充当了一种奇怪的命名空间。

      您仍然需要创建C1.SC1 (new C1.SC1().someProperty = 1234) 的实例才能访问其上的非静态成员。

      (但是,内部类的一个特性是能够访问外部类实例上的私有成员。内部类和外部类仍然是独立的——只是在内部类的范围内,private开始表现得像public。)

      【讨论】:

      • 除非属性是static,否则你不需要实例类
      • 是的,但这适用于所有static 成员,而不仅仅是处于内部/外部类情况的成员。
      • 正确。我只是在评论您“需要”一个实例的事实,而实际上您不需要。这在架构上是否可行取决于您的课程设计。
      【解决方案5】:

      Tutorial on Nested Classes in C#

      应该是这样的:

      class Demo
      {
          public static void Main()
          {
              System.Console.WriteLine(OuterClass.NestedClass.x);     
          }
      }
      
      class OuterClass
      {
          public class NestedClass
          {
              public static int x = 100;
          }
      }
      

      实例类不需要 访问静态变量。规则 适用于独立类 静态变量的情况也适用于 嵌套类。对于嵌套类, 嵌套的完全限定名称 必须使用类来访问 如上所示的静态变量 程序。

      应用到您的示例以使用 someProperty

      编辑:我还注意到 C1 的构造函数定义是错误的。您不能在类内的构造函数上定义类,否则您将收到如下错误:

      'C1': member names cannot be the same as their enclosing type
      

      【讨论】:

      • Dont Outerclass 和 NestedClass 都需要静态才能执行 System.Console.WriteLine(OuterClass.NestedClass.x); ?
      • !OAOD - 感谢您的澄清!!肯定不知道那个!!这对我来说是个问题!
      • @In Sane:在我看来,您听起来像是来自 Java。在 C# 中,嵌套类是 Java 中的静态嵌套类。
      猜你喜欢
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 2020-06-13
      • 1970-01-01
      • 1970-01-01
      • 2017-05-03
      • 1970-01-01
      • 2020-06-01
      相关资源
      最近更新 更多