C#学习笔记 - C#基础知识 - C#从入门到放弃

C# 持续更新中~~ 上次更新日期:20231215

  • 第1节 C# 简单介绍
    • 1.1 C# 是什么
    • 1.2 C# 强大的编程功能
    • 1.3 C# 发展史
    • 1.4 C#与Java区别
  • 第2节 C#基本语法
    • 2.1 C#程序结构
    • 2.2 C# 结构解析
    • 2.3 命名空间及标识符、关键字
      • 2.3.1 别名的使用
      • 2.3.2 标识符
      • 2.3.3 C#关键字
  • 第3节 变量、常量与数据类型
    • 3.1 C#变量
      • 3.1.1 变量使用
      • 3.1.2 自定义变量
      • 3.1.2 接收用户输入
    • 3.2 C#常量
      • 3.2.1 常量的使用
    • 3.3 C#数据类型
      • 3.3.1 数据类型之值类型
      • 3.3.2 数据类型之引用类型
  • 第4节 表达式和运算符
    • 4.1 表达式 - 操作数与运算符组成
      • 4.1.2 C#中常见的表达式类型:
      • 4.1.2 表达式示例
    • 4.2 运算符
      • 4.2.1 按操作数个数分类
      • 4.2.2 按运算类型分类
      • 4.2.3 对运算符 ++、-- 的使用
      • 4.2.4 关系运算符:>、 < 、>= 、<=、 != 、==
      • 4.2.5 逻辑运算符:&& || ! ^ & |
      • 4.2.6 位运算符:~ 、^、 & 、| 、<<、 >>
      • 4.2.7 条件运算符:表达式1?表达式2:表达式3
    • 4.3 对运算符的综合运用
  • 第5节 流程控制语句
    • 5.1 分支语句
      • 5.1 if 语句
      • 5.2 if...else 语句
      • 5.3 if...else if...else 语句
      • 5.4 switch 语句
    • 5.2 循环语句(迭代语句)
      • 5.2.1 while循环:在条件为真时重复执行一段代码。
      • 5.2.2 do-while循环:先执行一段代码,然后在条件为真时重复执行。
      • 5.2.3 for循环:按照特定的计数器条件重复执行一段代码。
      • 5.2.4 foreach循环:用于遍历集合或数组中的元素。
    • 5.3 跳转语句
      • 5.3.1 break语句:终止循环或switch语句的执行。
      • 5.3.2 continue语句:跳过当前循环迭代,继续执行下一次迭代。
      • 5.3.3 return语句:用于从方法中返回值并停止方法的执行。
      • 5.3.4 goto语句:跳转到指定的标签位置继续执行代码。

上次更新日期:20231215)

第1节 C# 简单介绍

1.1 C# 是什么

C# 的发音为“C Sharp”,是一门由微软开发并获得了 ECMA(欧洲计算机制造商协会)和 ISO(国际标准组织)批准的现代的、通用的、面向对象的编程语言。

C# 之所以能称为一门被广泛应用的编程语言,原因有以下几点:

  • C# 是一种现代的通用的编程语言;
  • C# 是面向对象的; C# 是面向组件的;
  • C# 简单易学;
  • C# 是一种结构化语言;
  • 使用 C# 开发效率很高;
  • C# 可以在各种计算机平台上进行编译;
  • C# 是 .Net Framework 的一部分。

1.2 C# 强大的编程功能

一开始没接触C#的时候,我觉得它可能跟C、C++语言相似,后来发现一点也不像???它与 Java 非常相似,有很多强大的编程功能:

以下是 C# 的一些重要功能的列表:

  • 布尔条件;
  • 自动垃圾回收;
  • 标准库;
  • 组件版本;
  • 属性和事件;
  • 委托和时间管理;
  • 易于使用的泛型;
  • 索引器;
  • 条件编译;
  • 简单的多线程;
  • LINQ 和 Lambda 表达式;
  • 集成 Windows。

借助 C# 编程语言,我们可以开发不同类型且安全可靠的应用程序,例如:
1、桌面应用程序;
2、网络应用程序;
3、分布式应用程序;
4、Web 服务应用程序;
5、数据库应用程序等。

1.3 C# 发展史

C#学习笔记 - C#基础知识 - C#从入门到放弃_第1张图片

1.4 C#与Java区别

C#学习笔记 - C#基础知识 - C#从入门到放弃_第2张图片

第2节 C#基本语法

2.1 C#程序结构

“Hello, World”程序历来都用于介绍编程语言。 下面展示了此程序的 C# 代码:

using System;
using System.Collections.Generic;
//using ...
//以上引用命名空间

namespace _Csharp程序结构
{
    class Program       //Program类
    {
        static void Main(string[] args) //static 静态 void 无返回值 Main 函数 - 程序起点
        {
            Console.WriteLine("Hello Word!");
            Console.ReadKey();
        }
    }
}

//以上命名空间或者项目名称

输出:

Hello, World

“Hello, World”程序始于引用 System 命名空间的 using 指令。 命名空间提供了一种用于组织 C# 程序和库的分层方法。命名空间包含类型和其他命名空间。例如,System 命名空间包含许多类型(如程序中引用的 Console 类)和其他许多命名空间(如 IOCollections)。 借助引用给定命名空间的 using 指令,可以非限定的方式使用作为相应命名空间成员的类型。 由于使用 using 指令,因此程序可以使用 Console.WriteLine 作为 System.Console.WriteLine 的简写。

“Hello, World”程序声明的 Hello 类只有一个成员,即 Main 方法。 Main 方法使用 static 修饰符进行声明。 实例方法可以使用关键字 this 引用特定的封闭对象实例,而静态方法则可以在不引用特定对象的情况下运行。 Main 静态方法是 C# 程序的入口点

