C#的访问修饰符
C# 的访问修饰符
首先介绍一下类的修饰符。作为一个顶级类(即不是内部类)只能使用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;