首先,先简单的介绍一下C# 中的访问修饰符:
public: 代表共有的,该类或成员可以在任何地方访问
internal: 程序集共享,表示在当前程序集内可以访问。
private:私有成员,在类的内部才可以访问。
protected:保护成员,在该类的内部和继承类中可以访问。
下面就详细的说一下各个访问修饰符的区别:
先看下面的图:
这是建立了两个控制台项目,在 “01访问修饰符” 这个项目中添加引用 “02 JustFortest”,在 “02 JustFortest” 中添加了一个 Class1 的类,先将其定义为 public ,那么我们在 “01访问修饰符” 这个项目中就可以实例化 Class1类。
Class1 类:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _02_JustFortest { public class Class1//访问修饰符为 public { } }
实例化结果:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _01访问修饰符 { class Program { static void Main(string[] args) { _02_JustFortest.Class1 cl = new _02_JustFortest.Class1();//可以实例化 02 JustFortest 中的Class1 } } }
public:代表共有的,该类或成员可以在任何地方访问
那么,我们在把 Class1 这个类的修饰符改成 internal ,这也就意味着只有在 ”02 JustFortest“ 这个程序集中才会共享,再来看看 ”01访问修饰符“ 中实例化 “01访问修饰符” 的结果:
出现了红色波浪线,这也就意味着代码出错了。所以,当把类修饰成 internal 的时候,在其他程序集中就无法访问了,只有在本程序集中才会共享。
internal: 程序集共享,表示在当前程序集内可以访问。
再来看看 private 和 protected:
看代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _03_private_和_protected { class Program { static void Main(string[] args) { Test2 te = new Test2(); Console.ReadKey(); } } class Test1 { private string str1 = "Mr";//在父类中定义一个字段 修饰符为 private protected string str2 = "Lucky";//在父类中定义一个字段 修饰符为 protected } class Test2 : Test1 { public Test2() { Console.WriteLine( base.str2 );//在子类中访问父类成员用 base 就可以了。 } } }
得到的结果:
写完代码发现,在子类中,我们只能访问到父类中的 str2 这个字段,而 str1 这个字段在子类中是无法访问到的,所以说,在子类中,子类是可以访问到父类的 受保护成员。
再来看一下,我们实例化的一个 Test2 对象 te:
看图:
当我们用 te 想点出我们定义的 str1 和 str2 字段时,我们发现,是点不出来的。
所以,再强调一下,修饰成 private 后,外界是无法访问到的,而修饰成 protected 之后,只有自己和他的子类才能访问的到。
最后,再说一下,累的成员变量默认访问级别是 private 的,类的默认访问级别是 internal。
在 Test1 中 添加一个字段 str3 ,不添加任何访问修饰符:
反编译的结果:
在内部,自动为 str3 这个字段添加的 private ,而类则自动添加了 internal。
关于C#中常用的访问修饰符,就讲到这里。