Learning Hard C# 学习笔记: 3.C#语言基础

发布时间 2023-10-05 11:26:39作者: ErgoCogito

前言

由于最近工作开始重新使用了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 循环后面的“循环已退出”语句不会输出到控制台窗体中。