天天看点

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,看个直观的例子:

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的时候:

// 原先要这样处理参数:

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,取所赋值??右边的。

?? ?