C#高级技术知识点(二)var关键字,dynamic关键字,lambda表达式

接上C#高级技术知识点(一)global,异常,特性

目录

    • 五、类型推理
    • 六、匿名类型
    • 七、动态类型
    • 八、可选参数,命名参数
    • 九、lambda表达式

五、类型推理

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);

另外提一个别的概念,闭包函数
如果在匿名函数(方法)中使用了外部变量,则称为闭包函数,在内存优化中,这个是要避免的。

你可能感兴趣的:(C#)