天天看點

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,取所指派??右邊的。

?? ?