枚举,结构体,值类型和引用类型

枚举

枚举在C#中的含义和特点:

  • 枚举是一组命名的常量。通过枚举可以定义有限的一组常量值。

  • 枚举具有清晰明确的语义,避免使用魔法数值。

  • 枚举默认从0开始自增长编序索引值。

  • 枚举可以拥有方法和属性。

[public] enum 枚举名
{
	值1,
	值2,
	值3,
	........
}

// public:访问修饰符。公开的公共的,哪都可以访问。
// enum:关键字,声明枚举的关键字
// 枚举名:要符合Pascal命名规范
public enum Day {
  Sunday,
  Monday,
  Tuesday,
  Wednesday,
  Thursday,
  Friday, 
  Saturday
}
调用:

csharp
Copy
Console.WriteLine((int)Day.Sunday); //0
/ 字符串转换枚举类型注意点:
// 1.如果转换的字符串是数字,则就算枚举中没有,也会不会抛异常。
// 2.如果转换的字符串是文本,如果枚举中没有,则会抛出异常。

// 枚举类型和int类型转换:枚举类型默认是跟int类型相互兼容的,可以通过强制类型转换的语法互相转换。
所以C#枚举是一种特殊的数据类型,它定义了一个名称化常量集合,可以用于替换魔法数值,方便理解。

常用在状态值、错误代码、UI元素等场景定义有限值集。

结构体

结构体(Struct)在C#中的含义和特点:

  • 结构体是值类型,用于描述简单类型的数据。

  • 与类不同,结构体会被存储在栈内存中,传值方式传入方法。

  • 结构体默认为public,并且不需要显式指定访问修饰符。

  • 结构体不能使用继承关系,只能实现接口。

  • 结构体通常包含基本字段,不包含引用类型字段。

访问修饰符 struct 结构名
{ 
    定义结构成员
}

struct Books
{
    // 定义字段 不能赋值
    // 结构可带有方法、字段、索引、属性和事件
    public string title;
    public string author;
    public string subject;
    public int book_id;
};

// 注意:C# 类   属性   方法   结构体首字母大写,字段名小写

结构体和类的区别:

  1. 类当中写了一个新的构造函数之后,默认的无参数的就被干掉了。但是在结构中,写了一个新的构造函数之后,默认的那个无参数的还在。
    在结构的构造函数当中,必须给所有的字段赋值。结构只能有两个构造函数,一个是默认的无参数的构造函数,一个是全参数的构造函数。
  2. 当您使用 new 操作符创建一个结构对象时,会调用适当的构造函数来创建结构。与类不同,结构可以不使用 new 操作符即可被实例化。如果不使用 new 操作符,只有在所有的字段都被初始化之后,对象才被使用。
  3. 结构不能继承于类,而类也不能继承于结构。
  4. 结构不具备面向对象的特征,而类才是面向对象的产物。
  5. 结构不能定义析构函数,结构成员不能指定为 abstract、virtual 或 protected。

值类型和引用类型

int、decimal、bool、double byte 枚举结构等类型(值类型)是传递拷贝;对象(引用类型)则是传递引用。
引用类型传递的是对象的内存位置。使用多个变量时,引用类型可以指向一个内存位置。如果内存位置的数据是由一个变量改变的,其他变量会自动反映这种值的变化。
//堆和栈的区别
1.栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;局部值类型变量、值类型参数等都在栈内存中。
2.堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。

值类型和引用类型的区别

1.存储位置:值类型的变量直接存储其值,而引用类型的变量存储的是对其值的引用或指针。值类型的变量通常存储在栈上,而引用类型的变量通常存储在堆上。
2.分配方式:值类型的变量通常是在声明时直接分配的,而引用类型的变量通常是在运行时动态分配的。
3.复制方式:当将值类型的变量复制到另一个变量时,会创建一个新的副本,而当将引用类型的变量复制到另一个变量时,只会复制对其值的引用,而不会创建一个新的副本。
4.等式比较:值类型的变量可以使用 == 运算符进行比较,以比较它们的值是否相等,而引用类型的变量使用 == 运算符比较的是它们的引用,因此需要使用 Equals() 方法进行值的比较。
5.可空性:值类型可以声明为可空类型,以便存储 null 值,而引用类型本身就能存储 null 值。
6.继承和接口实现:值类型不能直接从其他类型继承,但可以通过结构体派生出新的类型并实现接口。引用类型可以直接从其他类型继承,并可以实现接口。
7.性能:值类型在栈上分配,不需要垃圾回收,因此它们的性能通常比引用类型更好。引用类型在堆上分配,需要垃圾回收和对象引用解析,因此它们的性能通常比值类型更差。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值