什么?原来C#还有这两个关键字
系列介紹
簡介
【五分鐘的dotnet】是一個利用您的碎片化時間來學習和豐富.net知識的博文系列。它所包含了.net體系中可能會涉及到的方方面面,比如C#的小細節,AspnetCore,微服務中的.net知識等等。
場景
您可以在下班坐地鐵的時候,拿出手機逛一逛博客園,利用短短的五分鐘完成閱讀。
誕生緣由
曾經學過的內容可能過不了多久就忘了,我們需要一些文章來幫我們查漏補缺。
太長篇幅的文章看著滾動條就害怕了,我們可能更期望文字少的文章。
.net體系的內容太多了,平時也不知道該學哪些,我們可能需要一點點知識線索。
文章質量
當然,并不意味著它篇幅短就質量差。所謂麻雀雖小五臟俱全,我們會盡可能保證利用最少的文字去詳細的闡述內容。
正文
好吧,直接開們見山來介紹今天的主角:Explicit?和?Implicit。
我記得我第一次見到這兩個關鍵字還是在一次C#基礎測試中。當時已經入C#的坑有兩年多了吧,自認為基礎的題應該不在話下吧。
然后小手一點視頻網頁上的進行測試按鈕,請聽題:“請問Explicit的作用是什么?”。我:“%……&……,這他喵的什么東西?是C#的東西?”。
后來在公司問了一些老鳥,好像大家也并不知道這兩個關鍵字,畢竟它和static、operator這些大佬比起來,真的太不顯眼了。
它到底是個什么東西
先來直接看一下msdn對它的解釋吧:
復制代碼
explicit 關鍵字用于聲明必須使用強制轉換來調用的用戶定義的類型轉換運算符是的,它就是一個類型轉換的語法糖。explicit?與?Implicit的作用其實是一樣的,它們之間的區別其實僅僅是顯示轉換和隱式轉換的區別。
來看它的用途
這是我在項目中用到的一處場景,我建立了一個時間段類,里面包含了時間段的開始時間和結束時間。代碼大致是醬紫:
復制代碼
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會給你提示。
希望本篇文章沒有花費您太長的閱讀時間。來波關注,咱們下次再見(? ?_?)?
總結
以上是生活随笔為你收集整理的什么?原来C#还有这两个关键字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mbp,一个用于学习.net core的
- 下一篇: 如何利用Serilog的RequestL