C#入门经典 Part 5
CH 13
事件(p325)
匿名方法1
2
3
4myConnection += delegate(int a, string b)
{
// ...
};
特性(p344)
CH 14
对象初始化器1
2
3
4
5A a = new A
{
attr1 = ...;
attr2 = ...;
};
类型推理var x = ...; var arr = new[] {1, 2, 3};
依赖编译器确定变量类型。
匿名类型1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19var curry = new
{
Name = "Tom";
Age = 27;
};
var curries = new[]
{
new
{
Name = ...;
Age = ...;
},
new
{
Name = ...;
Age = ...;
}
};
如果要在数据存储对象中修改属性的值,就不能使用匿名类型。
动态变量: 类型可变的变量。dynamic myDynamicVar;
动态查找功能由动态语言运行库(Dynamic Language Runtime, DLR)支持。
动态类型仅在编译期间存在,在运行期间它被System.object
类型替代。
可选参数 & 命名参数1
2
3
4
5
6public foo(string str, bool a = false, b = false, c = false)
{
// ...
}
foo("Hello", c: true, a: true);
扩展方法: 扩展类型的功能,但不修改类型本身。
要创建和使用扩展方法,必须:
- 创建一个非泛型静态类
- 使用扩展方法的语法,为所创建的类添加扩展方法,作为静态方法
- 确保使用扩展方法的代码用using语句导入了包含扩展方法类的名称空间
- 通过扩展类型的一个实例调用扩展方法,与调用扩展类型的其他方法一样
编写扩展方法的要求:
- 方法必须是静态的
- 方法必须包含表示调用扩展方法的类型实例的参数(实例参数)
- 实例参数必须是方法的第一个参数
- 除了this关键字外,实例参数不能有其他修饰符
1 | public static class ExtensionClass |
Lambda表达式:
- 放在括号中的参数列表(未类型化)
- =>运算符
- C#语句
1
2
3
4
5
6
7
8
9(paramA, paramB) =>
{
// ...
reuturn xxx;
} // 定义为非匿名方法更好
(int a, int b) => a + b
() => Math.PI
可以把拥有至多8个参数的Lambda表达式表示为如下泛型类型,它们都在System名空间中定义:
- Action,表示的Lambda表达式不带参数,返回类型是void
- Action<>,表示的Lambda表达式至多8个参数,返回类型是void
- Fun<>,表示的Lambda表达式有至多8个参数,返回类型不是void。Func<>最多有9个泛型类型的参数,分别用于Lambda表达式的8个参数和返回类型,返回类型使用在列表的最后