10

这是一段代码:

private class myClass
{
   public static void Main()
   {

   }
}

        'or'

private class myClass
{
   public void method()
   {

   }
}

我知道,第一个行不通。第二个会。

但为什么首先不起作用?有什么具体原因吗?

实际上从这个角度寻找解决方案,这就是为什么它变得大胆。对不起

4

4 回答 4

15

在这种情况下会很有意义;你有一个公共类SomeClass,你想在里面封装一些只相关的功能SomeClass。您可以通过在 中声明一个私有类(SomePrivateClass在我的示例中)来做到这一点SomeClass,如下所示。

public class SomeClass
{
    private class SomePrivateClass
    {
        public void DoSomething()
        {

        }
    }

    // Only SomeClass has access to SomePrivateClass,
    // and can access its public methods, properties etc
}

无论SomePrivateClassisstatic或 containspublic static方法,这都是正确的。

我将其称为嵌套类,并在另一个StackOverflow 线程中进行了探索。

于 2011-10-15T10:42:53.500 回答
3

Richard Ev 给出了一个在嵌套类中访问的用例。嵌套类的另一个用例是公共接口的私有实现:

public class MySpecialCollection<T> : IEnumerable<T>
{ 
    public IEnumerator<T> GetEnumerator()
    {
        return new MySpecialEnumerator(...);
    }

    private class MySpecialEnumerator : IEnumerator<T>
    {
        public bool MoveNext() { ... }
        public T Current
        { 
            get { return ...; }
        }
        // etc...
    } 
}

这允许人们提供公共接口或基类的私有(或受保护或内部)实现。消费者不需要知道也不需要关心具体的实现。这也可以在没有嵌套类的情况下通过将MySpecialEnumerator类设置为内部来完成,因为您不能拥有非嵌套的私有类。

BCL 广泛使用非公共实现。例如,LINQ 运算符返回的对象是实现IEnumerable<T>.

于 2011-10-15T10:50:33.187 回答
1

这段代码在语法上是正确的。但最大的问题是:它是否有用,或者至少在您想要使用它的上下文中可用?可能不是,因为该Main方法必须在一个public类中。

于 2011-10-15T10:38:37.183 回答
0

Main()方法是应用程序执行开始的地方,所以你不能编译你的第一个类(用public static void Main())是因为你已经Main在应用程序的其他地方有了方法。编译器不知道从哪里开始执行您的应用程序。

您的应用程序必须只有一种Main方法可以使用默认行为进行编译,否则您需要在编译时添加/main选项。

于 2011-10-15T11:05:26.370 回答