C#中类型的派生

一、什么是类型

Type 又名数据类型(Data Type)
• A data type is a homogeneous collection of values, effectively presented, equipped with a set of operations which manipulate these values.
• 是数据在内存中存储时的“型号”
• 小内存容纳大尺寸数据会丢失精度、发生错误
• 大内存容纳小尺寸数据会导致浪费
• 编程语言的数据类型与数据的数据类型不完全相同
强类型语言与弱类型语言的比较
• 强类型:编写程序时,程序中的数据受到数据类型的约束,即强类型编程语言
• 弱类型:数据受类型约束不严格,或基本不受约束,即弱类型编程语言(如 JavaScript 动态类型)
• C# 从 4.0 开始引入了 Dynamic,让它可以利用动态语言的一些特性,但 C# 依然是强类型编程语言
变量的实质是:以变量名所对应的内存为起始地址,按该变量的类型所需的存储空间为长度的一块内存区域

二、类型的划分与派生

在这里插入图片描述
C#数据类型分为两大类:值类型(数据存放在栈stack中)和引用类型(数据存放在堆heap中,地址存放在栈stack中)。引用类型包括类、接口、委托,值类型包括结构体和枚举, 所有类型都以 Object 为自己的基类型
上图中第一列(object列)表示的是引用类型的类名(蓝色)与关键字(黑色),第二列表示常见的值类型的类名(蓝色)与关键字(黑色),第三了表示为某类型服务的特殊关键字

三、值类型与引用类型变量声明以及实例化过程

1、值类型

对于值类型变量在内存中的分配 较为简单,当声明一个值类型变量后,编译器会将一个空闲内存块的地址(栈区)与该变量名绑定,当我们对该变量进行操作时实际就是完成对给内存快的操作
例:
声明一个变量b为byte类型并赋值100,实际上编译器完成的工作就是在内存中找到一个空闲内存0x10000015并将100的二进制值写入该字节
在这里插入图片描述
在这里插入图片描述

2、引用类型

引用类型(数据存放在堆heap中,地址存放在栈stack中),引用类型变量所存储的是一个4字节长的堆区地址,以该堆区地址为起始存放的是该变量 的实际参数。
例:
定义一个学生类(引用类型),并对其去实例化赋值

class Program
{
    static void Main(string[] args)
    {
        Student stu ;
        stu = new Student();
        stu.Age = 1;

    }

    class Student
    {
        public static int Amout;
        public int Age;
        public string Name;
    }
}

这一过程中编译器实际完成的工作是:1、声明该引用类型变量时为其在栈区找到一块四字节内存空间并将初始地址与该变量名(stu)绑定
在这里插入图片描述
2、当对stu实例化时,编译器会在堆区找到一块对应该类大小的内存空间并将该内存块起始地址复制给stu
在这里插入图片描述
3、对stu内部成员变量赋值,实际就是通过栈区地址找到堆区地址,再根据该成员变量在类中位置修改对应内存。

四、装箱与拆箱

装箱和拆箱是值类型和引用类型之间的相互转换。装箱是值类型向引用类型转换时发生的,拆箱是引用类型向值类型转换时发生的。
例:
装箱

int a = 100;
object x;
x = a;

定义一个值类型a赋值100,实际就是在栈地址0x10000027位置开始的四个字节写入100对应二进制,将值类型a赋值给引用类型x的过程称为装箱,x不会直接a的内容作为引用地址(可能会访问到系统关键位置),而是将a的内容存放的堆区中,并将堆区地址写入到x
在这里插入图片描述
拆箱

int a = 100;
object x;
x = a;
int b = (int)x;

将引用类型变量x的值赋值给b的过程实际上是,是将x中存储的堆区地址0x30000010中的内容赋值b,这过程就叫做拆箱
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#,`override`关键字用于在派生类重写基类的虚方法、属性或索引器。通过使用`override`关键字,我们可以在派生类提供自己的实现,覆盖基类的默认实现。 要使用`override`关键字,需要满足以下条件: 1. 基类的方法、属性或索引器必须被声明为`virtual`或`abstract`。 2. 派生类的方法、属性或索引器必须具有相同的名称、返回类型和参数列表。 下面是一个示例,演示了如何在派生类使用`override`关键字来重写基类的虚方法: ```csharp class Animal { public virtual void MakeSound() { Console.WriteLine("The animal makes a sound"); } } class Dog : Animal { public override void MakeSound() { Console.WriteLine("The dog barks"); } } class Program { static void Main(string[] args) { Animal animal = new Animal(); animal.MakeSound(); // 输出: The animal makes a sound Dog dog = new Dog(); dog.MakeSound(); // 输出: The dog barks Animal animalDog = new Dog(); animalDog.MakeSound(); // 输出: The dog barks } } ``` 在上面的示例,`Animal`类的`MakeSound`方法被声明为`virtual`,表示它可以被派生类重写。`Dog`类继承自`Animal`类,并使用`override`关键字重写了`MakeSound`方法。在`Main`方法,我们创建了一个`Animal`对象和一个`Dog`对象,并分别调用它们的`MakeSound`方法。由于`Dog`类重写了`MakeSound`方法,所以在调用`dog.MakeSound()`时输出的是"The dog barks"。 此外,还可以使用`override`关键字重写基类的属性和索引器。重写属性和索引器的语法与重写方法类似。 希望这个例子能够帮助你理解`override`关键字在C#的用法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值