【5min+】 什麼?原來C#還有這兩個關鍵字

正文

好吧,直接開們見山來介紹今天的主角:ExplicitImplicit

【5min+】 什麼?原來C#還有這兩個關鍵字

我記得我第一次見到這兩個關鍵字還是在一次C#基礎測試中。當時已經入C#的坑有兩年多了吧,自認為基礎的題應該不在話下吧。

然後小手一點視頻網頁上的進行測試按鈕,請聽題:“請問Explicit的作用是什麼?”。我:“%……&……,這他喵的什麼東西?是C#的東西?”。

後來在公司問了一些老鳥,好像大家也並不知道這兩個關鍵字,畢竟它和staticoperator這些大佬比起來,真的太不顯眼了。

【5min+】 什麼?原來C#還有這兩個關鍵字

它到底是個什麼東西

先來直接看一下msdn對它的解釋吧:

<code>explicit 關鍵字用於聲明必須使用強制轉換來調用的用戶定義的類型轉換運算符/<code>

是的,它就是一個類型轉換的語法糖。explicitImplicit的作用其實是一樣的,它們之間的區別其實僅僅是顯示轉換和隱式轉換的區別。

來看它的用途

這是我在項目中用到的一處場景,我建立了一個時間段類,裡面包含了時間段的開始時間和結束時間。代碼大致是醬紫:

<code>public class DateTimeRange
{
public DateTime StartTime { get; set; }

public DateTime EndTime { get; set; }

public DateTimeRange(DateTime startTime, DateTime endTime)
{
StartTime = startTime;
EndTime = endTime;
}
}/<code>

在實際的使用場景中,我們項目裡往往會去獲取這個時間段類的小時數。

<code> (timeRange.EndTime - timeRange.StartTime).TotalHours;/<code>

是的,一開始我們就是醬紫寫的。但是寫起來很不爽,每次都要複製N次。然後提取成了一個方法,GetRangeHours()。但是你懂的,一旦程序員懶起來,它會連GetRangeHours都不想寫(雖然VS會給你提示,一般只需要按兩三次鍵盤)。所以後來就有了這個版本:

<code>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;
}
}/<code>

然後使用起來就成了這樣:

<code>double hours = timeRange;/<code>

我*,就是這麼灑脫。如果不懂這個關鍵字的同事閱讀到這兒,它可能還會很懵逼:“我擦,這個類型明明不是那個類型啊,那個類型又怎麼成了這個類型,它們怎麼還能等於起來……………………”。此時的你,只能對他微微一笑。

【5min+】 什麼?原來C#還有這兩個關鍵字

想一想你會在什麼場景使用該關鍵字呢?DTO轉換?已有代碼不能變更只能擴展?…………

結束

implicitExplicit都是起到類型轉換的作用,它們的區別是轉換的時候一個需要顯式轉換而已,剛才我們那個場景用了隱式轉換,如果是顯式轉換的話就需要

double hours = (double)timeRange; 來寫了。

該關鍵字只能在類內部使用哦,放心,強大的VS會給你提示。


分享到:


相關文章: