c#枚举和结构体类型详解
目录
枚举类型
1,什么是枚举
2,枚举的定义
3,枚举的基础类型
4,枚举的使用
(1)获取枚举的值
(2)也可以通过整型获得对应的枚举名称
(3)转换枚举为字符串
(4)也可以从字符串获得对应的枚举名称
结构体
1,结构体的基本定义
2,结构体的特点
枚举类型
1,什么是枚举
顾名思义,枚举是用来表示一定集合的变量,通常用来表示一组相关的标识符,如 状态,类别等,比如针对“手机”这种类型,我们可以枚举出小米手机,苹果手机, 华为手机等等
2,枚举的定义
在c#中用enum关键字来定义枚举类型,例:
enum EnumName
{
Value1, //默认值从0开始
Value2,
Value3,
……
}
具体示例,以周一到周日为例:
enum Days
{
Sunday, //默认值为0
Monday, //默认值为1
Tuesday, //默认值为2
Wednesday, //默认值为3
Thursday, //默认是为4
Friday, //默认值为5
Saturday //默认值为6
}
在这个例子中,Days就是一个枚举变量,其包含了周一到周日七个值,默认情况 下值从0开始递增
当然也可以自定义枚举的值,例:
enum Days
{
Sunday=1,
Monday=2,
Tuesday=3,
Wednesday=4,
Thursday=5,
Friday=6,
Saturday=7
}
在这个例子中,Sunday被赋值为1,Monday被赋值为2,以此类推
3,枚举的基础类型
在c#中,枚举的底层类型默认是int,但是你可以显式的指定底层类型,常见的底 层类型包括byte,short,long等,例
enum Days : byte
{
Sunday = 1,
Monday = 2,
Tuesday = 3
}
这段代码,Days枚举变量的底层类型是byte,而不是默认的int,这可以节省内层
4,枚举的使用
(1)获取枚举的值
可以将枚举类型的值赋给一个变量,并且可以将枚举值强制转换为别的类型, 比如整型
Enum Days
{
Sunday=1,
Monday=2,
Tuesday=3,
Wednesday=4,
Thursday=5,
Friday=6,
Saturday=7
}
int today=(int)Days.Monday; //输出2
Days today=Days.Monday; //输出Monday
也可以将一个整型强制转换为枚举类型
Days today=Days.Monday;
today=(Days)200;
(2)也可以通过整型获得对应的枚举名称
可以通过Enum.GetName方法将整数值转换回枚举名称,或者通过 Enum.GetValues获取枚举类型的所有值
例:
int value=3;
String dayName=Enum.GetName(typeof(Days),value); //返回Tuesday
例:
foreach (var day in Enum.GetValues(typeof(Days)))
{
Console.WriteLine(day); // 输出所有枚举值:Sunday, Monday, Tuesday...
}
(3)转换枚举为字符串
可以使用Enum.ToString()方法将枚举值转换为字符串
Days today = Days.Monday;
Console.WriteLine(today.ToString()); // 输出 Monday
(4)也可以从字符串获得对应的枚举名称
可以使用Enum.Parse或Enum.TryParse方法从字符串中获取枚举值
string dayString = "Friday";
Days day = (Days)Enum.Parse(typeof(Days), dayString);
Console.WriteLine(day); // 输出 Friday
结构体
1,结构体的基本定义
C#中的结构体是通过struct关键字定义的,一个结构体可以包含字段、属性、方法、构造等成员
基本语法如下:
struct Point
{
public int X;
public int Y;
public Point(int x, int y)
{
X = x;
Y = y;
}
public void Display()
{
Console.WriteLine("Point({X}, {Y})");
}
}
class Program
{
static void Main()
{
Point p1 = new Point(10, 20);
p1.Display(); // 输出: Point(10, 20)
}
}
2,结构体的特点
(1)结构体是值类型,因此他们直接存储在栈中,当一个结构体的实例被赋值或传递时,整个结构体的数据会被复制
例:
Point p1 = new Point(10, 20);
Point p2 = p1; // p2 是 p1 的副本
p2.X = 100;
Console.WriteLine(p1.X); // 输出 10,p1 的值未改变
Console.WriteLine(p2.X); // 输出 100
(2)不能继承其他结构体类型,结构体不能从其他结构体或类继承
(3)没有默认构造函数,结构体不能有显示的无参数构造函数,因为编译器会提 供一个默认的无参数构造函数,例:
struct Point
{
public int X;
public int Y;
// 无法定义显式的默认构造函数
// public Point() { } // 编译错误
public Point(int x, int y)
{
X = x;
Y = y;
}
}