日期:2014-05-16  浏览次数:20981 次

C#之访问修饰
<1>访问修饰符
internal:声明为内部类,只有当前项目中代码能够访问(默认的时候也是internal)
public:  公共类,其他项目中的代码可以访问
protected:只有同一类或者结构或者此类的派生类代码才能访问
private:  只有同一个类或者结构的代码可以访问该类型成员
protected internal:


细节:

(1)可以在命名空间中直接定义的类的访问修饰符只能是internal,public

(2)结构成员(包括嵌套class,struct)只能声明为 public,private,internal(struct不能继承,  所以没有protected)  
(3)类成员(包括嵌套class,struct)可以声明为public,private,protected,internal,protected  internal 。类成员,包括嵌套类和结构默认为private。私有的嵌套类 不能被它的外围访问。
(4)继承的类不能比基类具有更高的访问级别
(5)关于protected internal,这个比较奇特,在同一个项目中(可以是不同命名空间),这个时候  protected internal 修饰的字段,内部类都可以被同一个项目中的其他代码 访问,这个时候失去了protected的作用了,只有internal起用。
当在另外一个项目中,这个时候就不能访问protected internal修饰的字段了,似乎是 protected和 internal同时起作用,但是在此时构造一个继承原来项目的类,那么在继承 类中可以访问protected internal 修饰的东西,这个时候似乎只有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 c