zhangchao19781124 / NET-STUDY

Take notes about Net Study
0 stars 0 forks source link

C#5.0以上语法中的问号?和双问号,以及lamba语法中下划线特殊用处 #13

Open zhangchao19781124 opened 6 years ago

zhangchao19781124 commented 6 years ago

1.单问号(?) 1.1 单问号运算符可以表示:可为Null类型,C#2.0里面实现了Nullable数据类型

//A.比如下面一句,直接定义int为null是错误的,错误提示为无法将null转化成int,因为后者是不可以为null的值类型。 private int getNum = null;

//B.如果修改为下面的写法就可以初始指为null,在特定情况下?等同于基础类型为Nullable。 private int? getNum = null; private Nullable getNumNull = null; 1.2 单问号运算符表示三元运算符

//A.需要if语句来判断,当Request.Params["para"]不为null时,取出para的值。 string strParam =Request.Params["para"];
if ( strParam== null )
{
strParam= "";
}

//B.用三元运算符?简化写法,取出para的值。 string strParam=Request.Params["para"] == null ? "":Request.Params["para"]; 2.双问号(??)

?? 运算符称为 null 合并运算符,用于定义可以为 null 值的类型和引用类型的默认值。如果此运算符的左操作数不为 null,则此运算符将返回左操作数;否则返回右操作数。

可以为 null 的类型可以包含值,或者可以是未定义的。?? 运算符定义当可以为 null 的类型分配给非可以为 null 的类型时返回的默认值。如果在尝试将可以为 null 值的类型分配给不可以为 null 值的类型时没有使用 ?? 运算符,则会生成编译时错误。如果使用强制转换,且当前还未定义可以为 null 值的类型,则会引发InvalidOperationException 异常。

//A.定义getNum为null,输出结果为0 private int? getNum = null; Console.WriteLine(getNum ?? 0);

//B.定义getNum为1,输出结果为1 private int getNum = 1; Console.WriteLine(getNum ?? 0);

3.lamba语法中下划线(_) Lambda表达式

λ:希腊字母表中排序第十一位的字母,英语名称为Lambda。最早出现是用于计算的λ演算(lambda calculus),后来被函数式编程语言广泛采用。

Lambda表达式可以理解成为是一个能够作为参数传递的匿名函数Object,他没有名字,但有参数列表、有函数体、有返回类型、可以抛出异常。它的类型,叫做“目标类型(target type)”Java8中就是“函数接口(functional interface)”。

语法:

引用 (parameters) -> expression (parameters) -> statement (parameters) -> { statements; }

举例:

引用 () -> Math.PI 2.0 (int i) -> i 2 (String s) -> s.length() (int i0, int i1) -> i0 + i1 (int x, int y) -> { return x + y; }

①省略类型

Java代码 收藏代码 (int x, int y) -> { return x + y; };
(x, y) -> { return x + y; };

***不能只省略一部分类型,比如:(int x, y) -> { return x + y; }; // NG

②1个参数可以省略括号

Java代码 收藏代码 (String text) -> { System.out.println(text); };
(text) -> { System.out.println(text); };
text -> { System.out.println(text); };

***但是不能带类型,比如:String text -> { System.out.println(text); }; // NG

③函数体多行时需要大括号

Java代码 收藏代码 (int i) -> {
int prod = 1;
for(int n = 0; n < 5; n++) prod *= i;
return prod;
};

④函数体只有一行的话可以省略大括号

Java代码 收藏代码 text -> System.out.println(text);

assert语句不能省略带括号,比如: s -> { assert !s.isEmpty(); }; return语句不能省略带括号,比如:(x, y) -> return x -y; // NG

⑤只有一行代码而且有返回值的可以省略return,会返回该行代码计算结果

Java代码 收藏代码 (x, y) -> { return x -y; };
(x, y) -> x -y;

***return要和大括号一起省略,比如:(x, y) -> { x - y; }; // NG

⑥没有参数没有返回值的空函数

Java代码 收藏代码 () -> {};

⑦Scala等使用下划线做占位符

() -> System.out.println(); // NG