程序的输出是由 System 命名空间中 Console 类的 WriteLine 方法生成。 此类由标准类库提供。默认情况下,编译器会自动引用标准类库。

2.2 C# 结构解析

有如下一个C# 程序代码:

using System;
using System.Collections.Generic;
using ...
//以上引用命名空间

namespace _Csharp程序结构
{
    class Program       //Program类
    {
        static void Main(string[] args) 
        //static 静态 void 无返回值 Main 函数 - 程序起点
        {
            Console.WriteLine("Hello Word!");
            Console.ReadKey();
        }
    }
}

//以上命名空间或者项目名称

在次程序中:
1、 using System;
using 关键字用来在程序中引入 System 命名空间,一个程序中可以有多个 using 语句。
2、namespace _Csharp程序结构
namespace 关键字用来声明一个命名空间,“Csharp程序结构”则是命名空间的名字。命名空间是类的集合,上面代码中名为“Csharp程序结构”的命名空间中包含了一个名为“Program”的
3、class Program
class 关键字用来定义一个类,“Program”则是类的名,类中通常用来存放程序中要使用的数据和函数(也叫方法)。
4、static void Main(string[ ] args)
此行代码中,Main 为定义的函数名称,Main 函数是整个 C# 程序的入口,其中包含了程序运行时需要执行的操作。static 和 void 都是用来修饰 Main 函数的关键字,具体含义后面我们会详细介绍。
5、 //static 静态 void 无返回值 Main 函数 - 程序起点
这是程序的注释,当程序运行时被//注释的内容将被编译器忽略,不会执行。注释主要用来对所写的代码进行说明。多行可使用/* */

/*
static 静态 
void 无返回值 
Main 函数 - 程序起点
*/

6、Console.WriteLine(“Hello World!”);
此行代码用来在命令行窗口中输出“Hello World!”。WriteLineSystem 命名空间中定义的 Console 类里面的方法,用来输出一些消息。
7、Console.ReadKey( );
此行代码是针对 VS.NET 用户的,它会使程序进入等待状态,敲击键盘上的任意一个按键即可让程序继续运行。需要这行代码是因为命令行窗口会在程序运行结束后自动关闭,导致要输出的内容一闪而过,加入此行代码则可以避免这种情况。

另外,还有以下几点需要注意:
1、C# 区分大小写;
2、所有语句和表达式都必须以英文的分号;结尾;
3、程序从 Main 函数开始执行;
4、与 Java 不同,程序文件名可以与类名不同;
5、代码中出现的{}都是成对出现的,用来标记代码块,{ }中包裹的代码可以看作是一个整体。

2.3 命名空间及标识符、关键字

2.3.1 别名的使用

使用别名(alias)来为类型或命名空间定义一个新的名称,以简化代码并增强可读性。使用别名可以提供更简洁、易懂的类型或命名空间名称,或者使代码与外部库或组件更加兼容。
别名的使用可以通过以下两种方式来实现:
1、使用using语句:
使用using语句可以在给定的作用域内为类型或命名空间指定一个别名。这通常用于简化对长命名空间的引用。

using System;
using Co = System.Console;
//using ...
//以上引用命名空间

namespace _Csharp程序结构
{
    class Program       //Program类
    {
        static void Main(string[] args) //static 静态 void 无返回值 Main 函数 - 程序起点
        {
            Console.WriteLine("1、这是使用Console输出");
            Co.WriteLine("2、这是使用别名Co输出");
            Co.ReadKey();
        }
    }
}
//以上命名空间或者项目名称

输出结果:

1、这是使用Console输出
2、这是使用别名Co输出

2、使用typedef命令:
在一些特殊情况下,可以使用typedef命令来创建类型别名,这种方式只适用于在BCL(基础类库)中定义的类型。

typedef MyAlias = System.Collections.Generic.List<string>;

// 使用别名创建对象
MyAlias myList = new MyAlias();

// 使用别名调用方法
myList.Add("Hello");

需要注意:
① 别名仅在定义它们的范围内有效,如果使用别名的代码超出了别名的作用域,就需要重新引用完整的类型或命名空间。
② 使用别名可以提高代码的可读性和可维护性,特别是在涉及到长、复杂的类型或命名空间时。但是,在使用别名时应保持适度,确保别名具有明确、清晰的意义,不会与其他代码产生混淆。
③ 不建议定义系统自带的方法、函数等别名。

2.3.2 标识符

标识符是用来为类、变量、函数或任何其他自定义内容命名。C# 中标识符的定义规则如下所示:
1、标识符必须以英文字母开头,后面可以跟英文字母、数字0-9或下划线_
2、标识符中的第一个字符不能是数字
3、标识符中不能包含空格或特殊符号,例如? - + ! @ # % ^ & * ( ) [ ] { } . ; : " ’ / \,但是可以使用下划线_
4、C#区分大小写;
5、标识符不能是 C# 关键字。

2.3.3 C#关键字

C# 中的关键字是编译器预先定义好的一些单词,也可以称为保留字或者保留标识符,这些关键字对编译器有特殊的意义,不能用作标识符。但是,如果非要使用的话只需要在关键字前面加上@前缀即可:如@if就是一个有效的标识符,而if则是一个关键字
下图列出了 C# 中的保留关键字(Reserved Keywords)和上下文关键字(Contextual Keywords):
C#学习笔记 - C#基础知识 - C#从入门到放弃_第3张图片

第3节 变量、常量与数据类型

3.1 C#变量

