C 中的 is 真的是越來越強大,越來越語義化

2021-10-09 22:07:06 字數 4162 閱讀 3378

最近發現 c#7 之後的 is 是越來越看不懂了,乍一看花裡胡哨的,不過當我靜下心來仔細研讀,發現這 is 是越來越短小精悍,而且還特別語義化,那怎是乙個爽字了得?,這一篇就和大家簡單聊一聊。

相信學過 c# 的朋友都會知道 is 是幹嘛的,而且還經常和 as 一起比較,前者一般做相容性檢測,後者一般做相容性轉換,這裡我就舉個例子吧:

從這個例子可以看到, object 型別的 slot 和 slot, icomparable 都是型別相容的,非常簡單。

然而在實際編碼中,我相信有很多朋友都會在後續的過程中用到 slot 例項,而上面的這個例子,即使我用 is 檢測到了是 slot 型別,最後我還是要 將 object slot 強轉成 slot型別,做了一次檢測,又做了乙個強轉,這就很奇葩了,如下**:

if (slot is slot)

, clothesname=");

}

除非有毛病才寫這樣的**,幹嘛不直接用 as 嘗試性轉換將兩步合為一步走呢? 修改**如下:

這就導致很多場景下,is 都被 as 替代了,搞的 is 成了乙個空架子,如果 is 能合併 as 的功能,那就??了,我覺得這個急需增強。

也終於在 c#7 之後對 is 進行了翻天覆地的語法糖改造,導致你初看已經不明白啦???,下面我就一一舉例來說明吧。

現在就來看一下怎麼用新is 解決剛才兩次轉換的問題,如下**:

這段**表面意思是:先用 is 檢測 slot 是否為 slot 型別,如果是就賦值給 slot 型別的 query 變數,哈哈,有點意思吧,為了驗證是否如我所說,用反編譯工具看看。

可以看到,在實操中,編譯器都用 as 進行了還原,不過從**流暢性來看,ilspy更??一點。

除了和類例項比較之外,還可以和 int,string,tuple …進行比較, **如下:

object e = 150;

//字串比較

if (e is "hello")

//整形比較

if (e is 10)

//tuple 比較

if (e is (10, 20))

大家在寫 sql 的時候判斷某乙個字段是否為 null,通常都會這樣寫:username is null或者username is not null,哈哈,這種寫法也被引入到 c# 中了,有意思吧,上**:

object e = 150;

if (e is null)

if (e is not null)

這麼語義化的寫法在c#中看到是不是有點不習慣,那為啥在 sql 中就習以為常呢? 其實反編譯過來也沒啥,就是乙個 == 判斷,如下**:

現在大家都看到了 is 通常是放在 if 語句中,既然在 if 語句中,那肯定有很多的邏輯判斷,這就需要結合 and,or 構建非常複雜的邏輯關係,不要眼花哦。

object e = 150;

if (e is >= 100 and <= 200)

果然 大於 100 並且 小於 200");

}if (e is 100 or 150 or 200)

是在 100,150,200 三個數字中");

}if (e is not null and not "")

,模擬 !string.isnullorempty 功能");

可以看到最後的:e is not null and not ""其實等價於!string.isnullorempty, 是不是有點意思哈。

當 is 和 var 結合起來就更??了,可以實現在 if 判斷的過程中生成臨時變數,如下**:

int e = 150;

if (e is var i && i >= 100 && i <= 200)

果然 大於 100 並且 小於 200");

}

上面**中的 i 就是乙個臨時變數,後面做的一切業務邏輯都是基於 i 這個臨時變數的,如果還沒有領會到精粹,沒關係,我舉乙個專案中的例子吧。。。

我們公司是搞衣物洗滌自動化,也需要對線下 傳輸線上的衣服進行自動化上掛,取走和衣物組合搭配,舉個例子:找到 剛好掛了一件褲子l && 一件上衣l && 總衣服個數=2 的 掛孔號,要是還沒聽懂就算了,直接上**說話。

class program

,new slot() ,

new slot() ,

new slot() ,

new slot()

};//找到 剛好掛了一件褲子l & 一件上衣l & 總衣服個數=2 的 掛孔號

var query = slotlist.groupby(m => m.slotid).where(m =>

m.where(n => n.sizename == "l").tolist() is var clotheslist &&

clotheslist.count(k => k.clothesname == "褲子") is 1 &&

clotheslist.count(k => k.clothesname == "上衣") is 1 &&

重點在於上面**的m.where(n => n.sizename == "l").tolist() is var clotheslist,這裡的 clotheslist 就是臨時變數,它存放了所有尺寸l的衣物,後續的檢索都是基於這個 clotheslist,是不是大大提高了檢索速度~~~

我覺得 is 的功能增強早就該出現了,現在終於搞定了,越來越人性化,鍵盤敲擊次數越來越少,頭髮也不落了,甚至又開始第二春了,總的來說還是那句話,c# **??。

C 中的 is 真的是越來越強大,越來越語義化

最近發現 c 7 之後的 is 是越來越看不懂了,乍一看花裡胡哨的,不過當我靜下心來仔細研讀,發現這 is 是越來越短小精悍,而且還特別語義化,那怎是乙個爽字了得?這一篇就和大家簡單聊一聊。相信學過 c 的朋友都會知道 is 是幹嘛的,而且還經常和 as 一起比較,前者一般做相容性檢測,後者一般做相...

內心越來越強大的表現

1 懂得包容的藝術 人變得越來越強大第三個跡象則是慢慢懂得包容的藝術。過去喜歡就著自己的性子,這裡看不順眼,那裡看不順眼。但是伴隨著越來越強大的時候,才會真真切切體會到每個人都是不同的個體,每個人都需要認真的對待。真正懂得包容的人在和他人相處的時候,不再只是忍受乙個人。而是從根源處看到乙個人的性格,...

小公尺的MIUI公尺柚系統真的是越來越不好用了

我應該是小公尺最早的一批使用者,開始用的小公尺1,感覺還闊以吧,功能都比較實用,那時候小公尺手機還要搶的,飢餓營銷,miui只有300m,每週五都會推送更新,現在miui已經公升級到miui9了,竟然有1.5g了。今天紅公尺5plus送來了,我操作了一下,最大感覺就是龐大,系統太臃腫了,功能看似全面...