首页 > 其他 > 详细

C#之访问修饰

时间:2014-03-21 01:16:41      阅读:403      评论:0      收藏:0      [点我收藏+]
<1>访问修饰符
internal:声明为内部类,只有当前项目中代码能够访问(默认的时候也是internal)
public:  公共类,其他项目中的代码可以访问
protected:只有同一类或者结构或者此类的派生类代码才能访问
private:  只有同一个类或者结构的代码可以访问该类型成员
protected internal:


细节:

(1)可以在命名空间中直接定义的类的访问修饰符只能是internal,public

(2)结构成员(包括嵌套class,struct)只能声明为 public,private,internal(struct不能继承,  所以没有protected)  
(3)类成员(包括嵌套class,struct)可以声明为public,private,protected,internal,protected  internal 。类成员,包括嵌套类和结构默认为private。私有的嵌套类 不能被它的外围访问。
(4)继承的类不能比基类具有更高的访问级别
(5)关于protected internal,这个比较奇特,在同一个项目中(可以是不同命名空间),这个时候  protected internal 修饰的字段,内部类都可以被同一个项目中的其他代码 访问,这个时候失去了protected的作用了,只有internal起用。
当在另外一个项目中,这个时候就不能访问protected internal修饰的字段了,似乎是 protected和 internal同时起作用,但是在此时构造一个继承原来项目的类,那么在继承 类中可以访问protected internal 修饰的东西,这个时候似乎只有protected起作用了。


实例代码:

建立两个项目分别为consoleApplication2 ,consoleApplication3

consoleApplication2中有以下以下文件

 Class1.cs, Class2.cs, Class3.cs, namespaceTest.cs, Program.cs

//Class1.cs

namespace ConsoleApplication2
{
    class Class1
    {
        private class Test1
        {
            public int a = 1;
        }

        protected class Test2
        {
            public int b = 2;
        }

        public class Test3
        {
            int c = 3;
        }

        protected internal class Test4
        {
            int d = 4;
        }

        internal class Test5
        {
            int e = 5;
        }

        int aa = 1;
        private int bb = 2;
        protected int cc = 3;
        public int dd = 4;
        internal int ee = 5;
        protected internal int ff = 6;
    }
}
//Class2.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    internal class Class2
    {
        
        public void print()
        {
            Class1 cs = new Class1();
            //Console.WriteLine("same assemble use Class2 to test Class1‘s default field :{0}",cs.aa);   //error,default field
            //Console.WriteLine("same assemble use Class2 to test Class1‘s private field :{0}",cs.bb);   //error,private field
            //Console.WriteLine("same assemble use Class2 to test Class1‘s protected field :{0}",cs.cc); //error,proteced filed
            Console.WriteLine("same assemble use Class2 to test Class1‘s public field :{0}",cs.dd);      //OK,   public field
            Console.WriteLine("same assemble use Class2 to test Class1‘s internal field :{0}", cs.ee);   //OK,   internal field
            Console.WriteLine("same assemble use Class2 to test Class1‘s protected internal field  :{0}", cs.ff); //OK,   protected internal field
        }

        public void printClass()
        {
            Class1 cs = new Class1();
            //Class1.Test1 t1 = new Class1.Test1();     //error,    private  class
            //Class1.Test2 t2 = new Class1.Test2();     //error,    protected class
            Class1.Test3 t3 = new Class1.Test3();       //OK,       public class
            Class1.Test4 t4 = new Class1.Test4();       //OK,       protected inner class
            Class1.Test5 t5 = new Class1.Test5();       //OK,       inner class
        }
    }
}

//Class3.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    public class Class3
    {
        public int x = 11;
        protected int y = 22;
        protected internal int z = 33;

        private class Test1
        {
            public int a = 1;
        }

        protected class Test2
        {
            public int b = 2;
        }

        public class Test3
        {
            int c = 3;
        }

        protected internal class Test4
        {
            int d = 4;
        }

        internal class Test5
        {
            int e = 5;
        }
    }
}
//namespaceTest.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ConsoleApplication2;

namespace namespaceTest
{
    class Test
    {
        public void printClass()
        {
            Console.WriteLine("this is in consoleApplication namespaceTest ");
             Class1 cs = new Class1();
            //Class1.Test1 t1 = new Class1.Test1();     //error,    private  class
            //Class1.Test2 t2 = new Class1.Test2();     //error,    protected class
            Class1.Test3 t3 = new Class1.Test3();       //OK,       public class
            Class1.Test4 t4 = new Class1.Test4();       //OK,       protected inner class
            Class1.Test5 t5 = new Class1.Test5();       //OK,       inner class
        }

        public void print()
        {
            Console.WriteLine("this is in consoleApplication namespaceTest ");
            Class1 cs = new Class1();
            //Console.WriteLine("same assemble use Class2 to test Class1‘s default field :{0}",cs.aa);   //error,default field
            //Console.WriteLine("same assemble use Class2 to test Class1‘s private field :{0}",cs.bb);   //error,private field
            //Console.WriteLine("same assemble use Class2 to test Class1‘s protected field :{0}",cs.cc); //error,proteced filed
            Console.WriteLine("same assemble use Class2 to test Class1‘s public field :{0}", cs.dd);      //OK,   public field
            Console.WriteLine("same assemble use Class2 to test Class1‘s internal field :{0}", cs.ee);   //OK,   internal field
            Console.WriteLine("same assemble use Class2 to test Class1‘s protected internal field  :{0}", cs.ff); //OK,   protected internal field
        }
    }
}

//Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("this is in consoelApplication2");
            Class2 C2 = new Class2();
            C2.print();
            C2.printClass();
            namespaceTest.Test CTest = new namespaceTest.Test();
            CTest.print();
        }
    }
}
ConsoleApplication3中的文件

Class4.cs, Program.cs

//Class4.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ConsoleApplication2;

namespace ConsoleApplication3
{
    //C# has no public,private ,protected to modify class in deriving
    class Class4: Class3
    {
        int xx;
        int yy;
        int zz;

        public void print()
        {
            xx = x;
            yy = y;
            zz = z;
            Console.WriteLine("out class derived from public class public filed is:{0}",xx);
            Console.WriteLine("out class derived from public class protected field is:{0}",yy);
            Console.WriteLine("out class derived from public class protected internal fiels is:{0}",zz);
        }
    };
}

//Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ConsoleApplication2;
namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("This is in consoleApplication3");
            printClass();
            print();
           
            Class4 inTest4 = new Class4();
            inTest4.print();
        }

        static void print()
        {
            Class3 outTst = new Class3();
            Console.WriteLine("outer class use public class to test public filed {0}", outTst.x);
            //Console.WriteLine("outer class use public class to test protected filed {0}",outTst.y);           //error,protected field
            //Console.WriteLine("outer class use public class to test protected internal filed {0}", outTst.z); //error protected internal field
        }
        static void printClass()
        {
            //Class1 outTest1 = new Class1();       //error,    this is inner class
            //Class2 outTest2 = new Class2();       //error,    this is inner clss
            Class3 outTest3 = new Class3();         //OK,       this is public class
        }
    }
}









C#之访问修饰,布布扣,bubuko.com

C#之访问修饰

原文:http://blog.csdn.net/ddupd/article/details/21642915

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!