变量可以理解为是我们程序可以操作的内存区域的名称,在 C# 中每个变量都有自己特定的类型,这个类型确定了变量所占内存的大小、布局、取值范围以及可以对该变量执行的操作。
可以将变量当作一种通过符号(变量名)表示某个内存区域的方法,变量的值可以更改,并且可以多次重复使用。C# 中的基本变量类型可以归纳为以下几种:

类型 变量名称
整型(整数类型) sbyte、byte、short、ushort、int、uint、long、ulong、char
浮点型 float、double
十进制类型 decimal
布尔型 true、false
空类型 可为空值的数据类型

3.1.1 变量使用

1、声明变量
2、初始化变量(变量赋值)
3、变量使用

3.1.2 自定义变量

使用如下:

int a;	//double b;
a = 23;	//b = 3.14;
Console.WriteLine(a);
Console.ReadKey();	//停留弹窗

3.1.2 接收用户输入

代码如下:

Console.WriteLine("输入一个整数:");
int a = int.Parse(Console.ReadLine());
Console.WriteLine("你输入的数是:"+a); 
Console.ReadKey();	//停留弹窗

运行结果:

输入一个整数:
23
你输入的数是:23

在上述代码中,int.Parse( )函数用于将字符串转换为整数类型(int)。它接受一个表示整数的字符串参数,并返回对应的整数值。因为C#默认用户输入的数据是字符串类型(string),需要使用int.Parse( )函数进行转换。
使用int.Parse( )函数需要注意以下几点:
1、字符串必须包含有效的整数表示。
2、如果字符串无法解析为整数,则会抛出FormatException异常。
3、转换结果的范围应该在int类型的表示范围内,否则会抛出OverflowException异常。

除了int.Parse( )函数,C#还提供了其他类似的类型转换方法,比如double.Parse( )用于将字符串转换为双精度浮点数,bool.Parse( )用于将字符串转换为布尔值等。
这些方法在处理类型转换时非常有用,但要确保字符串的格式与目标类型匹配,以避免转换错误。

3.2 C#常量

常量和《变量》类似,唯一不同的是常量的值在程序的编译阶段就已经确定了,而且在程序的运行期间不允许修改。常量可以是任何基本数据类型,如整数常量、浮点常量、字符串常量等等。

常量在程序中用于存储不可变的数值、字符串,或者其他类型的数据。使用常量的好处在于可以提高代码的可读性和可维护性,并且在编译时会进行常量优化,减少运行时的开销。

3.2.1 常量的使用

1、声明常量 - const
2、初始化常量(常量赋值)
3、常量使用
【示例】计算圆的周长和面积。

 const double pi = 3.14;
 double r = 5;
 Console.WriteLine("此圆的周长是:"+2*pi*r);
 Console.WriteLine("此圆的面积是:"+pi*r*r);
 Console.ReadKey();	//停留弹窗

运行程序:

此圆的周长是:31.4
此圆的面积是:78.5

需要注意: 常量只能在声明时进行初始化,并且初始化值必须是一个编译时可确定的常量表达式。常量不能在运行时修改,并且不能重复赋值。

使用常量可以提高程序的可读性和可维护性,特别在使用固定值的时候,可以减少魔法数字的出现。魔法数字是未经解释和命名的硬编码值,使用常量可以将这些值集中起来管理,提高代码的可靠性和可维护性。

3.3 C#数据类型

C#中,数据类型可以分为值类型(value types)和引用类型(reference types)。值类型直接存储数据的值,而引用类型存储数据的地址。

3.3.1 数据类型之值类型

C#中常见的值类型:
1、数值类型:
整数类型:sbyte, byte, short, ushort, int, uint, long, ulong。
浮点类型:float, double, decimal。
2、布尔类型:
bool:表示逻辑值的类型,只能取值true或false。
3、字符类型:
char:表示单个字符的Unicode字符。
4、枚举类型:
enum:用户定义的枚举类型,用于定义一组命名的常量值。
5、结构体类型(struct):
struct:用户定义的结构类型,用于封装多个相关的值。

需要注意:
1、值类型的特点是存储在栈上,比较高效,适用于存储较小的数据和简单的数值计算。在使用值类型时,注意数据的大小和范围是否满足需求,并且可以避免不必要的副本创建,以提高性能。
2、值类型在内存中分配空间并直接存储数据的值,因此它们通常具有大小已知的固定内存布局。值类型的赋值和参数传递是按值传递的,即复制整个值。这意味着在对值类型进行操作时,操作的是它们的副本,而不是原始值本身。

3.3.2 数据类型之引用类型

C#中,引用类型(reference types)是一种存储对数据对象的引用的数据类型。引用类型的变量存储了对象在内存中的地址,而不是直接存储对象的数据。

C#中常见的引用类型:
1、类类型(class):
class:用户定义的类类型,用于封装数据和方法。
2、字符串类型:
string:用于表示一个或多个字符的字符串。
3、数组类型:
数组(array):用于存储相同类型的元素的集合。
4、接口类型(interface):
interface:定义了一组方法和属性的类型,用于实现多态性。
5、委托类型(delegate):
delegate:用于定义方法的委托类型。

需要注意:
1、引用类型的变量存储的是指向实际数据对象的引用(地址),而不是直接存储数据的值。多个引用变量可以引用同一个数据对象,因此可以在不同的地方操作和修改同一个对象。引用类型的赋值和参数传递是按引用传递的,即传递引用而不是复制整个对象。
2、引用类型的特点是存储在堆上,并且具有动态分配和释放内存的能力。引用类型适合存储复杂的数据结构和大量数据。在使用引用类型时,需要注意空引用的可能性和内存管理的问题,确保值的正确性和安全性。

