赵健ID:jonnie4455
4337次访问,排名19151(-23)好友2人,关注者3
成功不是追求得来的,而是被改变后的自己主动吸引而来的
jonnie4455的文章
原创 25 篇
翻译 0 篇
转载 11 篇
评论 22 篇
jonnie4455的公告
694395908

最近评论
mohroq:wow gold,
mohroq:wow gold,
paradisedai:3q......
jasitine:说得太好了!以此激励人生!
jasitine:写得太摆了!!我也来顶哈子!分析得太透彻了!跟陈先奎有一拼!!
文章分类
收藏
    相册
    南京北大青鸟
    南京北大青鸟
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    转载 关于C#访问修改符的理解+总结收藏

    新一篇: C#中FileStream.Read方法的buffer大小不一样读取结果不一样的解决方法 | 旧一篇: Java中的Session和作用域

    今天想整理一下访问修饰符,当然对老鸟来说不用介绍了,但是我相信对新人来说一定有必要说一下, 所以在网上查了一下,没有一个完整的介绍,除了概念就是概念,老鸟看了那些文字都要头疼, 所以决定今天整理出来用例子说明来为大家解释一下吧: 首先介绍一下类的修饰符 作为一个顶级类(即不是内部类)只能使用public和internal两种访问修饰符,它们的意义如下。 — public:所修饰的顶级类的可访问域是它所在的程序和任何引用该程序的程序,因此访问不受限制。 — internal:所修饰的顶级类的可访问域是定义它的程序。 public不必介绍哪都可以new一下,但是internal必须在自己的项目内使用, 这里有必要向大家介绍项目和程序集,简单点项目包括:控制台应用程序,Windows应用程序,类库(Class Library)等,而程序集叫Assembly(也就是我们创建项目中的AssemblyInfo.cs文件), 一个项目也就是一个程序集,Assembly用处很大,但与我们的专题无关,不做介绍。 介绍上面的目的为了说明,一个项目的internal无法在另一个项目中调用,代码: class1:

    using System; using System.Collections.Generic; using System.Text; namespace xiaolei {     //public class Class1     //{         //public int aa;     //}     internal class Class1     {         public int aa;     }     class Class11     {         public void bb()         {             Class1 cc = new Class1();         }          } }

    class2:

    using System; using System.Collections.Generic; using System.Text; namespace fanxing {     class Application1     {       static void Main(string[] args)         {             xiaolei.Class1 aaa = new xiaolei.Class1();             System.Console.Read();         }    }  }

    上面我建立了两个项目,一个是类库,一个是控制台, 上面我在控制台class2引入了类库class1,这些操作简略,大家可以看到我上面的class1用了public, 所以在class2成功的得到,大家把把class1修改为internal class1,就可以看到效果了,在class2中无法引出, 但是在class11中可以得到。 很简单,接下来我们介绍方法或者属性的修饰符: 概念性的东西拿来用下:

    访问修饰符
       
    public
    访问不受限制,可以类内和任何类外的代码中访问
    protected
    可访问域限定于类内或从该类派生的类内
    internal
    可访问域限定于类所在的程序内
    protected internal
    protected或者internal,即可访问域限定于类所在的程序或那些由它所属的类派生的类内
    private
    可访问域限定于它所属的类内
    现在做解释首先,public不做介绍, 接下来是protected, protected就只能被子类内部所访问(不管这个子类在哪个项目里) 如果在同一程序集里面,不是子类的话,仅仅实例化该类,其中的protected所修饰的成员就不能被访问

    using System; using System.Collections.Generic; using System.Text; namespace aaa {     public  class Class2     {         protected int bb;         public int cc;     }     public class class22             protected void  bbb()         {             Class2 bbbb=new Class2();             //只能得到bbbb.cc         }     }     public class class33:Class2     {         public void bbb()         {             //可得到base.bb,base.cc         }     } }

    这是在一个项目中,如果再加一个项目

    using System; using System.Collections.Generic; using System.Text; namespace fanxing {     class Application1:aaa.Class2     {       public void  aaa()         {             //base.bb; base.cc;         }       static void Main(string[] args)         {            aaa.Class2 bbb = new aaa.Class2();           //bbb.cc;             System.Console.Read();         }    }  }

    一样的道理! private也很简单,只能在定义的类内部使用,别处不管是派生类等都不能使用。 internal和我们解释的类的修饰符一样,只能在一个项目中使用(不管是实例化还是派生均可见),在别的项目中看不到

    using System; using System.Collections.Generic; using System.Text; namespace aaa {     public  class Class2     {         internal int bb;         public int cc;     }     public class class22             internal void  bbb()         {             Class2 bbbb=new Class2();             //bbbb.bb;bbbb.cc;         }     }     public class class33:Class2     {         public void bbb()         {             //base.bb;base.cc;         }     } }

    在一个项目中,大家可以看都均可见,

    using System; using System.Collections.Generic; using System.Text; namespace fanxing {     class Application1:aaa.Class2     {       public void  aaa()         {             //base.cc;         }    }     class bbb     {           public void  ccc()         {             aaa.Class2 ddd = new aaa.Class2();              //ddd.cc;         }          }  }

    在另一个项目中我们可以看到只能看到public的属性,internal不见了。 最后我们讲protected internal,看了大家也应该明白 protected internal是protected和interval的集合体, 确切的说应该是一个并集, 意义就是它能被类的子类所访问并且(不管这个子类在哪个程序集里)即protected的实现部分 并且能被同一个程序集的类所访问即internal的实现部分

    using System; using System.Collections.Generic; using System.Text; namespace aaa {     public  class Class2     {        internal  protected int  aa;         internal int bb;         protected int cc;     }     public class class22             public void  bbb()         {             Class2 bbbb=new Class2();             //bbbb.aa;bbbb.bb         }     }     public class class33:Class2     {         public void bbb()         {             //base.aa; base.bb; base.cc;         }     } }

    在一个项目中我们的可见

    using System; using System.Collections.Generic; using System.Text; namespace fanxing {     class Application1:aaa.Class2     {       public void  aaa()         {             //base.aa;base.cc         }    }     class bbb     {           public void  ccc()         {             aaa.Class2 ddd = new aaa.Class2();             //ddd.         }          }  }

    在另一个项目中引用我们看到的效果,我想这样一对比大家已经有了很清楚的认识了吧。

    下面是一张图是对上述的总结

    访问控制修饰符
    修饰符 类内部 子类 程序集内  程序集外
    public
    protected internal ×
    internal ×
    pretected × ×
    private × × ×
    default × × ×
    sealed × × × ×
    partial 在不同文件中声明同一个类   

    好了到此为止。  

    发表于 @ 2008年06月23日 07:16:18|评论(loading...)|编辑|收藏

    新一篇: C#中FileStream.Read方法的buffer大小不一样读取结果不一样的解决方法 | 旧一篇: Java中的Session和作用域

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © jonnie4455