【五分鐘的dotnet】是一個利用您的碎片化時間來學習和豐富.net知識的博文系列。它所包含了.net體系中可能會涉及到的方方面面,好比C#的小細節,AspnetCore,微服務中的.net知識等等。程序員
您能夠在下班坐地鐵的時候,拿出手機逛一逛博客園,利用短短的五分鐘完成閱讀。c#
固然,並不意味着它篇幅短就質量差。所謂麻雀雖小五臟俱全,咱們會盡量保證利用最少的文字去詳細的闡述內容。微服務
好吧,直接開們見山來介紹今天的主角:Explicit 和 Implicit。學習
我記得我第一次見到這兩個關鍵字仍是在一次C#基礎測試中。當時已經入C#的坑有兩年多了吧,自認爲基礎的題應該不在話下吧。測試
而後小手一點視頻網頁上的進行測試按鈕,請聽題:「請問Explicit的做用是什麼?」。我:「%……&……,這他喵的什麼東西?是C#的東西?」。.net
後來在公司問了一些老鳥,好像你們也並不知道這兩個關鍵字,畢竟它和static、operator這些大佬比起來,真的太不顯眼了。3d
先來直接看一下msdn對它的解釋吧:code
explicit 關鍵字用於聲明必須使用強制轉換來調用的用戶定義的類型轉換運算符
是的,它就是一個類型轉換的語法糖。explicit 與 Implicit的做用實際上是同樣的,它們之間的區別其實僅僅是顯示轉換和隱式轉換的區別。視頻
這是我在項目中用到的一處場景,我創建了一個時間段類,裏面包含了時間段的開始時間和結束時間。代碼大體是醬紫:blog
public class DateTimeRange { public DateTime StartTime { get; set; } public DateTime EndTime { get; set; } public DateTimeRange(DateTime startTime, DateTime endTime) { StartTime = startTime; EndTime = endTime; } }
在實際的使用場景中,咱們項目裏每每會去獲取這個時間段類的小時數。
(timeRange.EndTime - timeRange.StartTime).TotalHours;
是的,一開始咱們就是醬紫寫的。可是寫起來很不爽,每次都要複製N次。而後提取成了一個方法,GetRangeHours()。可是你懂的,一旦程序員懶起來,它會連GetRangeHours都不想寫(雖然VS會給你提示,通常只須要按兩三次鍵盤)。因此後來就有了這個版本:
public class DateTimeRange { public DateTime StartTime { get; set; } public DateTime EndTime { get; set; } public DateTimeRange(DateTime startTime, DateTime endTime) { StartTime = startTime; EndTime = endTime; } //operator 後面跟須要轉換的類型 public static implicit operator double(DateTimeRange timeRange) { return (timeRange.EndTime - timeRange.StartTime).TotalHours; } }
而後使用起來就成了這樣:
double hours = timeRange;
我*,就是這麼灑脫。若是不懂這個關鍵字的同事閱讀到這兒,它可能還會很懵逼:「我擦,這個類型明明不是那個類型啊,那個類型又怎麼成了這個類型,它們怎麼還能等於起來……………………」。此時的你,只能對他微微一笑。
想想你會在什麼場景使用該關鍵字呢?DTO轉換?已有代碼不能變動只能擴展?…………
implicit和Explicit都是起到類型轉換的做用,它們的區別是轉換的時候一個須要顯式轉換而已,剛纔咱們那個場景用了隱式轉換,若是是顯式轉換的話就須要 double hours = (DateTimeRange)timeRange; 來寫了。
該關鍵字只能在類內部使用哦,放心,強大的VS會給你提示。
但願本篇文章沒有花費您太長的閱讀時間。來波關注,我們下次再見(ง •_•)ง