第4节 表达式和运算符

4.1 表达式 - 操作数与运算符组成

C#中,表达式(expression)是由操作数(operands)和操作符(operators)组成的代码片段,用于计算值。表达式可以是简单的算术运算,也可以是复杂的逻辑判断或函数调用。
表达式在程序中代码中用于计算值、进行逻辑判断、执行函数调用、进行赋值等操作。表达式的结果可以是常量、变量或其他表达式的计算结果。

4.1.2 C#中常见的表达式类型:

1、算术表达式:

加法表达式:a + b
减法表达式:a - b
乘法表达式:a * b
除法表达式:a / b
取余表达式:a % b

2、关系表达式:

等于表达式:a == b
不等于表达式:a != b
大于表达式:a > b
小于表达式:a < b
大于等于表达式:a >= b
小于等于表达式:a <= b

3、逻辑表达式:

逻辑与表达式:a && b
逻辑或表达式:a || b
逻辑非表达式:!a

4、条件表达式:

条件表达式:condition ? trueValue : falseValue

5、赋值表达式:

赋值表达式:a = b
复合赋值表达式:=+, =-, =*, /=, ...

6、函数调用表达式:

函数调用表达式:function(arg1, arg2, ...)

7、成员访问表达式:

成员变量访问表达式:object.member
成员方法调用表达式:object.Method()

8、数组和索引访问表达式:

数组元素访问表达式:array[index]

4.1.2 表达式示例

【示例】按照提示的信息输入,最后系统会打印到屏幕。

Console.WriteLine("请输入您的姓名:");  //输出
string Name = Console.ReadLine();
Console.WriteLine("请输入您的性别:");
string Gender = Console.ReadLine();
Console.WriteLine("请输入您的年龄:");
string Age = Console.ReadLine();
Console.WriteLine("您好,{0}!您是{1}生,您的年龄是{2}岁", Name, Gender, Age);
Console.ReadKey();
//Console.WriteLine("");中双引号中内容可原样输出,但是转义字符以及索引号{i}除外

运行程序:

请输入您的姓名:
程饱饱吃的好饱
请输入您的性别:
男
请输入您的年龄:
24
您好,程饱饱吃的好饱!您是男生,您的年龄是24

4.2 运算符

4.2.1 按操作数个数分类

C#中,运算符可以根据其操作数的个数分为一元二元三元运算符。
1、一元运算符(Unary Operators)
一元运算符只操作一个操作数,有以下常用:
递增运算符 (++), 递减运算符 (–), 正号运算符 (+), 负号运算符 (-), 逻辑非运算符 (!), 位取反运算符 (~) 等。

2、二元运算符(Binary Operators)
二元运算符操作两个操作数,有以下常用:
算术运算符 (+, -, *, /, %), 关系运算符 (==, !=, >, <, >=, <=), 逻辑与运算符 (&&), 逻辑或运算符 (||), 位与运算符 (&), 位或运算符 (|), 位异或运算符 (^), 左移运算符 (<<), 右移运算符 (>>) 等。

3、三元运算符(Ternary Operators)
三元运算符操作三个操作数,C#中仅有一个:
条件运算符 (condition ? trueValue : falseValue)。

4.2.2 按运算类型分类

1、算术运算符:

加法运算符:+
减法运算符:-
乘法运算符:*
除法运算符:/
取余运算符:%

2、关系运算符:

相等运算符:==
不相等运算符:!=
大于运算符:>
小于运算符:<
大于等于运算符:>=
小于等于运算符:<=

3、逻辑运算符:

逻辑与运算符:&&
逻辑或运算符:||
逻辑非运算符:!

4、赋值运算符:

简单赋值运算符:=
复合赋值运算符:+=, -=, *=, /=, %=

5、位运算符:

按位与运算符:&
按位或运算符:|
按位异或运算符:^
按位取反运算符:~
左移运算符:<<
右移运算符:>>

6、条件运算符:

条件表达式运算符:?:

7、成员访问和索引运算符:

成员访问运算符:.
索引访问运算符:[ ]

8、递增和递减运算符:

递增运算符:++
递减运算符:--

【示例】输入语文和数学成绩,打印出总成绩。
程序如下:

Console.WriteLine("请输入语文成绩:");  //输出
double Chinese = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("请输入数学成绩:");
double Math = Convert.ToDouble(Console.ReadLine());
//Convert.ToDouble - 类型转换
//Console>ReadLine();默认是string类型,但是我们声明的变量是double类型,在接收到数据后需要转换类型
Console.WriteLine("你的总成绩是{0}", Chinese + Math);
Console.ReadKey();

执行程序:

请输入语文成绩:
86
请输入数学成绩:
93
你的总成绩是179

4.2.3 对运算符 ++、-- 的使用

++在前,先加再用;++在后,先用后加。(-- 相同)
程序代码:

int var1, var2, var3;
var1 = 2;
Console.WriteLine("var1的值是"+var1);
var2 = var1++;  //先用后加,var2=2,var1=3
Console.WriteLine("var2的值是{0},此时var1的值是{1}" , var2,var1);
var3 = ++var1;	//先加后用,var1=3+1=4,var3=4
Console.WriteLine("var3的值是{0},此时var1的值是{1}" ,var3, var1);
//提示:var1没有重新赋过值,并且一直在使用
Console.ReadKey();

运行程序:

var1的值是2
var2的值是2,此时var1的值是3
var3的值是4,此时var1的值是4

4.2.4 关系运算符:>、 < 、>= 、<=、 != 、==

