细节:
(1)可以在命名空间中直接定义的类的访问修饰符只能是internal,public
(2)结构成员(包括嵌套class,struct)只能声明为 public,private,internal(struct不能继承, 所以没有protected)
实例代码:
建立两个项目分别为consoleApplication2 ,consoleApplication3
consoleApplication2中有以下以下文件
Class1.cs, Class2.cs, Class3.cs, namespaceTest.cs, Program.cs
//Class1.cs
namespace ConsoleApplication2 { class Class1 { private class Test1 { public int a = 1; } protected class Test2 { public int b = 2; } public class Test3 { int c = 3; } protected internal class Test4 { int d = 4; } internal class Test5 { int e = 5; } int aa = 1; private int bb = 2; protected int cc = 3; public int dd = 4; internal int ee = 5; protected internal int ff = 6; } }//Class2.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication2 { internal class Class2 { public void print() { Class1 cs = new Class1(); //Console.WriteLine("same assemble use Class2 to test Class1‘s default field :{0}",cs.aa); //error,default field //Console.WriteLine("same assemble use Class2 to test Class1‘s private field :{0}",cs.bb); //error,private field //Console.WriteLine("same assemble use Class2 to test Class1‘s protected field :{0}",cs.cc); //error,proteced filed Console.WriteLine("same assemble use Class2 to test Class1‘s public field :{0}",cs.dd); //OK, public field Console.WriteLine("same assemble use Class2 to test Class1‘s internal field :{0}", cs.ee); //OK, internal field Console.WriteLine("same assemble use Class2 to test Class1‘s protected internal field :{0}", cs.ff); //OK, protected internal field } public void printClass() { Class1 cs = new Class1(); //Class1.Test1 t1 = new Class1.Test1(); //error, private class //Class1.Test2 t2 = new Class1.Test2(); //error, protected class Class1.Test3 t3 = new Class1.Test3(); //OK, public class Class1.Test4 t4 = new Class1.Test4(); //OK, protected inner class Class1.Test5 t5 = new Class1.Test5(); //OK, inner class } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication2 { public class Class3 { public int x = 11; protected int y = 22; protected internal int z = 33; private class Test1 { public int a = 1; } protected class Test2 { public int b = 2; } public class Test3 { int c = 3; } protected internal class Test4 { int d = 4; } internal class Test5 { int e = 5; } } }//namespaceTest.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using ConsoleApplication2; namespace namespaceTest { class Test { public void printClass() { Console.WriteLine("this is in consoleApplication namespaceTest "); Class1 cs = new Class1(); //Class1.Test1 t1 = new Class1.Test1(); //error, private class //Class1.Test2 t2 = new Class1.Test2(); //error, protected class Class1.Test3 t3 = new Class1.Test3(); //OK, public class Class1.Test4 t4 = new Class1.Test4(); //OK, protected inner class Class1.Test5 t5 = new Class1.Test5(); //OK, inner class } public void print() { Console.WriteLine("this is in consoleApplication namespaceTest "); Class1 cs = new Class1(); //Console.WriteLine("same assemble use Class2 to test Class1‘s default field :{0}",cs.aa); //error,default field //Console.WriteLine("same assemble use Class2 to test Class1‘s private field :{0}",cs.bb); //error,private field //Console.WriteLine("same assemble use Class2 to test Class1‘s protected field :{0}",cs.cc); //error,proteced filed Console.WriteLine("same assemble use Class2 to test Class1‘s public field :{0}", cs.dd); //OK, public field Console.WriteLine("same assemble use Class2 to test Class1‘s internal field :{0}", cs.ee); //OK, internal field Console.WriteLine("same assemble use Class2 to test Class1‘s protected internal field :{0}", cs.ff); //OK, protected internal field } } }
//Program.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { Console.WriteLine("this is in consoelApplication2"); Class2 C2 = new Class2(); C2.print(); C2.printClass(); namespaceTest.Test CTest = new namespaceTest.Test(); CTest.print(); } } }ConsoleApplication3中的文件
Class4.cs, Program.cs
//Class4.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using ConsoleApplication2; namespace ConsoleApplication3 { //C# has no public,private ,protected to modify class in deriving class Class4: Class3 { int xx; int yy; int zz; public void print() { xx = x; yy = y; zz = z; Console.WriteLine("out class derived from public class public filed is:{0}",xx); Console.WriteLine("out class derived from public class protected field is:{0}",yy); Console.WriteLine("out class derived from public class protected internal fiels is:{0}",zz); } }; }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using ConsoleApplication2; namespace ConsoleApplication3 { class Program { static void Main(string[] args) { Console.WriteLine("This is in consoleApplication3"); printClass(); print(); Class4 inTest4 = new Class4(); inTest4.print(); } static void print() { Class3 outTst = new Class3(); Console.WriteLine("outer class use public class to test public filed {0}", outTst.x); //Console.WriteLine("outer class use public class to test protected filed {0}",outTst.y); //error,protected field //Console.WriteLine("outer class use public class to test protected internal filed {0}", outTst.z); //error protected internal field } static void printClass() { //Class1 outTest1 = new Class1(); //error, this is inner class //Class2 outTest2 = new Class2(); //error, this is inner clss Class3 outTest3 = new Class3(); //OK, this is public class } } }
原文:http://blog.csdn.net/ddupd/article/details/21642915