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

How are Nested classes different between C# and Java

在Java中,如果一个嵌套的class没有被声明为静态的,它就不能在静态上下文中被访问。这意味着内部 class 的实例只能通过外部 class 的实例创建。例如:

class Prac{
  class Inner{} 
  public static void main(){
    Inner myObj = new Prac().new Inner();
  }   
}

对于我 Java 调整后的大脑来说,这是有道理的。如果内部 class 不是静态的,则需要实例化外部 class 的实例。然而,在 C# 中,我可以将 Inner 非静态地声明为嵌套 class 并直接从 Main 方法中的静态上下文实例化它。

我读到 c# 嵌套 classes 类似于 c++ 而不是 java,但我不熟悉内部 classes 以任何其他方式工作。 c# 中嵌套 classes 的底层机制是什么?

考虑到 Microsoft 强烈建议 avoid public nested classes。 嵌套 class 的核心思想是对每个人完全隐藏一个抽象的实现细节。考虑这个例子:

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 提供者的目标是为 public 提供 Mock 接口的一个实例,将提供者绑定到特定的 class 类型没有意义,确实,理论上,那种类型根本不应该存在。因此,最好的办法(不使用一些 I.L。例如,Moq 所做的魔法)是用私有嵌套 class 完全隐藏 class 定义,这样就没有人可以访问它。