运算后的结果是布尔值bool,true或者false
关系运算符的运算规则:
① 操作数为数值类型,则比较两个数的大小;
② 操作数为字符类型,则比较两个字符串的Unicode编码大小;
③ 操作数为i盎格字符串,则只能用==或者!=,只能比较字符串各个位字符是否相同

4.2.5 逻辑运算符:&& || ! ^ & |

逻辑符 结果
& & 全true为true
ll 有true为true
取反!true=false;!false=true
^ 有且只有一个true为true
& 全true为true
l 有true为true

在运用逻辑运算符表达式中需要注意运算优先级及运算特性,一下程序为例:

int a = 10;
int b = 15;
Console.WriteLine((10 == a++) || (16 == b--));      //结果为 True
Console.WriteLine("a的值为{0},b的值为{1}", a, b); //a=11,b=15
//在||运算后当前面一个表达式为true就不会运算后面表达式,b--没有执行,b=15
Console.ReadKey();

运行程序:

True
a的值为11,b的值为15

结果可见,b的值未发生变化,这是因为在 || 运算后当前面一个表达式为true就不会执行运算后面表达式,所以 b-- 不会被执行。

4.2.6 位运算符:~ 、^、 & 、| 、<<、 >>

运算符 结果
~ 按位取反
l 有1为1
& 全1为1
^ 异或:有且仅有一个1为1
<< var3 = var1 << var2 将var1d的值左移var2位赋值给var3
>> var3 = var1 >> var2 将var1d的值右移var2位赋值给var3

如果对十进制数字进行位运算符,需要将其转为二进制数据计算后在转为十进制结果。

【示例】5 & 4 =?
5的二进制表示:101
4的二进制表示:100
5 & 4的结果位:100 即为4

【示例】4 << 1 =?(左移乘2)
4 的二进制表示:100
左移一位后表示:1000 即为8

【示例】4 >> 1 =?(右移除2)
4 的二进制表示:100
右移一位后表示:010 即为2

4.2.7 条件运算符:表达式1?表达式2:表达式3

【示例】根据输入的数量,判断输出输出语句“I have 数量 pen(s)”。
程序代码:

//输出语句“I have 数量 pen(s)”
Console.WriteLine("输入拥有的钢笔数量:");
int qty = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("I have {0} pen{1}", qty, qty > 1 ? "s" : "");
Console.ReadKey();

运行程序:

输入拥有的钢笔数量:
1
I have 1 pen

输入拥有的钢笔数量:
5
I have 5 pens

4.3 对运算符的综合运用

【示例】计算1232855秒是几天几小时几分几秒。
程序代码:

int time = 1232855;
int day = time / (24 * 3600);
int hour = time % (24 * 3600) / 3600;
int min = time % 3600 / 60;
int sec = time % 60;
Console.WriteLine("{0}秒是{1}天{2}小时{3}分种{4}秒", time, day, hour, min, sec);
Console.ReadKey();

运行结果:

1232855秒是146小时27分种35

第5节 流程控制语句

5.1 分支语句

5.1 if 语句

if 语句用于条件判断,其中包含一个布尔表达式,后面跟随着若干要执行的代码,当布尔表达式为真时,后面跟随的代码就会执行,if 语句的语法格式如下:

if(布尔表达式){
    要执行的代码;
}

if 语句流程图:
C#学习笔记 - C#基础知识 - C#从入门到放弃_第4张图片
【示例】判断一个数是否为偶数

int num = 12;
if (num % 2 == 0)
{
	Console.WriteLine("num的值为偶数");
	//Console.ReadKey();
}
Console.ReadKey();

执行结果:

num的值为偶数

但是当num的值为奇数时,屏幕不会有任何提示,若想打印提示,可以使用if…else语句。

5.2 if…else 语句

if else 语句同样用于条件判断,它比 if 语句中多出了一个 else 语句,当布尔表达式为假时,执行 else 语句块中的代码,语法格式如下所示:

if(布尔表达式){
    表达式为真时要执行的代码;
}else{
    表达式为假时要执行的代码;
}

if else 语句的执行流程如下图所示:
C#学习笔记 - C#基础知识 - C#从入门到放弃_第5张图片
【示例】用户输入一个数,打印出其偶数性。
程序代码:

Console.WriteLine("输入一个整数:");
int num = int.Parse(Console.ReadLine());
if (num % 2 == 0)
{
	Console.WriteLine("num的值为{0},它是偶数",num);
}
else
{
	Console.WriteLine("num的值为{0},它是奇数",num);
}
Console.ReadKey();

运行程序:

输入一个整数:
45
num的值为45,它是奇数

输入一个整数:
22
num的值为22,它是偶数

5.3 if…else if…else 语句

if else if 语句其实就是一个 if 语句后面跟随着若干个 else if else 语句,语句中可以包含多个条件表达式,程序会依次判断这些条件表达式,当条件表达式为真时则执行后面语句块中的代码,如果没有为真的条件表达式则执行 else 语句块中的代码,其语法格式如下所示:

if(布尔表达式 1){
    布尔表达式 1 为真时要执行的代码;
}else if(布尔表达式 2){
    布尔表达式 2 为真时要执行的代码;
}else if(布尔表达式 3){
    布尔表达式 3 为真时要执行的代码;
}
...
else{
    当所有布尔表达式都为假时要执行的代码;
}

需要注意的是,当布尔表达式为真,且成功执行它后面语句块中的代码后,会跳出 if else if 语句,语句中的其它部分不会再被执行。
if else if 语句的执行流程如下图所示:
C#学习笔记 - C#基础知识 - C#从入门到放弃_第6张图片
【示例】
程序代码:

