C#嵌套类的使用

C#嵌套类的使用

     今天在看公司框架的时候,看到很多地方用到了嵌套类,觉得这方面知识比较欠缺,现找了一篇写的比较详细的文章来补充这方面的知识。

1.基本概念

        嵌套类:在一个类中定义另一个类,分为静态嵌套类(使用少)和非静态嵌套类(又称内部类)。 

        内部类: (1) 在一个类中直接定义类。

                    (2) 在一个方法中定义类。

                    (3) 匿名内部类。

 2. 嵌套类的使用

    (1)外部类只能够访问嵌套类中修饰符为public、internal的字段、方法、属性。示例如下

         public class Animal

    {

        static void Set_Animal()

        {

            //编译正确

            Monkey._high = 123;

            Monkey._age = 4;

            //编译失败

            Monkey._name = "hoho";

        }

        private class Monkey

        {

            private static string _name;

            protected string _sex;

            internal static int _age;

            public static int _high;

            public Monkey() { }

            public void show()

            { }

        }

    } 

 

(2)嵌套类可以访问外部类的方法、属性、字段而不受访问修饰符的限制

       public class Animal

    {

        private static int _Age;

        private string name;

        private static void DoSomething()

        {

            Console.WriteLine(_Age);

         }

        private void DoStr()

        {

            monkey.method(this);

        }

       /*嵌套类 定义*/ 

        class monkey

        {

            public static void method(Animal a)

            {

                _Age = 23;        //静态成员

                a.name = "test"; //实例成员

            }

        }

    } 

 3.  嵌套类访问外部类实例的方法、字段、属性时候。一般在采取构造函数输入外部类

          public class Animal

    {

        private string _name;

        //*嵌套类 定义*/

        class monkey

        {

            public monkey(Animal a)

            {

               a._name = "test";

            }

        }

    } 

 4.继承类可以再定义一个内嵌类并从继承父类中嵌套类

     public class Animal

    {

        //*嵌套类 定义*/

        protected class monkey

        {

            public virtual void Method()

            {

                Console.WriteLine("monkey");

            }

        }

    }

    public class S_Animal : Animal

    {

        class s_monkey :monkey

        {

            public override void Method()

            {

                Console.WriteLine("s_monkey");

            }

        }

     }注:因为S_Animal 继承于Animal ,因此s_monkey可以继承monkey类,从而获取重写父嵌套类的机会。但是monkey必须是可继承类及可访问的(非private 、sealed、static)。

 

      嵌套类可以随意外部类的任何数据属性,而外部类访问嵌套类就只能遵守访问修饰符。从这个角度看,嵌套类是外部类的补充,通过嵌套类可以获取更好的封装性,增加外部类的可维护性和可读性。       

      从程序结构看,嵌套类在逻辑上更加接近使用类。可以更有效地表示类与类之间的紧密程度。为类管理提供除命名空间外的另一种方法。

    5.单例模式(singleton)就采用一种为 延迟加载初始化实例 的方法如下:

 

    public class Animal

    {

        public Animal(){}

        public static Animal Intance

        {

            get { return monkey._intance; }

        }

        class monkey

        {

            public  readonly static Animal _intance = new Animal();

        }

    }注: 延迟加载 嵌套类的静态构造函数不会随着外部类的触发而初始化。因此可以有效地避免创建时候初始化时间,当需要使用内嵌类的时候,嵌套类才开始初始化。 

    6.反射内嵌类需要使用"+"而不是我们常使用的"." 。

     namespace AnimalClass

    {

        public class Animal

        {

            public class monkey

            {

                protected void Method()

                {

                   //do something... 

                }

            }

        }

    } 

        注://成功

            object o1 = System.Activator.CreateInstance("AnimalClass", "AnimalClass.Animal+monkey");

            //失败 抛出System.TypeLoadException 异常

            object o2 = System.Activator.CreateInstance("AnimalClass", "AnimalClass.Animal.monkey");

 

转载自:http://www.xinyingde.com/Article/715.Html

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值