C# 与LINQ有关的语言特性
1.隐式类型
我们知道强类型语言 C C++ C# Java 对变量的定义前必须要确定这个变量是什么类型的 例如 string str="abc"; int num = 12 等等
但是我们知道部分弱类型语言 是没有特定的类型的,例如 javascript vbscript php 等
上例可以看出: 我们使用了 var 任何类型 这个类型关键字来定义我们知道的任何类型,并在编译阶段将我们的var类型自动转为了int类型
这是因为 自从 C# 3.0起 编译器可以根据 赋值的情况 自动为我们推断 变量的 类型
这里的person 是一个 Anonymous Type(匿名类型 )类
也就是说如果我们定义的类型在.net 中是存在的那么编译器会自动帮我们确定类型包括匿名类型
这个特性在网站开发中,序列化和反序列化JSON对象时很有用 反序列化时 常常先拿到对象不确定其类型 先 用var 变量类接收
注意与 dynamic 的区别
dynamic 类型 是编译时不确定类型 在执行时才确定类型
通过reflector 反编译后可以看到:
说明dynamic 是object 类型而不是匿名类型
我们看到在运行时候 dynamic变成了list类型
2.匿名类型
上面提到的匿名类型 先运行时通常 是‘a来标识代表 没有写名字的类型
3.自动属性
我们通过反编译查看IL代码:
setName代码
setName2 代码
这里就是自动添加的代码 用于设置自动属性
4.初始化器
在声明的同时就进行初始化操作
如果有含参数的构造器 则 在初始化器中传入参数,初始化器是在构造方法之后执行的
5.委托
简单的来说 委托是与类平级的 用来传递方法的一种类型
我们知道 类 基本类型 引用类型 的都是可以作为参数传递的
那方法用什么来传递? 我们知道 C# 中有 引用类型 如 类 值类型 如int float struct 等
那方法是什么类型?---------委托
我们先看一个问题:
大家知道 我们可以将一些基本类型 类 等 作为参数传递给一个方法
那我们如果想将一个方法作为参数该怎么做呢?
直接将方法传进去,显然不行,我们只能讲包含改方法的类作为参数 然后调用类对象的方法
如何将方法直接作为参数传递个另一个方法呢?
用委托实现了方法作为参数传递给另一个方法
同样的我们可以通过放回委托来实现返回方法
6.Lambda表达式
eg:
7.扩展方法
如果我们需要对一个类添加行为该怎么做?
比如我想给String 添加一个方法,这个方法执行后会打招呼
我们知道string 这个类 中是没有hello()这个方法的,那这个方法怎么来的呢,这个是我们自己给他添加的扩展方法,下面我们来看看怎么做到的
添加扩展方法的几个条件
1)必须写在静态类中
2)扩展否方法的第一个参数必须是需要扩展的类型,并且必须要以this 开头
根据上面条件,我们知道我们这个给string类添加的扩展方法
public static class UtilsExtends{
public static void Hello(this string str){
Console.WriteLine("Hello");
}
}
这样就个string类型添加了一个hello方法,这个方法就是在控制台答应hello 字符串
后面继续。。。