五、类型推理
var关键字: 使用var时并不是声明了一个没有类型的变量,也不是声明了一个类型可变的变量,否则C#就不再时强类型化的语言了。实际上,var只是依赖于编译器来确定变量的类型。如果编译器无法确定用var声明的变量类型,代码就无法编译。因此,在用var声明变量时,必须同时初始化该变量。
var myVar; //错误
var myArray = new[]{4,2,3}; //正确
那么有童鞋问了,那用var好,还是不用好。
其实现在来讲影响不大,个人建议,在写代码的时候,如果确定这个类型了,就用指定类型来初始化,类型实在定义的太长了,或者就是不想写,用var完全没问题。非得杠,int num = 3,你也可以写成var num = 3也行滴。
注意:var关键字本身并不是一个类型。
六、匿名类型
var关键字的高级用法,假如有一个类,里面就这样,而且也不怎么用
public class Animal
{
public string Name{get;set;}
public int Age{get;set;}
}
Animal anim = new Animal()
print(anim.Name)
那么可以用匿名类型来代替
var anim = new{ //new后不指定类型名,让编译器自己指定
Name = "zhangsan";
Age = 11;
}
print(anim.Name)
注意1:用匿名类型定义的属性是只读的。
注意2:即使在其他地方定义了同样的匿名类型时,并不会创建多个匿名类型,而是多个实例。
七、动态类型
dynamic关键字 用于定义变量,且不必初始化它。
dynamic myDynamic;
myDynamic.Dosomthing("try")
注意1:该关键字仅在编译期间存在,运行期间会被System.Object类型替代
注意2:无论myDynamic实际包含什么值,第二行代码都会编译,但是如果请求的成员不存在,在执行期间这行代码会抛出一个RuntimeBinderException的异常
注意3:对于大多数自己编写的C#代码,应避免使用dynamic关键字,它的使用一般是处理非.NET对象的时候,比如其他语言(JavaScript等)
八、可选参数,命名参数
//可选参数 , 第二个参数就是可选参数,调用时不填第二个参数默认false
public string GetName(int type, bool isFull = false)
{}
//调用
string name = GetName(3);
//命名参数
public string GetName2(int type, bool isFull = false, bool isHasSurname = false)
{}
//由于可选参数过多,如果一一赋值,就失去了可选参数的意义了,所以可以直接指定某个参数进行赋值
string name2 = GetName(3, isHasSurname = true);
九、lambda表达式
lambda表达式实际上是匿名方法的一种快捷方式,直接看一些代码吧。
List<int> myList = new List<int>;
// 匿名方法
myList.Sort(delegate(int a, int b)
{
return a > b ? 1 : -1;
});
// lambda表达式
myList.Sort((int a, int b) =>
{
return a > b ? 1 : -1;
});
// lambda表达式
myList.Sort((a, b) =>
{
return a > b ? 1 : -1;
});
//如果返回值是void,可以再简写
(a) => print(a);
//如果参数只有一个,可以再简写
a => print(a);
另外提一个别的概念,闭包函数
如果在匿名函数(方法)中使用了外部变量,则称为闭包函数,在内存优化中,这个是要避免的。