According to C#

Last renew: August 30, 2022 pm

Async & Await

C#利用Async和Await关键字实现异步编程。

异步编程:让程序并行运行的一种方式,并行的好处就不多说了。

Async和await是代码标记,它标记代码位置为任务完成后控件应该恢复的位置。

Lambda Function

Lambda函数是foreach以及简单的for循环的替代。会让代码看起来更加整洁漂亮。

首先,你可以使用一个lambda表达式来创建一个匿名函数。使用Lambda声明操作符=>来分离Lambda的参数列表和它的主体。一个lambda表达式可以是以下两种形式中的任何一种:

  1. Expression lambda(有一个表达)
1
(input - parameters) => expression
  1. Statement lambda(有一个声明的block)
1
(input - parameters) => {<sequence-of-statements>}

Get & Set

有两个类person:

1
2
3
4
5
6
7
8
public class person
{
public string name;
}
public class person
{
public string Name{get; set; }
}

第一个类型的name属性为封装。其属性直接通过public关键字暴露给系统中的其他类了。

第二个类型的Name属性通过get和set进行了封装。get和set分别对应可读和可写。相当于下面的代码

1
2
3
4
5
6
private string name;
public string Name
{
get { return name;}
set { name = value;}
}

区别在于:

当实例化第一个“person”类时,系统在分配内存空间时对name属性直接分配内存。之后对name属性的操作也是直接操作内存中name属性所在的这个块。

而当实例化第二个”person”类时,系统会先分配一个叫name的private私有的内存空间,之后的读和写都是通过Name这个public的类似于指针的东西来关联name进行,这样就完成了封装。通过get/set关键字也可以控制可读可写。

第二个例子:一个银行类,既能存钱也能取钱。

1
2
3
4
5
6
private Money;
private class bank()
{
get { return Money;}
set { Money=value;}
}

Money就像银行里的自动取款机,你看不见钱,但是你能用set(存钱)get(取钱)。money是一个私有字段,封装在类中的,类之外的程序不能直接访问。在C#的get、set用法中,类的set和get成员是外部程序访问类内部属性的唯一方法。就像去银行取钱,你不能直接去保险柜拿钱,是柜员取钱给你。

你可以利用属性来限制外界对你字段的存取。如果只想让用户读就get,只想让用户写就set。

1
2
3
4
5
6
7
8
9
10
11
12
13
private int a;
public int index
{
get
{ return a; }
set
{
if (value>0)
a = value;
else
a = 0;
}
}

可以看出,get/set的用法有如下特点

  1. 隐藏组建或类内部的真实成员
  2. 建立约束
  3. 响应属性变化事件。

“out” keyword

out 关键字通过引用传递参数。使用这个参数声明方法是返回多个值的经典解决方法。下面的示例使用out返回具有单个方法调用的三个变量。方法可以有选择的返回值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Method(out int answer, out string message, out string stillNull)
{
answer = 44;
message = "I've been returned";
stillNull = null;
}

int argNumber;
string argMessage, argDefault;
Method(out argNumber, out argMessage, out argDefault);
Console.WriteLine(argNumber);
Console.WriteLine(argMessage);
Console.WriteLine(argDefault == null);

// The example displays the following output:
// 44
// I've been returned
// True

“throw” keyword

throw 关键字标志着在程序执行过程中发生了一个异常。

1
throw [e]

e是一个排生自System.Exception 的类的实例。下面的例子使用throw语句来抛出一个IndexOutOfRangeException。如果传递给一个名为GetNumber的方法的参数不对应于一个内部数组的有效索引。