枚举
枚举在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# 类 属性 方法 结构体首字母大写,字段名小写
结构体和类的区别:
- 类当中写了一个新的构造函数之后,默认的无参数的就被干掉了。但是在结构中,写了一个新的构造函数之后,默认的那个无参数的还在。
在结构的构造函数当中,必须给所有的字段赋值。结构只能有两个构造函数,一个是默认的无参数的构造函数,一个是全参数的构造函数。 - 当您使用 new 操作符创建一个结构对象时,会调用适当的构造函数来创建结构。与类不同,结构可以不使用 new 操作符即可被实例化。如果不使用 new 操作符,只有在所有的字段都被初始化之后,对象才被使用。
- 结构不能继承于类,而类也不能继承于结构。
- 结构不具备面向对象的特征,而类才是面向对象的产物。
- 结构不能定义析构函数,结构成员不能指定为 abstract、virtual 或 protected。
值类型和引用类型
int、decimal、bool、double byte 枚举结构等类型(值类型)是传递拷贝;对象(引用类型)则是传递引用。
引用类型传递的是对象的内存位置。使用多个变量时,引用类型可以指向一个内存位置。如果内存位置的数据是由一个变量改变的,其他变量会自动反映这种值的变化。
//堆和栈的区别
1.栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;局部值类型变量、值类型参数等都在栈内存中。
2.堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。
值类型和引用类型的区别
1.存储位置:值类型的变量直接存储其值,而引用类型的变量存储的是对其值的引用或指针。值类型的变量通常存储在栈上,而引用类型的变量通常存储在堆上。
2.分配方式:值类型的变量通常是在声明时直接分配的,而引用类型的变量通常是在运行时动态分配的。
3.复制方式:当将值类型的变量复制到另一个变量时,会创建一个新的副本,而当将引用类型的变量复制到另一个变量时,只会复制对其值的引用,而不会创建一个新的副本。
4.等式比较:值类型的变量可以使用 == 运算符进行比较,以比较它们的值是否相等,而引用类型的变量使用 == 运算符比较的是它们的引用,因此需要使用 Equals() 方法进行值的比较。
5.可空性:值类型可以声明为可空类型,以便存储 null 值,而引用类型本身就能存储 null 值。
6.继承和接口实现:值类型不能直接从其他类型继承,但可以通过结构体派生出新的类型并实现接口。引用类型可以直接从其他类型继承,并可以实现接口。
7.性能:值类型在栈上分配,不需要垃圾回收,因此它们的性能通常比引用类型更好。引用类型在堆上分配,需要垃圾回收和对象引用解析,因此它们的性能通常比值类型更差。