C#中公共嵌套类和私有嵌套类之间的区别是什么

nin*_*der 0 c# inner-classes

在C#中,公共嵌套类和私有嵌套类之间有什么区别?你什么时候用另一个经文?

据我所知,他们在类的视图中具有相同的可访问性,它们嵌套在任何外部类中.

void Main()
{
    Item i = new Item();
    i.DoSomething();

    GizmoBuilder gb = new GizmoBuilder();//class not accessible
    WidgetBuilder wb = new WidgetBuilder();//class not accessible
}

public class Item
{
    public int Id { get; set; }

    private string ItemName { get; set;}

    public void DoSomething()
    {
        GizmoBuilder g = new GizmoBuilder();
        g.BuildGizmo();
        Console.WriteLine(g.BuildId);
        Console.WriteLine(g.Name);//g.Name not accessible

        WidgetBuilder w = new WidgetBuilder();
        w.BuildWidget();
        Console.WriteLine(w.BuildId);
        Console.WriteLine(w.Name);//g.Name not accessible
    }

    public class GizmoBuilder
    {
        public int BuildId { get; set; }

        private string Name { get; set;}

        public void BuildGizmo()
        {           
            Builder b = new Builder();
            b.Build();

            Console.WriteLine("Building Gizmo");
        }
    }

    private class WidgetBuilder
    {
        public int BuildId { get; set; }

        private string Name { get; set;}

        public void BuildWidget()
        {
            Builder b = new Builder();
            b.Build();

            Console.WriteLine("Building Widget");
        }
    }

    private class Builder
    {
        public void Build()
        {
            Console.WriteLine("Building");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Cod*_*ter 6

一个简化的例子:

public class Foo
{
    public class Bar { }

    private class Baz { }
}
Run Code Online (Sandbox Code Playgroud)

使用它们:

var bar = new Bar();
var nestedBar = new Foo.Bar();
var nestedBaz = new Foo.Baz();
Run Code Online (Sandbox Code Playgroud)

GizmoBuilder gb = new GizmoBuilder()你宣称"类[是]无法访问",但这是不正确.属于上述三行第一行的实际编译器错误是:

CS0246:找不到类型或命名空间名称"Bar".你错过了装配参考吗?

那是因为你必须在包含类的名称前加上前缀,如第二行所示.这是有效的,因为Foo.Bar是公开的.

访问私有嵌套类的第三行显示:

CS0122:由于其保护级别,"Foo.Baz"无法访问

所以这是你的不同之处.你只能Foo.Baz从里面使用后者()Foo.