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 定义,这样就没有人可以访问它。
在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 定义,这样就没有人可以访问它。