写在最前面的话:
《c#的细节》是我当初学习c#时候,做的一些学习笔记的整理,现在回头看来这些都是非常浅显的知识,是c#非常细节的地方,同时也是不能忽略的地方,”细节决定成败“,也许有些严重。我希望把这些整理出来,可以给初学者一个参考,也给自己一个温故知新的机会。高手就不必花时间来看了。;-)
-----------------------------------------------------------------------------------------------
在c#的中修饰符的概念,最让初学者有些头痛了,理解起来也不是想象中那么简单,关键是不要搞乱了。
c#的修饰符大概分3类:
1、访问型修饰符,就是控制所修饰成员的可访问域,包括:public、private、protected、internal 和protected internal。其中只能protected internal 组合,其他都不能。
public:访问不受限制。
private:访问仅限于包含类型。只有包含该成员的类可以存取.
protected:访问仅限于包含类或从包含类派生的类型。只有包含该成员的类以及继承的类可以存取.
Internal:访问仅限于当前程序集。只有当前项目(工程)可以存取.
protected internal:访问仅限于当前程序集或从包含类派生的类型。
上面的概念好像很绕口。不过在如果你对面向对象大致了解的话,理解这些概念并不难,需要明确两个东东:程序集和项目。这里不详细讨论程序集和项目(如果你想全面了解有关程序集,项目,命名空间等东东,可以去看看这里),你可以大致理解,一个项目可以是一个程序集。
public、private、proteced我觉得非常比较好理解,麻烦点就是Internal,只能在一个项目中使用,不能跨项目调用,只能自己的项目内使用,即使是子类也不能访问。
namespace space1 { internal class Class1 { public int a } class Class2 { public void b() { Class1 cc = new Class1(); } } } namespace space2 { class App { static void Main(string[] args) { space1.Class1 t_xA = new space1.Class1();//error
} } }
以上的代码表明,Internal 是不能跨项目访问的。
对于protected internal 简单些理解,就是protected 和internal 的并集。protected就只能被子类内部所访问,于是它们的并集就是:同一个项目内或者子类内部可以访问。如果既不是同一程序集也不是子类,就无法访问。如下面的代码所示:
namespace space3 { public class Class1 { internal protected int a; internal int b; protected int c; } public class class2 { public void bbb() { Class1 t_x1=new Class1(); t_x1.a //ok t_x1.b //ok t_x1.b //error } } public class class3:Class1 { public void bbb() { base.a...//ok base.b...//ok base.c ...//ok } } } namespace space4 { class Application1:space3.Class1 { public void a() { base.aa... base.cc... } } class bbb { public void ccc() { space3..Class2 d = new space3.Class2(); d.a.. //error d.b...//error d.c... //error } } }
2、类修饰符:
abstract:标识一个类只能作为其它类的基类.
sealed:标识一个类不能被继承.
partial :局部类。将你的 class 分为多个部分,编译器会将多个部分拼合在一起。关于局部类部分你可以看看这里
3、成员修饰符:
abstract:指示该方法或属性没有实现.
const:指定域或局部变量的值不能被改动.
event:声明一个事件.
extern:指示方法在外部实现.
override:对由基类继承成员的新实现.
readonly:指示一个域只能在声明时以及相同类的内部被赋值.
static:指示一个成员属于类型本身,而不是属于特定的对象.
virtual:指示一个方法或存取器的实现可以在继承类中被覆盖.
注意:1、命名空间不能使用访问修饰符。对命名空间没有访问是不受限制的,它的引入是主要是避免相同对象名的冲突。
2、如果在成员声明中未指定访问修饰符,则使用默认的可访问性。
属于 |
默认的成员可访问性 |
该成员允许的声明的可访问性 |
enum |
public |
无 |
class |
private |
public
internal private
|
|
public |
无 |
struct |
private |
public internal private |
本文首发地址:http://www.watch-life.net/csharp/csharp-detail-modifiers.html
更多文章见:守望轩[http://www.watch-life.net]