C#和Java之间的嵌套类有何不同



在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接口的实例,将提供程序绑定到特定的类类型是没有意义的,事实上,理论上,该类型根本不应该存在。因此,最好的方法是用一个私有嵌套类完全隐藏类定义,这样就没有人可以访问它