细节:
(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