C# 数据类型

数据类型

内存:

  1. 栈:存储数据少一些,直接存储数据值,读取会快一些。宝贵。
    • 值类型存储在栈上。
  2. 堆(托管堆):存储数据量大一些,存储数据对应的地址(门的钥匙)。取会慢一些。
    • 引用类型存储在堆上。

值类型:

  1. 存储的是实际的数据值。

  2. 直接存储在上。

    • 每次赋值时是重新分配空间

    • 修改时是在栈上改值

  3. 包括整数类型(如int、long)、浮点类型(如float、double)、字符类型(如char)

  4. 布尔类型(如bool)以及结构体(如struct)等。

  5. 值类型对应CTS中的一个类型

    • int → int32
    • float → single //特殊

整数、浮点、字符、布尔

类型描述范围默认值
sbyte8 位有符号整数类型-128 到 1270
byte8 位无符号整数0 到 2550
short16 位有符号整数类型-32,768 到 32,7670
ushort16 位无符号整数类型0 到 65,5350
int32 位有符号整数类型-2,147,483,648 到 2,147,483,6470
uint32 位无符号整数类型0 到 4,294,967,2950
long64 位有符号整数类型-9,223,372,036,854,775,808 到 9,223,372,036,854,775,8070L
ulong64 位无符号整数类型0 到 18,446,744,073,709,551,6150
float32 位单精度浮点型-3.4 x 1038 到 + 3.4 x 10380.0F
double64 位双精度浮点型(+/-)5.0 x 10-324 到 (+/-)1.7 x 103080.0D
decimal128 位精确的十进制值,28-29 有效位数(-7.9 x 1028 到 7.9 x 1028) / 100 到 280.0M
bool布尔值True 或 FalseFals
char16 位 Unicode 字符U +0000 到 U +ffff‘\0’

int 使用的广,原因:

  1. int是C#默认整数类型。

  2. int的范围可以满足大多数情况。

double使用的广,原因:

  1. double是C#默认浮点类型。

  2. double的范围可以满足大多数情况。


struct 结构体

  • 结构是值类型,类是引用类型;
  • 一般情况下,结构存储的设计量少,数据量大。
  • 使用也需要实例化
  • int等为什么不需要实例化因为它们是语法糖
  • 静态字段可以直接初始化
  • 必须把所有的实例字段初始化完,才可以访问属性
  1. 结构也放到.cs文件中
  2. 结构使用struct关键字来定义。
  3. 结构的命名建议使用大驼峰。
  4. 结构不能被继承
  5. 结构中也可以有字段,构造函数,方法
    • 构造函数没有返回值
    • 结构不能有析构函数
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 枚举

  1. 枚举项,键值对 格式: 枚举名称 = 枚举值, 每个枚举项以英文逗号分割。

  2. 使用枚举,不需要实例化。

  3. 枚举可以让访问的数据语义化。

  4. 枚举可以多个项中取一个或多个。

  5. 枚举一般用 int (char比较少用);

  6. 枚举值如果是int类型,和索引区分开。

  7. flags特性

  8. 在定义时可以在右边加上 例:int 来约束枚举值类型

枚举api
  1. Enum.GetName //查找指定常数的名称
  2. Enum.GetValues //获取值数组
  3. 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 ))  //可以得到所有的枚举值



字符串转枚举:

以下几种情况可能会导致字符串转枚举转换失败:

  1. 输入的字符串与枚举中的任何成员名称都不匹配。
  2. 输入的字符串为空字符串或 null
  3. 输入的字符串格式不正确,例如包含非法字符或不符合枚举成员的命名规则。
//字符串转枚举
Enum.TryParse<MyEnum>(str, out myEnum)



引用类型

  1. 存储的是对象的引用(内存地址)。
  2. 引用类型的对象存储在堆上,而变量本身(地址)存储在栈上。
  3. 包括类(如class)、接口(如interface)、数组(Array)、委托(如delegate)以及字符串(如string)等。
  4. object 和 dynamic

可空类型

  1. 值类型
  2. 引用类型设置 null 的目的就是让 GC 回收
  3. 引用类型是可以直接设置成null,值类型就需要使用使用可空类型 :
    • int? a = null; //Nullable<bool> a = null;
  4. void方法没有返回值。 //即方法的返回值为空
  5. " ” //空字符串
    • 在内存中给分配了空间,初始化为 " " 。
  6. null //空
    • 在内存中给分配空间,但没有初始化。

弱类型: var ; 动态类型 dynamic

  1. var :// variable 变量
    • var是一个“模糊的类型”,称为弱类型,编译器会根据循环的变量bools

去“猜” item 的类型。
    • 编译器去“猜”数据类型是编译期间
    • 编译期间如果代码出错,可以报异常。可以让错误提前。方便程序

员排错。
  2. dynamic://本质引用类型
    • 编译器去“猜”数据类型是程序运行期间

匿名对象

  1. 使用var ,dynamic,且.new 时不使用具体类型
  2. 其中属性可以随意定义
  3. var 不能用在形参中,dynamic可以

object

需要进行装箱拆箱


指针类型

不建议使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值