数据类型
内存:
- 栈:存储数据少一些,直接存储数据值,读取会快一些。宝贵。
- 值类型存储在栈上。
- 堆(托管堆):存储数据量大一些,存储数据对应的地址(门的钥匙)。取会慢一些。
- 引用类型存储在堆上。
值类型:
-
存储的是实际的数据值。
-
直接存储在栈上。
-
每次赋值时是重新分配空间
-
修改时是在栈上改值
-
-
包括整数类型(如int、long)、浮点类型(如float、double)、字符类型(如char)
-
布尔类型(如bool)以及结构体(如struct)等。
-
值类型对应CTS中的一个类型
- int → int32
- float → single //特殊
整数、浮点、字符、布尔
类型 | 描述 | 范围 | 默认值 |
---|---|---|---|
sbyte | 8 位有符号整数类型 | -128 到 127 | 0 |
byte | 8 位无符号整数 | 0 到 255 | 0 |
short | 16 位有符号整数类型 | -32,768 到 32,767 | 0 |
ushort | 16 位无符号整数类型 | 0 到 65,535 | 0 |
int | 32 位有符号整数类型 | -2,147,483,648 到 2,147,483,647 | 0 |
uint | 32 位无符号整数类型 | 0 到 4,294,967,295 | 0 |
long | 64 位有符号整数类型 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | 0L |
ulong | 64 位无符号整数类型 | 0 到 18,446,744,073,709,551,615 | 0 |
float | 32 位单精度浮点型 | -3.4 x 1038 到 + 3.4 x 1038 | 0.0F |
double | 64 位双精度浮点型 | (+/-)5.0 x 10-324 到 (+/-)1.7 x 10308 | 0.0D |
decimal | 128 位精确的十进制值,28-29 有效位数 | (-7.9 x 1028 到 7.9 x 1028) / 100 到 28 | 0.0M |
bool | 布尔值 | True 或 False | Fals |
char | 16 位 Unicode 字符 | U +0000 到 U +ffff | ‘\0’ |
int 使用的广,原因:
-
int是C#默认整数类型。
-
int的范围可以满足大多数情况。
double使用的广,原因:
-
double是C#默认浮点类型。
-
double的范围可以满足大多数情况。
struct 结构体
- 结构是值类型,类是引用类型;
- 一般情况下,结构存储的设计量少,数据量大。
- 使用也需要实例化
- int等为什么不需要实例化因为它们是语法糖
- 静态字段可以直接初始化
- 必须把所有的实例字段初始化完,才可以访问属性
- 结构也放到.cs文件中
- 结构使用struct关键字来定义。
- 结构的命名建议使用大驼峰。
- 结构不能被继承
- 结构中也可以有字段,构造函数,方法
- 构造函数没有返回值
- 结构不能有析构函数
private int x;
private int y;
public Point(int xl,int yl)
{
this.x = xl; //this.x 外面定义的字段x
this.y = yl;
}
结构相关细节:
结构即结构体,是值类型数据结构。
结构使用 struct 关键字声明。
结构和类相比,一般保存的数据量少,存储在栈上,读取速度比类快。
结构可带有方法、字段、索引、属性、运算符重载和事件。
结构可定义有参构造函数,但不能定义析构函数和无参构造函数。
结构和类不同,不支持继承。但结构可以实现接口。
结构成员不能指定为 abstract、virtual 或 protected。
当您使用 new 操作符创建一个结构对象时,会调用适当的构造函数来创建结构。与类不同,结构可以不使用 New 操作符即可被实例化。
如果不使用 New 操作符,只有在所有的字段都被初始化之后,字段才被赋值,对象才被使用。
结构和类的区别:
在C#中,结构(struct)和类(class)是两种不同的数据类型,它们有以下区别:
a.结构是值类型,而类是引用类型。这意味着结构直接包含其数据,而类的实例包含对其数据的引用。
b.结构不支持继承,而类可以继承其他类。
c.结构的实例化不需要调用构造函数,而类的实例化需要。
d.结构的构造函数必须包括所有字段的赋值,而类的构造函数不需要。
e.结构不能定义析构函数,而类可以。
f.在方法参数传递时,结构是通过值传递的,而类是通过引用传递的。
g.结构可以实现接口,而类也可以实现接口。
h.结构默认不能初始化为null,但类可以。
i.在性能上,大型结构或经常需要复制的结构使用类可能更为高效,因为类是引用类型,而结构是值类型,复制类的引用比复制结构的数据更加高效。
enum 枚举
-
枚举项,键值对 格式: 枚举名称 = 枚举值, 每个枚举项以英文逗号分割。
-
使用枚举,不需要实例化。
-
枚举可以让访问的数据语义化。
-
枚举可以多个项中取一个或多个。
-
枚举一般用 int (char比较少用);
-
枚举值如果是int类型,和索引区分开。
-
flags特性
-
在定义时可以在右边加上 例:int 来约束枚举值类型
枚举api
- Enum.GetName //查找指定常数的名称
- Enum.GetValues //获取值数组
- Enum.IsDefind //包含
//定义一个枚举
public enum Sex
{
None = 1;
Man = 'b';
Woman = 'c';
}
//赋值的一种方法
Sex sex = new Sex{None=886, Man=123};
//默认取枚举名称(键名)
Console.WriteLine(Sex.Man);
Console.WriteLine(Sex.Man|sex.woman); //取多个
//强转得到枚举值
Console.WriteLine((int)Sex.Man);
//Enum是枚举的类,专门提供对枚举项的访问。
//typeof(Sex)得到某个对象的类型
Enum.GetName(typeof(Sex),1); //获得值为 1 枚举名称
Enum.GetName(typeof(GetValues )) //可以得到所有的枚举值
字符串转枚举:
以下几种情况可能会导致字符串转枚举转换失败:
- 输入的字符串与枚举中的任何成员名称都不匹配。
- 输入的字符串为空字符串或
null
。 - 输入的字符串格式不正确,例如包含非法字符或不符合枚举成员的命名规则。
//字符串转枚举
Enum.TryParse<MyEnum>(str, out myEnum)
引用类型
- 存储的是对象的引用(内存地址)。
- 引用类型的对象存储在堆上,而变量本身(地址)存储在栈上。
- 包括类(如class)、接口(如interface)、数组(Array)、委托(如delegate)以及字符串(如string)等。
- object 和 dynamic
可空类型
- 值类型
- 引用类型设置 null 的目的就是让 GC 回收
- 引用类型是可以直接设置成null,值类型就需要使用使用可空类型 :
- int? a = null; //Nullable<bool> a = null;
- void方法没有返回值。 //即方法的返回值为空
- " ” //空字符串
- 在内存中给分配了空间,初始化为 " " 。
- null //空
- 在内存中给分配空间,但没有初始化。
弱类型: var ; 动态类型 dynamic
- var :// variable 变量
- var是一个“模糊的类型”,称为弱类型,编译器会根据循环的变量bools 去“猜” item 的类型。
- 编译器去“猜”数据类型是编译期间
- 编译期间如果代码出错,可以报异常。可以让错误提前。方便程序 员排错。
- dynamic://本质引用类型
- 编译器去“猜”数据类型是程序运行期间
- 编译器去“猜”数据类型是程序运行期间
匿名对象
- 使用var ,dynamic,且.new 时不使用具体类型
- 其中属性可以随意定义
- var 不能用在形参中,dynamic可以
object
需要进行装箱拆箱
指针类型
不建议使用