使用Public方法的私有类?

时间:2011-10-15 10:35:45

标签: c# class access-modifiers public-method

这是一段代码:

private class myClass
{
   public static void Main()
   {

   }
}

        'or'

private class myClass
{
   public void method()
   {

   }
}

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

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

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

4 个答案:

答案 0 :(得分:12)

在这种情况下,这将是有意义的;您有一个公共类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
}

无论SomePrivateClassstatic还是包含public static方法,都是如此。

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

答案 1 :(得分: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>的非公共类。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

Main()方法是应用程序执行开始的地方,因此您无法编译第一个类(使用public static void Main())的原因是因为您已在应用程序的其他位置使用Main方法。编译器不知道从哪里开始执行您的应用程序。

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