CH 13

事件(p325)

匿名方法

1
2
3
4
myConnection += delegate(int a, string b)
{
// ...
};

特性(p344)


CH 14

对象初始化器

1
2
3
4
5
A 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
19
var 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
6
public foo(string str, bool a = false, b = false, c = false)
{
// ...
}

foo("Hello", c: true, a: true);

扩展方法: 扩展类型的功能,但不修改类型本身。
要创建和使用扩展方法,必须:

  1. 创建一个非泛型静态类
  2. 使用扩展方法的语法,为所创建的类添加扩展方法,作为静态方法
  3. 确保使用扩展方法的代码用using语句导入了包含扩展方法类的名称空间
  4. 通过扩展类型的一个实例调用扩展方法,与调用扩展类型的其他方法一样

编写扩展方法的要求:

  • 方法必须是静态的
  • 方法必须包含表示调用扩展方法的类型实例的参数(实例参数)
  • 实例参数必须是方法的第一个参数
  • 除了this关键字外,实例参数不能有其他修饰符
1
2
3
4
5
6
7
8
9
10
public static class ExtensionClass
{
public static <ReturnType> <ExtensionMethodName>(this <TypeToExtend> instance, <OtherParameters>)
{
// ...
}
}

<TypeToExtend> myVar;
myVar.<ExtensionMethodName>();

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个参数和返回类型,返回类型使用在列表的最后