Console.WriteLine("请输入1-7判断是星期几:");
int week = int.Parse(Console.ReadLine());
//int.Parse用于将屏幕输入的语句转换为整型
if (week == 1)
	Console.WriteLine("星期一");
else if (week == 2)
	Console.WriteLine("星期二");
else if (week == 3)
	Console.WriteLine("星期三");
else if (week == 4)
	Console.WriteLine("星期四");
else if (week == 5)
	Console.WriteLine("星期五");
else if (week == 6)
	Console.WriteLine("星期六");
else if (week == 7)
	Console.WriteLine("星期日");
else
	Console.WriteLine("输入数值非1-7,重新输入");
Console.ReadKey();

执行程序:

请输入1-7判断是星期几:
5
星期五

请输入1-7判断是星期几:
9
输入数值非1-7,重新输入

5.4 switch 语句

switch 语句类似于if else if 语句,都可以根据表达式执行某个的语句块,其语法格式如下:

switch(表达式){
    case value1:
    //表达式的值为 value1 时,要执行的代码
        break;
    case value2:
    //表达式的值为 value2 时,要执行的代码
        break;
    case value3:
    //表达式的值为 value3 时,要执行的代码
        break;
    ... ...
    default:
    //没有与表达式相匹配的值时,要执行的代码
        break;
}

使用 switch 语句时必须遵守以下规则:

① switch 语句中表达式的值必须是一个整型或者枚举类型;
② 在一个 switch 语句中可以有任意数量的 case 语句,每个case 关键字后面要跟一个与表达式比较的值和一个冒号;
③ case 关键字后面的值必须与 switch中表达式的值具有相同的数据类型,并且必须是一个常量(也可以理解为是一个固定的值,不会随程序的运行发生改变);
④ 当表达式的值等于 case中的值时,就会执行 case 后面的语句,在遇到 break 关键字时停止;
⑤ 当遇到 break 关键字时,switch语句会停止运行,并跳转到 switch 语句以外的下一行代码继续运行;
⑥ 并不是每一个 case 语句后面都需要包含 break关键字,如果 case 语句为空(case 语句后面没有要执行的代码),则可以不包含 break 关键字,这时程序会继续执行后续的 case语句,直至遇到 break 关键字为止;
⑦ C# 不允许从一个 case 语句连续执行到下一个 case 语句,因此如果 case语句中包含要执行的语句,就必须包含 break 关键字或其他跳转语句;
⑧ 一个 switch 语句的末尾可以有一个可选的default(默认选项),当所有 case 语句都不能与表达式相匹配时则会执行 default 部分中的代码,而且 default 中的break 语句可以省略;

switch 语句的执行流程如下图所示:
C#学习笔记 - C#基础知识 - C#从入门到放弃_第7张图片
【示例】根据用户输入的月份,判断2023年这个月份的天数。
程序代码:

            //判断2023年每个月份的天数
            //31天:1 3 5 7 8 10 12
            //30天:4 6 9 11
            //28天:2

            Console.WriteLine("请输入1-12判断月份天数:");
            int month = int.Parse(Console.ReadLine());
            //int.Parse用于将屏幕输入的语句转换为整型
            switch (month)
            {

                case 2: Console.WriteLine("本月有28天"); break;
                case 4:
                case 6:
                case 9:
                case 11:
                    Console.WriteLine("本月有30天"); break;
                default:
                    Console.WriteLine("本月有31天"); break;
            }
            Console.ReadKey();

运行程序:

请输入1-12判断月份天数:
2
本月有28天

请输入1-12判断月份天数:
12
本月有31

5.2 循环语句(迭代语句)

5.2.1 while循环:在条件为真时重复执行一段代码。

while 循环用于多次迭代一部分程序,特别是在迭代的次数不固定的情况下,建议使用 while 循环而不是 for 循环。while 循环的语法格式如下所示:

while(表达式){
    循环主体;         // 要执行的代码
}

需要注意的是,如果循环条件一开始就为false,那么循环体中的代码将不会执行,循环会被跳过。使用while循环时,需要注意确保在一定条件下循环终止,以避免无限循环。同时,需要适当地更新循环条件,使循环朝着正确的方向进行。其中,循环主体可以是一个单独的语句,也可以是多条语句组成的代码块,当表达式的为真时,循环会一直执行下去。

while 循环的执行流程如下图所示:
C#学习笔记 - C#基础知识 - C#从入门到放弃_第8张图片
【示例】计算1+2+3+…+99+100的和。
程序代码:

            int i = 1;
            int sum = 0;
            while (i < 101) {
                sum += i;
                i++;
            }
            Console.WriteLine("1-100的和是"+sum);
            Console.ReadKey();

运行程序:

1-100的和是5050

5.2.2 do-while循环:先执行一段代码,然后在条件为真时重复执行。

do-while 循环是一种迭代语句,类似于 while 循环,它在循环体执行后检查条件是否为真。如果条件为真,则重复执行循环体,直到条件为假。
do-while 循环的语法格式如下:

do
{
    // 循环体代码
}
while (condition);

语法说明:
① condition 是一个布尔表达式,表示循环继续执行的条件。循环体先执行一次,然后检查条件。如果条件为真,则继续重复执行循环体;如果条件为假,则循环终止。
② 需要注意的是,do-while 循环至少会执行一次循环体代码,即使条件一开始就为假。这与 while 循环的行为有所不同,因为 while 循环会在开始之前检查条件。
③ 在使用 do-while 循环时,要确保能在循环体内改变条件,确保循环有终止的机制,以避免出现无限循环。同时,根据实际情况,可以根据循环体的执行结果来决定是否继续循环。

