C#中一个问号和两个问号(a ?? b)的作用
不卖关子,直接开门见山:
C#中两个问号的作用是判断??左边的对象是否为null,如果不为null则使用??左边的对象,如果为null则使用??右边的对象。
比如:a = b ?? c,如果b为null,则a = c,如果b不为null,则a = b。
下面一段代码演示了这两种情况:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
static void Main(string[] args) { NewFuck(); Shit(); Console.ReadKey(); } private static void NewFuck() { string fuck = "Fuck" ; Console.WriteLine(fuck ?? "fuck not found." ); } private static void Shit() { object shit = null ; string b = (string)shit ?? "shit not found." ; Console.WriteLine(b); } |
很明显,这种类似三目表达式的运算符可以用来在妹子面前装B,看个直观的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
//文艺Fuck private static void NewFuck() { string fuck = "Fuck" ; Console.WriteLine(fuck ?? "fuck not found." ); } //普通Fuck private static void Fuck() { string fuck = "Fuck" ; string s = fuck != null ? fuck : "fuck not found." ; Console.WriteLine(s); } //2BFuck private static void SBFuck() { string fuck; fuck = "Fuck" ; string s; if (fuck != null ) { s = fuck; } else { s = "fuck not found." ; } Console.WriteLine(s); } |
这三个方法在结果上是相同的,都会在屏幕上输出Fuck。当然,写个例子只是Demo级别的,我们在实际编程的时候用??运算符往往更有用,可以省去很多麻烦。比如处理页面QueryString的时候:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// 原先要这样处理参数: string tmd = String.Empty; if (Request[ "Select" ] != null ) { tmd = Request[ "Select" ]; } else { tmd = "All" ; } // 现在重构为: string tmd1 = Request[ "Select" ] ?? "All" ; |
怎么样?有没有觉得屌爆了。Session什么的也可以这么处理。顺便提一句,实际项目中处理参数比这个要复杂。往往包括类型转换等操作。类型转换建议用as操作符,强转不好。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int? a;
a = null;//此时输出3
//a = 6;//此时输出6
int b = a ?? 3;
Console.Write(b);
Console.ReadKey();
}
}
}
变量定义中含有一个问号,意思是这个数据类型是NullAble类型的。
变量定义中含有两个问号,双目运算符,意思是取所赋值??左边的,如果左边为null,取所赋值??右边的。