学习linq 的前提知识:
(1).var 隐式推断类型,
VAR 是3.5新出的一个定义变量的类型
其实也就是弱化类型的定义
VAR可代替任何类型
编译器会根据上下文来判断你到底是想用什么类型的
使用var定义变量时有以下四个特点:
1. 必须在定义时初始化。也就是必须是var s = “abcd”形式,而不能是如下形式:
var s;
s = “abcd”;
2. 一但初始化完成,就不能再给变量赋与初始化值类型不同的值了。
3. var要求是局部变量。
4. 使用var定义变量和object不同,它在效率上和使用强类型方式定义变量完全一样。
(2).扩展方法
下一个与LINQ密切相关的C# 3.0语言功能是扩展方法(Extension method)。在这之前,一旦一个类型被编译进.NET程序集后,我们便不能再修改该类型的定义了。为该类型添加、修改、删除成员的唯一办法就是修改类型的定义代码。
但有时候,当需要为类型添加新功能但并不拥有类型的已有代码时,比如,我们想要为.NET库类型List添加自定义的dump方法时,该怎么做呢,答案是扩展方法。扩展方法允许在不修改类型定义的情况下,让该类型获得功能上的扩展。
定义扩展方法
当定义一个扩展方法时,第一个限制就是必须把方法定义在静态类中,因此每一个扩展方法也必须声明为静态的。第二个限制是扩展方法要用this关键字对第一个参数进行修饰,这个参数也就是我们希望进行扩展的类型。
比如下面的扩展方法允许.NET基类库中的所有对象都拥有全新的方法DisplayDefiningAssembly()。
static class MyExtensions
{
// 本方法允许任何对象显示它所处的程序集
public static void DisplayDefiningAssemlby(this object obj)
{
Console.WriteLine("{0} is defined in: \n\t {1}\n",
obj.GetType().Name,
System.Reflection.Assembly.GetAssembly(obj.GetType()));
}
}
调用扩展方法
我们有两种方式来使用扩展方法,第一种是在实例层次上调用扩展方法,第二种是静态调用扩展方法。
public void UsingExtensionMethods()
{
int myInt = 12345;
// 1. 在实例层次上调用扩展方法
myInt.DisplayDefiningAssemlby();
// 2. 静态调用扩展方法
MyExtensions.DisplayDefiningAssemlby(myInt);
}
实例上,通过一个对象调用它的扩展方法只是编译器的烟幕弹效果而已,背后编译器会转换成静态方法的调用。
其他注意事项
上面说到,扩展方法本质上是可以从扩展类型的实例上调用的静态方法。所以它和普通的方法是不一样的,扩展方法不能直接访问扩展类型的成员,从另外一个角度讲,扩展方法即不是直接修改,也不是继承。
另外一个要注意的地方是:虽然表面上扩展方法是全局的,但其实他们受制于所处的命名空间,要使用在其他命名空间中定义的扩展方法时,我们首先需要导入该命名空间。
(3).对象初始化器
- User user = new User();
- user.Id = 1;
- user.Name = "YJingLee";
- user.Age = 22;
在.net3.5中,编译器会自动地生成合适的属性setter代码,使得原来几行的属性赋值操作可以在一行完成。我们可以这样简化:像这样,对象初始化器由一系列成员对象组成,其对象必须初始化,用逗号间隔,使用{}封闭。
- User user = new User { Id = 1, Name = "YJingLee", Age = 22 };
除了在初始化类时设置简单的属性值外,C#对象初始化器特性也允许我们设置更复杂的嵌套(nested)属性类型。例如我们可以在上面定义的User类型同时拥有一个属于Address类型的叫“Address”的属性:
- User user = new User
- {
- Id = 1,
- Name = "YJingLee",
- Age = 22,
- Address = new Address
- {
- City = "NanJing",
- Zip = 21000
- }
- };
(4).匿名方法
C#为委托提供一种机制,可以为委托定义匿名方法,匿名方法没有名称,编译器会定指定一个名称,如下
button1.Click += delegate(System.Object o, System.EventArgs e) { System.Windows.Forms.MessageBox.Show("Click!"); };
C#3.0之后匿名方法可以使用λ表达式来进行定义
λ运算符 =>
左边是参数,使用括号表达 (string param),可以是 (param)这样不定义类型,编译器会推断出来,只有一个参数的时候可以不使用括号
右边是实现代码,使用花括号,如果代码只有一行,则不使用花括号和return关键字也可以,编译器会为我们添加
这是λ表达式的简单实现
string str1 = "a";
string str2 = "b";
MyDelagate my = param => param + str1 + str2;
Console.WriteLine(my("c"));
输出"cab"