【示例1】计算1+2+3+…+99+100的和。
程序代码:

            int i = 1;
            int sum = 0;
            do
            {
                sum += i;
                i++;
            } while (i < 101);
            Console.WriteLine("1-100的和是"+sum);
            Console.ReadKey();

运行程序:

1-100的和是5050

【示例2】输入本金、利率和期待收益,计算多少年可以完成期待收益。
程序代码:

            //银行存款问题
            double Balance = 0;
            double Rate = 0;
            int Year = 0;
            double TargetBalance = 0;
            Console.WriteLine("请输入存款本金:");
            Balance = double.Parse(Console.ReadLine());
            Console.WriteLine("请输入当前利率百分比:");
            Rate = double.Parse(Console.ReadLine()) / 100;
            Console.WriteLine("请输入目标收益:");
            //验证输入有效性
            do
            {
                TargetBalance = double.Parse(Console.ReadLine());
                if (TargetBalance <= Balance)
                    Console.WriteLine("Eorr:目标收益小于等于本金!重新输入目标收益:");
                    
            } while (TargetBalance <= Balance);

            do
            {
                Balance *= (Rate + 1);
                Year++;
            } while (Balance < TargetBalance);
            Console.Write("将会在{0}年内,达到收益{1}元。", Year, Balance);
            Console.ReadKey();
        }

运行程序:

请输入存款本金:
50000
请输入当前利率百分比:
2.5
请输入目标收益:
48000
Eorr:目标收益小于等于本金!重新输目标收益:!
55000
将会在4年内,达到收益55190.64453125元。

5.2.3 for循环:按照特定的计数器条件重复执行一段代码。

for 循环是一种常见的迭代语句,用于在特定的计数器条件下重复执行一段代码。for 循环由三个部分组成:初始化部分、循环条件和迭代部分。

for 循环的语法格式如下:

for (initialization; condition; iteration)
{
    // 循环体代码
}

语法说明:

① initialization 是在循环开始之前执行的初始化语句,用于初始化循环计数器或其它变量。
② condition 是一个布尔表达式,表示循环继续执行的条件。只要条件为真,循环体就会继续执行;一旦条件为假,循环终止。
③ iteration 是在每次循环迭代之后执行的语句,用于更新循环计数器或变量。

for 循环的执行流程如下图所示:
C#学习笔记 - C#基础知识 - C#从入门到放弃_第9张图片
【示例1】计算用户输入的数求其阶乘值。
程序代码:

            //for循环求阶乘
            //1!=1 2!=2*1 3!=3*2*1
            Console.WriteLine("输入要求的阶乘数值:");
            int a = int.Parse(Console.ReadLine());
            int jc = 1;
            for (int i = 1; i <= a; i++)
            {
                jc *= i;
            }
            Console.WriteLine("{0}!的结果是:{1}", a, jc);
            Console.ReadKey();
        }

运行程序:

输入要求的阶乘数值:
6
6!的结果是:720

【示例2】打印一个九九乘法表。
程序代码:

            Console.WriteLine("=========================九九乘法表==========================");
            for (int i = 1; i <= 9; i++)
            {
                for (int j = 1; j <= i; j++)
                {
                    Console.Write("{0}*{1}={2} ", j, i, i * j);
                    if (i * j < 10)
                        Console.Write(" ");
                }
                Console.WriteLine("");
            }
            Console.WriteLine("==============================================================");
            Console.ReadKey();

执行程序:

=========================九九乘法表==========================
1*1=1
1*2=2  2*2=4
1*3=3  2*3=6  3*3=9
1*4=4  2*4=8  3*4=12 4*4=16
1*5=5  2*5=10 3*5=15 4*5=20 5*5=25
1*6=6  2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7  2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8  2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9  2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
==============================================================

5.2.4 foreach循环:用于遍历集合或数组中的元素。

foreach 循环用于遍历集合或数组中的元素,它可以自动迭代集合中的每个元素,而无需手动控制迭代器或索引。foreach 循环提供了一种简洁和直观的方式来遍历集合。

foreach 循环的语法格式如下:

foreach (var item in collection)
{
    // 循环体代码
}

语法说明:

① item 是用于表示集合中当前元素的变量,在每次迭代中被赋值为集合中的下一个元素。
② collection 是要遍历的集合,可以是数组、列表、字典等可枚举的数据结构。在每次迭代中,item 变量被赋值为集合中的下一个元素,直到遍历完所有元素为止。
③ 以下是一个示例,展示了使用 foreach 循环遍历数组中的元素并求和的例子:
④ 要注意foreach 循环只用于遍历集合或数组,不提供对集合中元素的修改操作。如果需要修改集合中的元素,可以使用传统的 for 循环或其他方式进行操作。

【示例】用户输入一个语句,根据空格剪切出单词换行输出。
程序代码:

            Console.WriteLine("输入一个语句:");
            string str = Console.ReadLine();
            foreach (char word in str)
            {
                if (char.IsWhiteSpace(word))
                {
                    Console.WriteLine();    //仅换行
                }
                else
                {
                    Console.Write(word);    //遇到空格前不换行输出
                }
            }
            Console.ReadKey();

运行程序:

输入一个语句:
my name is flyer.cheng nice to meet you !
my
name
is
flyer.cheng
nice
to
meet
you
!

5.3 跳转语句

5.3.1 break语句:终止循环或switch语句的执行。

break 语句在前面switch 语句的时候已经有了简单的了解,它不仅可以用来终止 switch 语句,在循环语句中使用时还可以用来跳出循环,执行循环外的下一条语句。
如果是在嵌套循环中使用,例如在内层的循环中使用 break 语句,那么程序只会跳出内层的循环,并不会影响到外层循环的执行。
break 语句的执行原理如下图所示:
C#学习笔记 - C#基础知识 - C#从入门到放弃_第10张图片

