2017-06-01 114 views
0

在C#中,公共嵌套类和私有嵌套类之间有什么区别?你什么时候用一节经文呢?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"); 
     } 
    } 
} 
+1

如果你说的*正确*错误消息,这个问题会很明显。正如你声称的那样,错误并不是告诉你这个类型是不可访问的;它告诉你,类型*根本不存在*。如果问题只是它无法访问,它会*告诉你该类型不可访问*。 – Servy

回答

6

一个简单的例子:

public class Foo 
{ 
    public class Bar { } 

    private class Baz { } 
} 

使用它们:

var bar = new Bar(); 
var nestedBar = new Foo.Bar(); 
var nestedBaz = new Foo.Baz(); 

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

CS0246:无法找到类型或名称空间名称“Bar”。您是否缺少装配参考?

这是因为您必须在包含类的名称前加上前缀,如第二行所示。这只是起作用,因为Foo.Bar是公开的。

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

CS0122:'Foo.Baz”不可访问由于其保护级别

因此,有你的区别是。您只能使用Foo中的后者(Foo.Baz)。

+1

我对嵌套类的遗忘似乎是问题的答案。我并不知道你必须在类的前面加上类,以便能够“看见”它。 –

1

这不会编译。这是不同的。

public class C { 
    private class D { } 

    // Nobody outside C can know about D, so this is forbidden. 
    public D Property { get; set; } 

    // But this is OK, because object is public. 
    private D _d = new D(); 
    public Object Property2 => _d; 
} 

将私有类的实例传递给Console.WriteLine()与访问无关;它看到对object(公众)的参考并且对其调用ToString()(公共)。

3

据我可以告诉他们有相同的可访问性从他们嵌套以及从任何外部类的类的视图。

然而,如果嵌套类是私有的,那么没有外部类可以访问它们。

2

如果嵌套类是公共的,那么你可以在的任何地方实例化它,可以访问封闭类。

如果嵌套类是私有类,则只能从封闭类实例化它。

当您需要封闭类为时只有类可以创建该新类型,这非常有用。例如:

public interface INestedClass 
{ 
    double ComplexCalculation(double input); 
} 

public class Test 
{ 
    public INestedClass GenerateInstance() 
    { 
     return new SubClass(); 
    } 

    private class SubClass : INestedClass 
    { 
     public double ComplexCalculation(double input) 
     { 
      return input*5; 
     } 
    } 
} 

从封闭类的范围之外,你不会是能够做到这一点,因为嵌套类是私有的:

var subClassInstance = new Test.SubClass();