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

写在最前面的话:

《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

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

你可能也会喜欢以下文章:

发表评论

电子邮件地址不会被公开。 必填项已用*标注