1 格式化 类型 栈堆 值类型引用类型 dynamic
目录
1 c# 和 .NET框架
1.1 CLR
CLR 在运行时管理程序的执行,包括以下的内容
- 内存管理和垃圾收集
- 代码安全验证
- 代码执行,线程管理及异常处理
自动垃圾收集
- CLR有一项服务叫做 GC,他能自动管理内存,
- GC自动从内存中删除程序不再访问的对象
托管代码
为.NET框架编写的代码成为托管代码,需要CLR
非托管代码
不再CLR控制之下运行的代码,比如Win32 C/C++ DLL 称为非托管代码
CLR其他服务
1.2 各种缩写
2 c#编程概述
2.3 关键字
2.7 文本格式化
double number = 12.4583;
string str = string.Format("|{1:X10}|", 23,32);
string str2 = string.Format("|{0,10}|", 23,32);
string str3 = string.Format("|{0,-10}|", 23,32);
Console.WriteLine(str);
Console.WriteLine(str2);
Console.WriteLine(str3);
Console.ReadLine();
// console
|0000000020|
| 23|
|23 |
3 类型存储和变量
3.5 预定义类型
c# 提供了16种预定义类型,其中包括13种简单类型,和3种非简单类型
预定义简单类型包括以下三种
- 11 种数值类型
- 不同长度的有符号和无符号的整型
- 浮点类型 float 和 double
- decimal 高精度小数型
- Unicode字符类型 char
- bool类型
3 种非简单类型
- string 他是一个 unicode字符数组
- object, 他是所有其他类型的基类
- dynamic,使用动态语言编写的程序集时使用
3.6 用户定义类型
6种可以由用户自己创建
- 类类型 (class)
- 结构类型 (struct)
- 数组类型 (array)
- 枚举类型 (enum)
- 委托类型 (delegate)
- 接口类型 (Interface)
3.7 堆和栈
程序运行时,他的数据必须存储在内存中,一个数据需要多大的内存,存在什么地方,以及如何存储都依赖于该数据项的类型
运行中的程序使用两个内存区域来存储数据: 堆和栈
3.7.1 栈
栈是一个内存组,是一个LIFO 后进先出的数据结构, 栈存储几种类型的数据:
- 某些类型变量的值
- 程序当前执行环境
- 传递给方法的参数
3.7.2 堆
堆是一块内存区域,在堆里可以分配大块的内存 用户存储某些类型的数据,与栈不同,堆里的内存可以任意顺序的传入和移除
3.8 值类型和引用类型
数据项的类型定义了存储数据需要的内存大小及组成该类型的数据成员,类型还决定了对象在内存中的存储位置-- 栈或堆
类型被分为两种:值类型和引用类型,这两种类型的对象在内存中的存储方式不同
-
值类型只需要单独的一块内存,用于存储实际的数据
-
引用类型需要分为两段内存
- 第一段存储实际的数据,他总是位于堆中
- 第二段是一个引用,指向数据在堆中存放的位置
3.8.1 存储引用类型对象的成员
对于引用类型的任何对象,他所有的数据成员都存放在堆中,无论他们是值类型还是引用类型!
3.8.2 c# 类型的分类
3.9 变量
C# 有4种变量
名称 | 描述 |
---|---|
本地变量 | 在方法的作用域保存临时数据,不是类型的成员 |
字段 | 保存和类型或类型实例相关的数据,是类型的成员 |
参数 | 用于从一个方法到另一个方法传递数据的临时变量,不是类型成员 |
数组元素 | (通常是)同类数据项构成的有序集合的一个成员,可以为本地变量,也可以为类型的成员 |
3.9.1 变量声明
- 给变量命名,并为它关联一种类型
- 让编译器为它分配一块内存
int var;
3.10 静态类型和dynamic关键字
dynamic是FrameWork4.0的新特性。dynamic的出现让C#具有了弱语言类型的特性。编译器在编译的时候不再对类型进行检查,编译期默认dynamic对象支持你想要的任何特性。比如,即使你对GetDynamicObject方法返回的对象一无所知,你也可以像如下那样进行代码的调用,编译器不会报错
3.11 可空类型
吾虽浪迹,却未迷失本心