`
cjc
  • 浏览: 659943 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

c#的细节(二)-修饰符

阅读更多
<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>

写在最前面的话:

《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


protected

internal

private


protected

internal


interface

public

struct

private

public

internal

private

本文首发地址:http://www.watch-life.net/csharp/csharp-detail-modifiers.html

更多文章见:守望轩[http://www.watch-life.net]

分享到:
评论

相关推荐

    深入分析c# 封装和访问修饰符

    C# 支持的访问修饰符如下所示: public:所有对象都可以访问; private:对象本身在对象内部可以访问; protected:只有该类对象及其子类对象可以访问 internal:同一个程序集的对象可以访问; pro

    C#与.NET3.5高级程序设计(第4版) 中文1

    5.6 C#访问修饰符 127 5.7 第一个支柱:C#的封装支持 129 5.8 常量数据 136 5.9 只读字段 137 5.10 C#的分部类型 138 5.11 通过XML生成C#源代码的文档 139 5.12 查看劳动成果 143 5.13 小结 144 第6...

    ASP.NET编程之道.part1.rar

    细节18 理解静态修饰符 细节19 .Net的object类 细节20 细说可空类型 细节21 分部类 细节22 匿名方法 细节23 .Net框架提供的属性(Attribute) 细节24 自定义属性类(Attribute) 细节25 泛型 细节26 包含/委托 细节27 ...

    C#单例模式(Singleton Pattern)详解

    因为系统会默认一个无参构造函数,而且默认public访问修饰符。 所以必须写一个私有无参让默认无效。(通常单例模式都是不带形参的)  2)在该类中声明一个自己本身的静态实例,然后通过静态方法返回。 Q:如何提供一...

    C++中const的实现细节介绍(C,C#同理)

     常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。(当然,我们可以偷梁换柱进行更新:)  2、为什么引入const? const 推出的初始目的,正是为了取代预编译指令,消除它的缺点...

    亮剑.NET深入体验与实战精要.part4(完)

     2.7 参数修饰符params、out和ref的区别  2.8 值类型和引用类型的区别 . 2.9 结构与类的区别  2.10 dispose()和close()、finalize()的区别  2.11 string和stringbuilder有什么区别  2.12 debug版本和...

    亮剑.NET深入体验与实战精要.part3

     2.7 参数修饰符params、out和ref的区别  2.8 值类型和引用类型的区别 . 2.9 结构与类的区别  2.10 dispose()和close()、finalize()的区别  2.11 string和stringbuilder有什么区别  2.12 debug版本和...

    亮剑.NET:.NET深入体验与实战精要清晰版及源码

     2.7 参数修饰符params、out和ref的区别  2.8 值类型和引用类型的区别 . 2.9 结构与类的区别  2.10 dispose()和close()、finalize()的区别  2.11 string和stringbuilder有什么区别  2.12 debug版本和...

    PHRP:将X!Tandem结果文件(XML格式),MS-GF + .tsv结果文件或SEQUEST提要文件(或第一个匹配文件)转换为一系列制表符分隔的文本文件,以汇总结果

    将创建包含序列信息,修饰细节和蛋白质信息的并行文件。 用户可以选择提供一个修改定义文件,该文件指定要用于每个修改质量的符号。示例数据输入和输出文件示例位于Data目录中: MSGFPlus_Example具有MS-GF +结果...

    亮剑.NET深入体验与实战精要2

    2.7 参数修饰符params、out和ref的区别 96 2.8 值类型和引用类型的区别 100 2.9 结构与类的区别 103 2.10 Dispose()和Close()、Finalize()的 区别 106 2.11 string和StringBuilder有什么区别 106 2.12 Debug版本和...

    亮剑.NET深入体验与实战精要3

    2.7 参数修饰符params、out和ref的区别 96 2.8 值类型和引用类型的区别 100 2.9 结构与类的区别 103 2.10 Dispose()和Close()、Finalize()的 区别 106 2.11 string和StringBuilder有什么区别 106 2.12 Debug版本和...

Global site tag (gtag.js) - Google Analytics