# 概要

本部分主要包括:

  • 分支语句
  • 循环语句
  • 输入输出语句
  • 命名空间概念
  • 语句练习

# 分支

# 三元运算符

其格式为:

<条件> ? <如果真返回的结果> : <如果假返回的结果>

示例
string resultStr= integer < 10 ? "< 10" : " >= 10";
1
2
3
4

# if语句

其格式为:

if(条件){
    条件为真时执行的代码
}

if(条件){
    条件为真时执行的代码
}else{
    条件为假时执行的代码
}
1
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);
}
1
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;
        }
    }
}
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

注意上面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);
}
1
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);
}
1
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);
    }
}
1
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);
}
1
2
3
4
5
6
7
8
9
10
11
12

# for循环

for循环需要三个条件:

  1. 初始化计数器变量。
  2. 循环条件。
  3. 执行完循环体,对计数器变量执行操作。

请看示例:

static void Main(string[] args)
{

   for(int i=0;i<10;i++)
   {
       Console.WriteLine(i);
   }
}
1
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);
}
1
2
3
4
5
6
7
8
9
10

foreach需要注意以下两点:

  1. 只能读取,不能修改元素,在7.0中肯定是不行的,在7.3或更高版本中支持使用引用ref变量作为迭代变量。
  2. 只能遍历实现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!");
}
1
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);
        }
    }
}
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

注意:

  • 使用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);
        }
    }
}
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

从上面看到要使用test1中的类,需要在类前加上test1这个限定符。注意using语句本身不能访问另一个名称空间中的名称,除非命名空间中的代码以某种方式链接到项目上,或者代码是在该项目的源文件中定义的,或者是在链接到该项目的其他代码中定义的,否则不能访问其中包含的名称。如果包含命名空间的代码链接到项目上,那么无论是否使用using,都可以访问其中包含的名称,using语句只是便于我们访问这些名称,减少代码量,不用每次引用里面的都要加上命名空间限定符。

System名称空间是 .Net Framework应用程序的根名称空间,包含控制台应用程序需要的所有基本功能。其他4个名称空间常用于控制台应用程序,所以该程序包含了它们。

C#6新增了using static关键字,它允许把静态成员直接包含到C#程序的作用域中,比如本例中的using static System.Console;这样便可以在程序中直接使用WriteLine而不用添加Console限定符了。