C# 冷门定义的讲解(装箱、拆箱、部分类、抽象类、虚方法)

一、装箱与拆箱

        装箱与拆箱就是将值类型与引用类型进行转换,C#的数据类型分为栈上分配内存的值类型和托管堆上分配内存的引用类型。

        装箱:值类型转换成引用类型,从值类型到引用类型的隐式转换,也可以显式转换;

int A = 10;
object obj = A;

        拆箱:引用类型转换成值类型,从引用类型到值类型的显式转换,只有被装箱过的对象才能被拆箱;

int A = 10;
object obj = A;
int B = (int) obj;

        装箱和拆箱意味着需要在堆和堆栈空间上进行一系列的操作,很明显是需要消耗性能的,尤其是堆操作对堆栈操作速度要慢的多,而且容易产生垃圾回收,这些都将影响系统的性能。

        如何避免装箱与拆箱操作?

        场景:

        1、值类型的格式化输出

int A = 10;
Console.WriteLine("A的值="+ A);

        这其中就进行了一次装箱操作,可以修改为:

int A = 10;
Console.WriteLine("A的值="+ A.ToString());

        2、System.Object类型的容器

        比如ArrayList就是一个典型System.Object容器,任何值存入ArrayList对象中都会进行一次装箱操作,而取出值又回发生一次拆箱操作;泛型可以定义特定类型的容器,使用泛型可以有效避免装箱与拆箱操作。

二、部分类

访问修饰符   修饰符   partial class   类名{……}

        部分类,顾名思义就是类的一部分,当一个类的代码量很大的情况,查找查看就很不方便,或者多人同时对一个类文件进行修改时,就会存在冲突;而partial关键字允许将类、方法、接口存放于多个文件中,但是编译会编译成同一个文件。

public partial class A{
    public void test1(){
        //实现
    }
}

public partial class A{
    public void test2(){
        //实现
    }
}

三、抽象类

访问修饰符   修饰符   abstract class   类名{……}

        C# 使用abstract关键字来创建抽象类,当一个派生类继承一个抽象类时,该派生类必须实现该抽象类的抽象方法。

        抽象类规则:

        1、抽象类不能声明为sealed;

        2、不能直接创建一个抽象类的实例;

        3、不能抽象类外部声明抽象方法;

        4、抽象类可以有抽象方法,抽象方法可以被派生类实现;

        5、抽象类可以定义普通方法、虚方法,并且有实现;

    /// <summary>
    /// 抽象类
    /// </summary>
	public abstract class TestClass
	{
        //抽象类的方法
		public abstract void getClass();
	}

    /// <summary>
    /// 派生类:继承于抽象类
    /// </summary>
    public class Test1class : TestClass
    {
        //实现抽象类的方法
        public override void getClass()
        {
            throw new NotImplementedException();
        }
    }

四、虚方法

        虚方法:在基类中,一个方法前面用virtual关键字修饰,并且可以在子类中使用override重写的方法,就是虚方法。

        特点:

        1、不能用sealed修饰,不然不能重写;

        2、方法必须用;

        3、必须用virtual修饰;

        4、用override重写,可在子类重写,也可以不重写;

        要求:相同的方法名称、相同的参数、相同的返回值类型

/// <summary>
    /// 父类
    /// </summary>
	public class TestClass
	{
        //虚方法
		public virtual void getClass()
        {
            Console.WriteLine("父类");
        }
	}
    /// <summary>
    /// 子类
    /// </summary>
    public class testclass:TestClass
    {
        //重写父类方法
        public override void getClass()
        {
            Console.WriteLine("子类重写父类方法");
        }
    }
    /// <summary>
    /// 子类
    /// </summary>
    public class testclass1 : TestClass
    {
        //隐藏父类方法
        public new void getClass()
        {
            Console.WriteLine("子类隐藏父类方法");
        }
    }

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值