winform类嵌入类中与不嵌入类中的区别

文章介绍了嵌套类的基本概念,包括静态嵌套类和非静态嵌套类(内部类),以及它们在访问控制、继承和单例模式中的应用。嵌套类可以提供更好的封装性和代码组织,同时在某些情况下如单例模式实现中,能有效控制实例化时机。此外,文章还提到了在反射操作中如何处理嵌套类的特殊性。
摘要由CSDN通过智能技术生成

1.基本概念
嵌套类:在一个类中定义另一个类,分为静态嵌套类(使用少)和非静态嵌套类(又称内部类)。
内部类:
(1) 在一个类中直接定义类。
(2) 在一个方法中定义类。
(3) 匿名内部类。

  1. 嵌套类的使用

    (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"; //实例成员
        }
    }
} 
  1. 嵌套类访问外部类实例的方法、字段、属性时候。一般在采取构造函数输入外部类
    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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

观天小蚁

需要广大市民的支持哦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值