当前位置:网站首页>C#基础补充
C#基础补充
2022-07-04 12:42:00 【华为云】
C#基础补充
A.对值类型的分配。
虚拟内存中存在一个叫堆栈的区域,我们并不知道它到底在地址空间的什么地方,在一般开发过程中也没有必要知道,我们知道的是值类型就分配于此。值类型在堆栈上分配的时候,是自上而下填充的,也就是从高内存地址开始填充。
比如当前的堆栈指针为100000,这表明它的下一个自由存储空间从99999开始,当我们在C#中声明一个int类型的变量A,因为int类型是四个字节,所以它将分配在99996到99999这个存储单元中。如果我们接着声明double变量B(8字节),该变量将分配在99988到99995这个存储单元。 如果代码运行到他们的作用域之外,这时候A和B两个变量都将被删除,此时的顺序正好相反,先删除变量B,同时堆栈指针会递增8,也就是重新指向到99996这个位置;接下来删除变量A,堆栈指针重新指向10000。如果两个变量是同时声明的。如int A,B,此时我们并不知道A和B的分配顺序,但是编译器会确保他们的删除顺序正好和分配顺序相反。
B.对引用类型的分配。
了解堆栈上的分配方式之后,很明显,它的性能相当高,同时我们也发现了它的一个缺点:变量的生存期必须嵌套。这对于某些情况来说是无法接受的,有时候我们需要存储一些数据并且在方法退出后仍然能保证这部分数据是可以使用的。为此,虚拟内存另外分配了一部分区域,我们称之为托管堆。托管堆和传统的堆很大的一个不同点在于,托管堆在垃圾收集器的控制下进行工作。引用类型就分配在托管堆上,下面我们来看看引用类型的分配过程。
假设我们需要声明一个Person类并对它进行实例化。
Person p = new Person();
首先, 系统会在堆栈上给p这个变量在堆栈上分配存储空间,当然它只是一个引用而已,用来存放Person实例在托管堆上的位置,并没有存放真正的Person实例。因为它仅仅是存放一个地址(一个整数值),所以它将在堆栈上占据4个字节的空间。接下来Person实例将会被存放在托管堆上。和堆栈不同,托管堆是由下往上分配的,假设这个实例需要占据10个字节,假设托管堆上的地址为200000,那么它将分配在200000到200009这个存储单元。
需要注意的是,这个分配和实例的大小有关,如果实例小于85000字节,它会被分配在托管堆。如果超过了85000字节,它将被分配在LOH上 。
C#语言不支持多重继承。
1.4.3 结构类型
结构类型和类一样,可以声明构造函数、数据成员、方法、属性等。结构和类的最根本的区别是结构是值类型,类是引用类型。和类不同,结构不能从另外一个结构或者类派生,本身也不能被继承,因此不能定义抽象结构,结构成员也不能被访问权限控制字protected修饰,也不能用virtual和abstract修饰结构方法。在结构中不能定义析构函数。虽然结构不能从类和结构派生,可是结构能够继承接口,结构继承接口的方法和类继承接口的方法基本一致。下面例子定义一个点结构point:
using System;struct point//结构定义{ public int x,y;//结构中也可以声明构造函数和方法,变量不能赋初值}class Test{ static void Main() { point P1; P1.x=166; P1.y=111; point P2; P2=P1;//值传递,使P2.x=166,P2.y=111 point P3=new point();//用new生成结构变量P3,P3仍为值类型变量 }//用new生成结构变量P3仅表示调用默认构造函数,使x=y==0。}
修饰符:
一个 访问修饰符 定义了一个类成员的范围和可见性。C# 支持的访问修饰符如下所示:
- public:所有对象都可以访问;
- private:对象本身在对象内部可以访问;
- protected:只有该类对象及其子类对象可以访问
- internal:同一个程序集的对象可以访问;
- protected internal:访问限于当前程序集或派生自包含类的类型。
using的用法:
1. using指令:引入命名空间
这是最常见的用法,例如:
using System;using Namespace1.SubNameSpace;
2. using static 指令:指定无需指定类型名称即可访问其静态成员的类型
using static System.Math;var = PI; // 直接使用System.Math.PI
3. 起别名
using Project = PC.MyCompany.Project;
4. using语句:将实例与代码绑定
using (Font font3 = new Font("Arial", 10.0f), font4 = new Font("Arial", 10.0f)){ // Use font3 and font4.}
代码段结束时,自动调用font3和font4的Dispose方法,释放实例。
关于构造函数的补充:
对于父类与子类来讲,子类在调用构造函数时会首先调用父类构造函数再调用子类构造函数。同样的,如果是多次继承,那么后面的子类调用构造函数时会从最上面的父类的构造函数开始调用一次往下,直到自己的构造函数。
枚举
C# 枚举学习需要注意:
System.Enum 类型是所有枚举类型的抽象基类(它是一种与枚举类型的基础类型不同的独特类型),并且从 System.Enum 继承的成员在任何枚举类型中都可用。存在从任何枚举类型到System.Enum 的装箱转换,并且存在从 System.Enum 到任何枚举类型的取消装箱转换。System.Enum 本身不是枚举类型。相反,它是一个类类型,所有枚举类型都是从它派生的。类型 System.Enum 从类型 System.ValueType派生,而后者又从类型 object 派生。在运行时,类型 System.Enum 的值可以是 null 或是对任何枚举类型的装了箱的值的引用。
边栏推荐
- Using nsproxy to forward messages
- Talk about the design and implementation logic of payment process
- 游戏启动后提示安装HMS Core,点击取消,未再次提示安装HMS Core(初始化失败返回907135003)
- 6 分钟看完 BGP 协议。
- Use fail2ban to prevent password attempts
- MDK在头文件中使用预编译器时,#ifdef 无效的问题
- 7、 Software package management
- CVPR 2022 | TransFusion:用Transformer进行3D目标检测的激光雷达-相机融合
- 上汽大通MAXUS正式发布全新品牌“MIFA”,旗舰产品MIFA 9正式亮相!
- SQL statement syntax error in test SQL statement deletion in eclipse linked database
猜你喜欢
高效!用虚拟用户搭建FTP工作环境
Efficient! Build FTP working environment with virtual users
[AI system frontier dynamics, issue 40] Hinton: my deep learning career and research mind method; Google refutes rumors and gives up tensorflow; The apotheosis framework is officially open source
Concepts and theories related to distributed transactions
Dgraph: large scale dynamic graph dataset
Etcd 存储,Watch 以及过期机制
C#/VB.NET 给PDF文档添加文本/图像水印
PostgreSQL 9.1 飞升之路
强化学习-学习笔记1 | 基础概念
eclipse链接数据库中测试SQL语句删除出现SQL语句语法错误
随机推荐
8 expansion sub packages! Recbole launches 2.0!
游戏启动后提示安装HMS Core,点击取消,未再次提示安装HMS Core(初始化失败返回907135003)
Is there an elegant way to remove nulls while transforming a Collection using Guava?
Interviewer: what is the difference between redis expiration deletion strategy and memory obsolescence strategy?
CANN算子:利用迭代器高效实现Tensor数据切割分块处理
Dgraph: large scale dynamic graph dataset
A taste of node JS (V), detailed explanation of express module
[cloud native | kubernetes] in depth understanding of ingress (12)
It is six orders of magnitude faster than the quantum chemical method. An adiabatic artificial neural network method based on adiabatic state can accelerate the simulation of dual nitrogen benzene der
Zhongang Mining: in order to ensure sufficient supply of fluorite, it is imperative to open source and save flow
从0到1建设智能灰度数据体系:以vivo游戏中心为例
jsonp
Concepts and theories related to distributed transactions
七、软件包管理
提高MySQL深分页查询效率的三种方案
n++也不靠谱
Personalized online cloud database hybrid optimization system | SIGMOD 2022 selected papers interpretation
再说rsync+inotify实现数据的实时备份
敏捷开发/敏捷测试感受
求解:在oracle中如何用一条语句用delete删除两个表中jack的信息