在Java中,如果嵌套类未声明为静态,则无法在静态上下文中访问它。这意味着只能通过外部类的实例来创建内部类的实例。例如:
class Prac{
class Inner{}
public static void main(){
Inner myObj = new Prac().new Inner();
}
}
对于我经过Java调整的大脑来说,这是有道理的。如果内部类不是静态的,则需要从中实例化外部类的实例。然而,在c#中,我可以将Inner非静态地声明为嵌套类,并从Main方法中的静态上下文直接实例化它。
我读到c#嵌套类类似于c++而不是java,但我不熟悉内部类如何以任何其他方式工作。c#中嵌套类的基本机制是什么?
请考虑Microsoft强烈建议避免使用公共嵌套类。嵌套类的核心思想是向所有人完全隐藏抽象的实现细节。考虑一下这个例子:
IUserService
public interface IUserService
{
IEnumerable<string> GetAllUsernames();
}
MockUserServiceProvider
public static class MockUserServiceProvider
{
// Public
public static IUserService New() => new MockUserService();
// Nested Private class
private class MockUserService : IUserService
{
public IEnumerable<string> GetAllUsernames()
{
yield return "Bob";
yield return "Mary";
}
}
}
Mock提供程序的目标是向公众提供Mock接口的实例,将提供程序绑定到特定的类类型是没有意义的,事实上,理论上,该类型根本不应该存在。因此,最好的方法是用一个私有嵌套类完全隐藏类定义,这样就没有人可以访问它