前言
由于最近工作开始重新使用了C#, 框架也是.Net4.5, 看了下, 这本书是比较合适的, 所以就重新学习了下, 由于之前本人已有C#相关基础, 所以不会所有内容都做笔记, 只会对不熟悉或者比较重要的内容做笔记.
3.2 基础数据类型
3.2.4 枚举类型
枚举类型属于值类型, 用于定义一组命名了的常数.
优点有:
- 可读性强:枚举类型能够为常量赋予有意义的名称,使得代码更加易读和易于理解。
- 类型安全:枚举类型在编译时会进行类型检查,避免了在运行时出现不正确的常量赋值。
- 可扩展性:枚举类型可以随时添加新的常量,而不会对现有代码造成影响。
适用的应用场景:
- 表示状态或选项:枚举类型可以用于表示有限的状态或选项,比如表示订单的状态(待支付、已支付、已取消)等。
- 限定取值范围:枚举类型可以用于限定某个变量的取值范围,确保变量只能取枚举中定义的常量值。
- 提高代码可读性:枚举类型可以使代码更加易读和易于理解,尤其是在需要使用一组常量的情况下。
枚举类型使用enum
关键字来完成声明。默认情况下,枚举中的每个元素都是int
类型。
如果未在枚举列表中指定元素的值,则默认会将所声明的第一个枚举成员设为0,之后的枚举成员依次加1。
如下面例子, 定义一个变量由于存储今天是周几, 可以使用枚举类型.
// 定义一个枚举类型表示一周中的每一天
// 下面Monday的值为0, 按顺序下去依次加1, Sunday的值为6
enum DayOfWeek
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
class Program
{
static void Main(string[] args)
{
// 使用枚举类型声明变量
DayOfWeek today = DayOfWeek.Monday;
// 输出变量的值
Console.WriteLine("Today is " + today);
// 使用枚举类型进行条件判断
if (today == DayOfWeek.Saturday || today == DayOfWeek.Sunday)
{
Console.WriteLine("It's a weekend!");
}
else
{
Console.WriteLine("It's a weekday!");
}
}
}
用户也可通过使用冒号,制定一种全新的整数值类型.
比如这样:
// byte类型实际为0~255的8位整数
enum DayOfWeek: byte
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
3.2.5 结构体类型
结构体(struct)是一种值类型(value type),它可以存储多个相关的数据字段并封装在一起。与类不同,结构体是通过值拷贝的方式传递和存储的,而不是通过引用。
结构体的优点:
- 轻量级:结构体通常比类更轻量级,因为它们不需要继承机制,也不需要进行垃圾回收。
- 性能高:结构体的值拷贝操作比引用类型的引用传递更高效,适用于存储和传递较小的数据结构。
- 值语义:结构体是值类型,具有值语义,可以保证每个实例都是独立的。
结构体的应用场景:
- 表示简单的数据类型:例如坐标、颜色等。
- 封装多个相关的数据字段:例如日期、时间、复数等。
- 优化性能:当需要频繁创建和销毁对象时,使用结构体可以减少垃圾回收的开销。
下面是一个代码示例, 展示了如何定义和使用一个结构体来表示日期,并提供计算两个日期之间天数差的功能
using System;
public struct Date
{
public int Year { get; set; }
public int Month { get; set; }
public int Day { get; set; }
// 构造函数
public Date(int year, int month, int day)
{
Year = year;
Month = month;
Day = day;
}
// 计算两个日期之间的天数差
public int DaysBetween(Date otherDate)
{
DateTime date1 = new DateTime(Year, Month, Day);
DateTime date2 = new DateTime(otherDate.Year, otherDate.Month, otherDate.Day);
TimeSpan diff = date2 - date1;
return diff.Days;
}
}
public class Program
{
public static void Main()
{
Date date1 = new Date(2022, 1, 1);
Date date2 = new Date(2022, 1, 10);
int days = date1.DaysBetween(date2);
Console.WriteLine("Days between date1 and date2: " + days);
}
}
在上面的代码中,我们定义了一个结构体Date
来表示日期,包含年、月、日三个字段。通过在结构体中定义一个方法 DaysBetween
,我们可以计算两个日期之间的天数差。在 Main
方法中,我们创建了两个日期实例,并调用 DaysBetween
方法来计算它们之间的天数差,并将结果打印输出。
3.5 C#中的语句
3.5.3 跳转语句
在循环语句中,如果需要在循环结束之前退出整个循环,你可以使用跳转语句。C#中包含4种跳转语句。
- break 语句:直接退出整个循环。
- continue 语句:立即终止本次循环,但会继续执行下一次循环。
- goto 语句:跳出循环到已标记好的位置上(为了使代码易于阅读和理解,不建议大家使用goto语句退出循环)。
- return 语句:退出循环和循环所在的函数。
下面的代码演示了break 与continue 的区别。你可以通过二者的运行结果理解“终止当前循环”的含义。
// 演示break与continue的区别
class Program
{
static void Main(string[] args)
{
Console.WriteLine("使用continue退出循环的情况:");
for (int i = 0; i < 5; i++)
{
if (i == 2)
{
continue;
}
Console.WriteLine("当前i的值为:{0}",i);
}
Console.WriteLine("使用break退出循环的情况:");
for (int i = 0; i < 5; i++)
{
if (i == 2)
{
break;
}
Console.WriteLine("当前i的值为:{0}", i);
}
Console.Read();
}
}
结果如下:
使用continue推出循环的情况:
当前i的值为:0
当前i的值为:1
当前i的值为:3
当前i的值为:4
使用break退出循环的情况:
当前i的值为:0
当前i的值为:1
在以上代码中,由于continue 语句只退出本次循环,下一次循环仍会执行,所以当i 等于2时,if 的条件表达式为true ,continue 语句生效退出该次循环,i=2 的值没有输出到控制台中。而break 语句是用于退出整个循环的,当i 等于2时,if 的条件得到满足,break 语句生效使循环体不再执行,i=2 、i=3 和i=4 的值都不会被输出到控制台中。
下面代码演示了break和return的区别:
// return与break区别的演示
class Program
{
static void Main(string[] args)
{
Console.WriteLine("使用break退出循序的情况:");
for (int i = 0; i < 5; i++)
{
if (i == 2)
{
break;
}
Console.WriteLine("当前i的值为:{0}", i);
}
Console.WriteLine("循环已退出!");
Console.WriteLine("使用return退出循序的情况:");
for (int i = 0; i < 5; i++)
{
if (i == 2)
{
return;
}
Console.WriteLine("当前i的值为:{0}", i);
}
Console.WriteLine("循环已退出!");
}
}
效果如下:
使用break退出循序的情况:
当前i的值为:0
当前i的值为:1
循环已退出! //使用break, 循环后面的语句执行了,而使用return, 循环后面的语句没有执行
使用return退出循序的情况:
当前i的值为:0
当前i的值为:1
在以上代码中,由于break 只退出了for 循环,所以循环之后的语句会继续执行;而return 则退出了整个Main 函数,for 循环后面的“循环已退出”语句不会输出到控制台窗体中。