【示例】输出1-100的数字,每行10个,同时为3、4、5的倍数时退出循环并提示。
程序代码:

            //输出1-100的数字,每行10个,同时为3、4、5的倍数时退出
            Console.WriteLine("输出1-100的数字,每行10个,同时为3、4、5的倍数时退出:");
            for (int i = 1; i < 101; i++)
            {
                if ((i % 3 == 0) && (i % 4 == 0) && (i % 5 == 0))
                {
                    Console.WriteLine( );
                    Console.WriteLine("3、4、5公倍数倍数是{0},此时跳出循环。",i);
                    break;
                }
                   
                if (i % 10 == 0)
                    Console.WriteLine(i);
                else
                {
                    if (i < 10)
                        Console.Write(" " + i + " ");
                    else
                        Console.Write(i + " ");
                }

            }
            Console.ReadKey();

运行程序:

输出1-100的数字,每行10个,同时为345的倍数时退出:
 1  2  3  4  5  6  7  8  9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50
51 52 53 54 55 56 57 58 59
345公倍数倍数是60,此时跳出循环。

5.3.2 continue语句:跳过当前循环迭代,继续执行下一次迭代。

continue 语句的工作原理与 break 语句类似,但是 continue 语句并不会跳出整个循环,而是跳过本次循环继续执行下一次的循环。
continue 的执行原理如下图所示:
C#学习笔记 - C#基础知识 - C#从入门到放弃_第11张图片
【示例】输出1-100的数字,每行10个,同时为3、4的倍数时跳过,用**取代。
程序代码:

            //输出1-100的数字,每行10个,同时为3、4的倍数时跳过,用**取代
            Console.WriteLine("输出1-100的数字,每行10个,同时为3、4的倍数时跳过:");
            for (int i = 1; i < 101; i++)
            {
                if ((i % 3 == 0) && (i % 4 == 0)) //&&(i % 5 == 0)
                {
                    if (i % 10 == 0)
                        Console.WriteLine("**" + " ");
                    else
                        Console.Write("**" + " ");
                    continue;
                }
                if (i % 10 == 0)
                    Console.WriteLine(i);
                else
                {
                    if (i < 10)
                        Console.Write(" " + i + " ");
                    else
                        Console.Write(i + " ");
                }

            }
            Console.ReadKey();

运行程序:

输出1-100的数字,每行10个,同时为34的倍数时跳过:
 1  2  3  4  5  6  7  8  9 10
11 ** 13 14 15 16 17 18 19 20
21 22 23 ** 25 26 27 28 29 30
31 32 33 34 35 ** 37 38 39 40
41 42 43 44 45 46 47 ** 49 50
51 52 53 54 55 56 57 58 59 **
61 62 63 64 65 66 67 68 69 70
71 ** 73 74 75 76 77 78 79 80
81 82 83 ** 85 86 87 88 89 90
91 92 93 94 95 ** 97 98 99 100

5.3.3 return语句:用于从方法中返回值并停止方法的执行。

跳转语句 return 用于在方法中提前返回结果并终止方法的执行。当使用 return 语句时,程序会立即退出当前方法,并返回指定的值(如果有)给调用者。

return 语句的用法有3种:返回一个值;无返回值;提前终止方法;

说明:
return用法:退出整个main函数
return语句只能出现在方法当中,当调用方法时,执行到return语句时,直接跳转到Main( )函数。
return 语句终止它出现在其中的方法的执行并将控制返回给调用方法。它还可以返回一个可选值。
④ 如果方法为 void 类型,则可以省略 return 语句

【示例】(有返回值)输入三个数,求平均值。
程序代码:

using System;
namespace return语句
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("输入三个数求平均值");
            Console.WriteLine("输入第一个数:");
            int num1 = int.Parse(Console.ReadLine());
            Console.WriteLine("输入第二个数:");
            int num2 = int.Parse(Console.ReadLine());
            Console.WriteLine("输入第三个数:");
            int num3 = int.Parse(Console.ReadLine());

            double avg = fun_avg(num1,num2,num3);
            Console.WriteLine("三个数的平均值是:" + avg);
            Console.ReadKey();
        }
		//1、return有返回值时
        static double fun_avg(int a,int b,int c) {
            return (a+b+c) / 3;
        }

    }
}

运行程序:

输入三个数求平均值
输入第一个数:
37
输入第二个数:
29
输入第三个数:
42
三个数的平均值是:36

【示例】(无返回值)输入三个数,求平均值。
程序代码:

using System;
namespace return语句
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("输入三个数求平均值");
            Console.WriteLine("输入第一个数:");
            int num1 = int.Parse(Console.ReadLine());
            Console.WriteLine("输入第二个数:");
            int num2 = int.Parse(Console.ReadLine());
            Console.WriteLine("输入第三个数:");
            int num3 = int.Parse(Console.ReadLine()); 
            fun_avg(num1,num2,num3);
            Console.ReadKey();
        }
        //2、return不带返回值时
        static void fun_avg(int a, int b, int c)
        {
            Console.WriteLine("三个数的平均值是:{0}", (a + b + c) / 3);
            return;
        }
    }
}

运行程序:

输入三个数求平均值
输入第一个数:
19
输入第二个数:
53
输入第三个数:
48
三个数的平均值是:40

程序说明:
return语句只能出现在方法当中,当调用方法时,执行到return语句时,直接跳转到Main( )函数。

5.3.4 goto语句:跳转到指定的标签位置继续执行代码。

你可能感兴趣的:(学习笔记,c#,c++,java,开发语言)