这是一段代码:
private class myClass
{
public static void Main()
{
}
}
'or'
private class myClass
{
public void method()
{
}
}
我知道,第一个不行。第二个会。
但为什么首先不工作?有什么具体原因吗?
实际上从这个角度寻找解决方案,这就是为什么让它变得大胆。遗憾
答案 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
}
无论SomePrivateClass
是static
还是包含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选项。