C#编程语言

值类型和引用类型、堆和栈

链接
计算机的内存从概念上分,会有许许多多独立的块,堆和栈就是其中的两种内存块。
C#的类型一共分为两类,一种是值类型(Value Type),一类是引用类型(Reference)。
C#的内置值类型共有七种:int、long、float、char、bool、enum、struct。而string类型是一种具有值类型特性的特殊引用类型。
值类型:struct、enum、int、float、char、bool、decimal
引用类型:class、delegate、interface、array、object、string
在这里插入图片描述在这里插入图片描述


存放在栈中时需有存储顺序,保持着先进后出的原则,因为它是一片连续的内存域,有系统自动分配和维护;
堆是无序的,它是一片不连续的内存域,有用户自己来控制和释放,如果用户自己不释放的话,当内存达到一定的特定值时,通过垃圾回收器(GC)来回收。

栈内存无需我们管理,也不受GC管理。当栈顶元素使用完毕,立马释放。而堆则需要GC清理。
使用引用类型的时候,一般是对指针进行的操作而非引用类型对象本身。但是值类型则操作其本身。

装箱拆箱

装箱:把值类型变量转换成引用类型变量
拆箱:把引用类型变量转换成值类型变量

装箱的过程:(隐式转换过程)
首先创建一个引用类型的实例,然后将值类型变量的内容复制给该引用类型实例。

拆箱的过程:(显示转换过程)
首先检查这个对象实例,看它是否为给定的值类型的装箱值;然后将这个实例的值复制给相应值类型的变量。

封装、继承、多态

C#多态性的实现:重载方法、重写方法、虚方法、抽象方法与抽象类、密封方法与密封类、接口
C#中,经常在派生类中通过 重写类的虚方法 或 实现抽象方法 来实现多态。

重载overload:在一个类中具有多个 方法名称相同但参数类型或参数个数不同 的方法
重写override:派生类和其基类具有 访问权限、方法名称、返回类型、参数类型和参数个数 都相同的方法,而派生类中的方法优先于或重写基类中同名的方法。(重写基类中的虚方法)

在派生类中对基类成员的改写有两种方法:重写(覆盖)(override)、隐藏(new)


虚方法:
类的静态方法和私有方法不能声明为虚方法。

virtual关键字不能和static、abstract、override修饰符一起使用


抽象方法与抽象类:
抽象方法是一个不完全的方法,只有方法头,没有具体的方法体。
还有抽象属性,其不可以定义具体的get和set访问器。
含有抽象方法的类肯定是抽象类。抽象类除了抽象类成员外,还有普通的类成员。
对于实例而言,没有实现的成员是不合法的,因此抽象类永远也不能实例化。
抽象方法为 隐式的虚方法,所以继承自抽象类的派生类,也要用override关键字重写基类的抽象方法。


密封方法与密封类:
密封方法(sealed):不能在继承过程中被派生类重写
密封类不能被其他类继承,即其没有派生类。因此密封类中的方法不能声明为virtual或abstract,否则就违背了声明密封类的初衷。
sealed必须与override在方法声明中一起使用。

静态类既不能被继承,也不能创建其对象,该类中的所有成员都是静态的。


接口:
C#类的继承只支持单继承,接口支持多继承。

类成员的可访问性

pubic(公共成员): 访问不受限制。
protected(保护成员):访问仅限于当前类或从当前类派生的类型。
internal(内部成员):访问仅限于当前程序集。
protected internal(保护内部成员):访问权限仅限于当前程序集或该类的派生类访问。
private(私有成员):访问仅限于当前类。

程序集:
程序集(Assembly)是.NET Framework 编程的基本组成部分,是指经由编译器编译得到的、供CLR进一步执行的中间产物。在Windows系统中,一般表现为.dll或.exe格式,必须依靠CLR才能顺利执行。在说明类成员的可访问性时,也可以将程序集简单理解为项目。

ref out params

ref:引用型参数
out:输出型参数
params:数组型参数

(1)ref指定的参数在函数调用时必须先初始化,而out不用
(2)out指定的参数在进入函数时会清空自己,因此必须在函数内部进行初始化赋值操作,而ref不用
总结:ref可以把值传到方法里,也可以把值传到方法外;out只可以把值传到方法外
注意:string作为特殊的引用类型,其操作是与值类型看齐的,若要将方法内对形参赋值后的结果传递出来,需要加上ref或out关键字。

对形参数组添加params修饰符时,所对应的实参可以是数组名,也可以是数组元素值的列表。无论采用哪一种形式,形参数组都不能定义数组的长度。

委托

使用委托可以将方法本身作为参数进行传递。实际上,委托代表了方法的引用(即内存地址),类似于C++的函数指针。

class Program
{
    public delegate void DOne(string str);
    public static void FOne(string str)
    {
        Console.WriteLine(str);
    }
    public delegate int DTwo(int a, int b);
    public static int FTwo(int a,int b)
    {
        return a + b;
    }
    static void Main(string[] args)
    {
        DOne dOne = new DOne(FOne);
        dOne("ABC");
        DTwo dTwo = new DTwo(FTwo);
        int num = dTwo(5, 4);
        Console.WriteLine(num);
        Console.ReadKey();
    }
}

在这里插入图片描述


匿名方法:
如果一个方法只是通过委托进行调用,那么在C#中允许不写出该方法的定义,而是将方法的执行代码直接卸载委托对象的创建表达式中。此时,被封装的方法称为匿名方法,对应地,使用常规方式(上面)定义的方法成员称为命名方法。

public delegate int DTwo(int a, int b);
static void Main(string[] args)
{
    DTwo dTwo2 = delegate (int a, int b)
      {
          return a + b;
      };
    int num2 = dTwo2(9, 9);
    Console.WriteLine(num2);
}

在这里插入图片描述

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值