# 概要
本部分主要包括:
- 分支语句
- 循环语句
- 输入输出语句
- 命名空间概念
- 语句练习
# 分支
# 三元运算符
其格式为:
<条件> ? <如果真返回的结果> : <如果假返回的结果>
示例
string resultStr= integer < 10 ? "< 10" : " >= 10";
2
3
4
# if语句
其格式为:
if(条件){
条件为真时执行的代码
}
if(条件){
条件为真时执行的代码
}else{
条件为假时执行的代码
}
2
3
4
5
6
7
8
9
如果执行代码只有一行时,可以省略括号。
# switch语句
static void Main(string[] args)
{
int a = 1;
int b = 2;
int result=0;
char operation = '+';
switch (operation)
{
case '+':
result = a + b;
goto case '*';
case '-':
result = a - b;
break;
case '*':
case '/':
result = a / b;
break;
default:
Console.WriteLine("there is no this operation!");
break;
}
WriteLine(result);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
注意上面的示例case '+',如果没有goto语句会发生编译错误,它不像C++可以运行完一个case语句,进入下一个语句,如果希望两种情况执行一个代码块,可以先像上面case '*'。
# switch进行模式匹配
上面switch case是基于特定变量的值,C# 7中可以基于变量的类型在switch case中进行模式匹配,看下面实例:
public static void Main(string[] args)
{
string strS = "welcome";
string[] strVal = { "hello", "world!", strS, null };
int intS = 10;
int?[] intVal = { 1, 0, intS, null };
foreach (var strOne in strVal)
{
switch (strOne)
{
case string s when s.Length == 5:
Console.WriteLine("this is a string value with 5 size!");
break;
case null:
Console.WriteLine("this is a null value!");
break;
default:
Console.WriteLine("other value!");
break;
}
}
foreach (var intOne in intVal)
{
switch (intOne)
{
case 0:
Console.WriteLine("this is a zero int value!");
break;
case int value:
Console.WriteLine($"this is a int value:{intOne}");
break;
case null:
Console.WriteLine("this is a null value!");
break;
default:
Console.WriteLine("other value!");
break;
}
}
}
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
注意上面intVal声明中的?,这个问号让编辑器知道这个数组可包含空对象,否则会显示编译异常。注意C# 7.0 switch是需要只针对整型或字符串或者某个类型的,C#高版本可支持泛型。
# 循环
循环是重复执行的语句,在这方面充分体现了计算机的优越性,来看下它的几种循环。
# do循环
do循环至少执行一遍循环体,当while里的条件语句为false时退出循环。注意while后面一定要有分号,否则编译错误。
static void Main(string[] args)
{
int i = 0;
do
{
i++;
Console.WriteLine(i);
} while (i < 10);
}
2
3
4
5
6
7
8
9
现在随机猜一个1到100的数,每次提示你所猜的数是大于该数还是小于该数,直到猜对:
static void randomguess()
{
Random random = new Random();
int randomnumber = random.Next(1, 101);//左等右不等
int userinput = 0;
int times = 1;
do
{
Console.WriteLine("{0}st time,Input a number :", times++);
userinput = int.Parse(Console.ReadLine());
if (userinput < 1 || userinput > 100)
Console.WriteLine("your number is out of range!");
else
{
if (userinput < randomnumber)
Console.WriteLine("your number is lower than target!");
if (userinput > randomnumber)
Console.WriteLine("your number is bigger than target!");
}
} while (userinput != randomnumber);
Console.WriteLine("you got the correct answer,your input:{0},random number:{1}", userinput, randomnumber);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# while循环
while循环和do循环很相似,但有一个重要的区别:while循环中的布尔测试在循环开始时进行,而不是最后进行。如果条件为false就不会执行循环。
static void Main(string[] args)
{
int i = 0;
while (i < 10)
{
i++;
Console.WriteLine(i);
}
}
2
3
4
5
6
7
8
9
下面假设一个球落地,每次高度都是之前的二分之一,问当该球的高度低于指定高度时,问这是它的第几次弹跳,一共的弹跳距离是多少:
static void balldrop(decimal height, decimal heightlim)
{
int i = 1;
decimal distance = height;
while (height / 2 > heightlim)
{
distance += height;
height /= 2;
i++;
}
Console.WriteLine("Total times:{0},Total distance:{1}", i, distance);
}
2
3
4
5
6
7
8
9
10
11
12
# for循环
for循环需要三个条件:
- 初始化计数器变量。
- 循环条件。
- 执行完循环体,对计数器变量执行操作。
请看示例:
static void Main(string[] args)
{
for(int i=0;i<10;i++)
{
Console.WriteLine(i);
}
}
2
3
4
5
6
7
8
# foreach循环
foreach(<baseType> <varName> in <array>){
//语句。
}
//foreach常用于数组遍历中,它比for好的就是不会越界访问,for中的迭代变量在粗心时可能会越界访问数组,比如之前在讲数组时提到的:
int[,] baseData=new int[3,2]{{1,2},{3,4},{5,6}};
foreach(var one in baseData){
Console.WriteLine(one);
}
2
3
4
5
6
7
8
9
10
foreach需要注意以下两点:
- 只能读取,不能修改元素,在7.0中肯定是不行的,在7.3或更高版本中支持使用引用ref变量作为迭代变量。
- 只能遍历实现IEnumeratable接口的集合对象。
# 跳出循环
如果想从循环中立刻跳出循环,或者跳出本轮循环,可以使用下面关键字:
- break:立即终止循环。
- continue:立即终止当前的循环。
- return:跳出循环及包含该循环的函数。
示例:
static void Main(string[] args)
{
for(int i=0;i<10;i++)
{
if (i % 2 == 0) continue;
if (i == 7) break;
Console.WriteLine(i);
}
Console.WriteLine("program end!");
}
2
3
4
5
6
7
8
9
10
11
如果将上面的break换成return,就不会有program end!输出了。
# 输入输出
这里的输入输出主要是控制台输入输出。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LearnCSharp1
{
class Program
{
static void Main(string[] args)
{
string str1 = @"hello
world
You";
string str2 = "Hello"+
"world";
Console.WriteLine($"{str1} : {str2}");
Console.WriteLine($"str2 lower format:{str2.ToLower()}");
Console.WriteLine("{0} : {1}",str1,str2);
Console.WriteLine(string.Format("str1's content:{0}",str1));
float f1 = 10;
float f2 = 3;
Console.WriteLine($"f1/f2:{f1/f2}");
int num1;
num1=int.Parse(Console.ReadLine());
Console.WriteLine(num1);
}
}
}
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
注意:
- 使用WriteLine输出或者Format时,{0}{1}可作为占位符。
- @可以禁止一切转义字符,比如str1就能把回车的转义给禁用,但是str2如果是这种格式就会报错。
- C#的新特性字符串插值,其格式为$"{}",其中引号中括号里面可以看成是C#的语句,括号外面的看成是普通字符串。
# 名称空间
他们给应用程序提供了代码容器的方式,这样可以唯一地标识代码及其内容。默认情况下,C#代码包含在全局名称空间中,这意味着全局名称空间中的其他代码只要通过名称进行引用,就可以访问它们。可使用namespace关键字为花括号中的代码块显式定义名称空间,如果在该名称空间外部使用名称空间中的名称,就必须写出该名称空间中的限定名称。限定名称在不同名称空间级别之间使用句点字符(.)。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;
namespace LearnCSharp1
{
namespace test1{
class person
{
public string name = "Test1 person";
}
}
class Program
{
static void Main(string[] args)
{
test1.person test1Person = new test1.person();
Console.WriteLine(test1Person.name);
WriteLine(test1Person.name);
}
}
}
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
从上面看到要使用test1中的类,需要在类前加上test1这个限定符。注意using语句本身不能访问另一个名称空间中的名称,除非命名空间中的代码以某种方式链接到项目上,或者代码是在该项目的源文件中定义的,或者是在链接到该项目的其他代码中定义的,否则不能访问其中包含的名称。如果包含命名空间的代码链接到项目上,那么无论是否使用using,都可以访问其中包含的名称,using语句只是便于我们访问这些名称,减少代码量,不用每次引用里面的都要加上命名空间限定符。
System名称空间是 .Net Framework应用程序的根名称空间,包含控制台应用程序需要的所有基本功能。其他4个名称空间常用于控制台应用程序,所以该程序包含了它们。
C#6新增了using static关键字,它允许把静态成员直接包含到C#程序的作用域中,比如本例中的using static System.Console;这样便可以在程序中直接使用WriteLine而不用添加Console限定符了。