最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

編寫(xiě)高質(zhì)量代碼的30條黃金守則(首選隱式類型轉(zhuǎn)換)

 更新時(shí)間:2020年08月11日 08:34:11   作者:比特飛  
這篇文章主要介紹了編寫(xiě)高質(zhì)量代碼的30條黃金守則(首選隱式類型轉(zhuǎn)換),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

編寫(xiě)高質(zhì)量代碼的30條黃金守則-Day 01(首選隱式類型轉(zhuǎn)換),本文由比特飛原創(chuàng)發(fā)布,轉(zhuǎn)載務(wù)必在文章開(kāi)頭附帶鏈接:https://www.byteflying.com/archives/6455

該系列文章由比特飛原創(chuàng)發(fā)布,計(jì)劃用三個(gè)月時(shí)間寫(xiě)完全30篇文章,為大家提供編寫(xiě)高質(zhì)量代碼的一般準(zhǔn)則。

1、概述

隱式類型轉(zhuǎn)換是微軟為了 C# 支持匿名類型而加入的,使用 var 通??梢允勾a的可讀性更強(qiáng),甚至是幫我們解決一些嚴(yán)重的性能問(wèn)題。為了清楚的明白 var 的作用機(jī)制,我們首先來(lái)看看編譯器為 var 做了哪些工作?

2、編譯器為var關(guān)鍵字做了什么?

首先 var 為語(yǔ)法糖,編譯器在編譯時(shí)根據(jù)右值推斷出表達(dá)式類型,再由編譯器將推斷出的表達(dá)式類型寫(xiě)入到 IL 中,所以如下2段代碼在 IL 中完全一致。

編譯期間,編譯器根據(jù)右值“SomeString”,可以推斷出這個(gè)表達(dá)式(右值)的類型為 string 類型,于是將var替換為string,再將它寫(xiě)到IL中,于是以上兩段初始化foo的代碼結(jié)果完全一致。

string foo = "SomeString";
var foo = "SomeString";

我們?cè)賮?lái)看一下兩段代碼的IL:

本文示例的源代碼

DnSpy 的反編譯結(jié)果

Microsoft 技術(shù)支持文檔中 ldstr 的解釋

注意:string也是語(yǔ)法糖,編譯時(shí),string被替換為System.String寫(xiě)進(jìn)IL。

于是我們得到了一個(gè)重要的結(jié)論:

var為語(yǔ)法糖,在編譯期間就已經(jīng)被編譯器所決定,開(kāi)發(fā)人員無(wú)法為編譯器決定類型。

隱式類型轉(zhuǎn)換為上述代碼帶來(lái)了良好的可讀性,任何一名開(kāi)發(fā)人員都會(huì)知道第2行代碼的var的類型,它讓我們更加的關(guān)注代碼片段中我們所需要關(guān)注的部分,而不是把重點(diǎn)放在它的類型上。因?yàn)榇蠖鄶?shù)時(shí)候,這都是沒(méi)有意義的。

3、隱式類型轉(zhuǎn)換所帶來(lái)的良好可讀性

為了明白良好可讀性的問(wèn)題,我們先來(lái)看一個(gè)代碼片段:

var foo = new SomeType();

以上代碼清晰明了,對(duì)于維護(hù)代碼的人來(lái)說(shuō),它沒(méi)有增加任何的理解成本,foo的類型就是SomeType類型。很多優(yōu)秀開(kāi)源項(xiàng)目中的大量被使用的工廠模式,也提供了類似的方法,如下代碼片段:

var huaWei = PhoneFactory.CreatePhone();

一個(gè)簡(jiǎn)單的靜態(tài)工廠類 PhoneFactory ,公開(kāi)了 CreatePhone 方法,閱讀這段代碼的開(kāi)發(fā)人員,在幾乎沒(méi)有增加理解成本的情況下,很清楚的知道huaWei代表手機(jī)工廠類所生產(chǎn)的一個(gè)手機(jī)對(duì)象。但是下面的代碼,情況可能就稍有不同了:

var result = someObject.DoSomething(someParameter);

你無(wú)法輕松的知道result的類型和它所表達(dá)的意義,事實(shí)上,它的不良好的可讀性,表現(xiàn)在以下幾個(gè)方面:

1、在此處,result這個(gè)變量名并不是最好的選擇;

2、someObject的含義不明;

3、DoSomething含糊不清;

4、無(wú)法明確的知道someParameter代碼什么。

如果換成以下代碼,情況會(huì)好很多:

var mostPopularPhone = someObject.DoSomething(someParameter);

情況有所好轉(zhuǎn),意思也更清楚。結(jié)合語(yǔ)義上下文,var的類型不言自明。但是在這種情況下,我依然建議大家將代碼改為以下形式:

Phone mostPopularPhone = someObject.DoSomething(someParameter);

這被我寫(xiě)在之前所在公司的開(kāi)發(fā)手冊(cè)上,我相信我的經(jīng)驗(yàn)一定是正確的。

讓我們?cè)賮?lái)看一個(gè)新的示例:

var score = GetSomeNumber();
 
var rate = score / 100;

rate的類型由變量score決定,然后開(kāi)發(fā)者無(wú)法一眼看出score的類型,所以這是一個(gè)不良好的可讀性的代碼片段,我們應(yīng)該改為:

var score = GetSomeNumber();
 
double rate = score / 100;

怎么樣,是不是看到這樣的代碼,心里舒服多了?因?yàn)槟愕睦斫獬杀靖土?,心情舒暢了,一下子搬磚都能搬到5樓了。

于是,我們有了兩點(diǎn)總結(jié):

1、當(dāng)含義明確,在代碼上下文較為清楚時(shí)(簡(jiǎn)單的變量定義或工廠方法),建議優(yōu)先使用var;

2、在其它復(fù)雜情況下,盡量直接寫(xiě)出var的類型。

隱式類型轉(zhuǎn)換所帶來(lái)的絕非僅僅是良好的可讀性,它有時(shí)可能會(huì)幫我們消除一些難以發(fā)現(xiàn)的Bug,這又是怎么回事呢?

4、隱式類型轉(zhuǎn)換幫我們解決嚴(yán)重的性能問(wèn)題

人自以為自己是世界上最聰明的生物,事實(shí)上并非如此,有時(shí)候,編譯器比我們聰明得多,也可靠得多。

我們看看以下兩個(gè)代碼片段:

public IEnumerable<string> GetPhoneStartsWith1(string prefix) {
  IEnumerable<string> phones =
          from r in db.Phones
          select r.PhoneName;
 
  var result = phones.Where(r => r.StartsWith(prefix));
  return result;
}
public IEnumerable<string> GetPhoneStartsWith2(string prefix) {
  var phones =
    from r in db.Phones
    select r.PhoneName;
 
  var result = phones.Where(r => r.StartsWith(prefix));
  return result;
}

以上兩段代碼有何不同?GetPhoneStartsWith1 方法中的 phones 原先的返回類型應(yīng)當(dāng)為 IQueryable<string>,但在這里被顯式聲明的 phones 的 IEnumerable<string> 強(qiáng)制轉(zhuǎn)換了,熟悉 EF 的朋友們一定知道,IQueryable<T> 為延遲加載,本身并不會(huì)立刻查詢數(shù)據(jù)庫(kù),事實(shí)上它只生成了一個(gè)表達(dá)式樹(shù),在最終需要使用數(shù)據(jù)的時(shí)候才會(huì)真正執(zhí)行查詢動(dòng)作。

于是 GetPhoneStartsWith1 方法將數(shù)據(jù)庫(kù)中的可能的所有數(shù)據(jù)全部取回本地,再由 var result = phones.Where(r => r.StartsWith(prefix)); 執(zhí)行本地過(guò)濾,消耗了太多網(wǎng)絡(luò)資源,并且使用了 .Net 的數(shù)據(jù)過(guò)濾機(jī)制。

GetPhoneStartsWith2 方法則不然,phones 的類型被編譯器推斷為 IQueryable<string> ,并不會(huì)因此執(zhí)行查詢操作,真正的查詢動(dòng)作由 var result = phones.Where(r => r.StartsWith(prefix)); 執(zhí)行,也就是說(shuō),它的數(shù)據(jù)過(guò)濾動(dòng)作由數(shù)據(jù)庫(kù)引擎負(fù)責(zé)運(yùn)算,最終只將符合條件的數(shù)據(jù)發(fā)送回本地,既節(jié)省了網(wǎng)絡(luò)傳遞成本,又節(jié)省了運(yùn)算成本,豈不是一舉兩得?

5、總結(jié)

  • 當(dāng)含義明確,在代碼上下文較為清楚時(shí)(簡(jiǎn)單的變量定義或工廠方法),建議優(yōu)先使用 var;
  • 在其它復(fù)雜情況下,盡量直接寫(xiě)出 var 的類型;
  • 盡可能地相信編譯器,大多數(shù)時(shí)候,它比我們優(yōu)秀得多。

開(kāi)發(fā)人員應(yīng)牢記以上開(kāi)發(fā)守則,否則,人民群眾會(huì)仇恨你,你的朋友和家人也會(huì)嘲笑你,唾棄你。

該系列文章由比特飛原創(chuàng)發(fā)布,計(jì)劃用三個(gè)月時(shí)間寫(xiě)完全30篇文章,為大家提供編寫(xiě)高質(zhì)量代碼的一般準(zhǔn)則。

總結(jié)

到此這篇關(guān)于編寫(xiě)高質(zhì)量代碼的30條黃金守則(首選隱式類型轉(zhuǎn)換)的文章就介紹到這了,更多相關(guān)編寫(xiě)高質(zhì)量代碼的30條黃金守則內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spark?GraphX?分布式圖處理框架圖算法詳解

    Spark?GraphX?分布式圖處理框架圖算法詳解

    這篇文章主要為大家介紹了Spark?GraphX?分布式圖處理框架圖算法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 自己的vscode-settings.json配置詳解

    自己的vscode-settings.json配置詳解

    這篇文章主要介紹了自己的vscode-settings.json配置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 詳解cron表達(dá)式

    詳解cron表達(dá)式

    Cron表達(dá)式是一個(gè)字符串,字符串以5或6個(gè)空格隔開(kāi),分為6或7個(gè)域,每一個(gè)域代表一個(gè)含義。接下來(lái)通過(guò)本文給大家詳細(xì)介紹cron表達(dá)式內(nèi)容,感興趣的朋友一起看看吧
    2018-04-04
  • git clone 子模塊沒(méi)下載全的問(wèn)題解決

    git clone 子模塊沒(méi)下載全的問(wèn)題解決

    這篇文章主要介紹了git clone 子模塊沒(méi)下載全的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 滑動(dòng)窗口算法高效率解決數(shù)組問(wèn)題

    滑動(dòng)窗口算法高效率解決數(shù)組問(wèn)題

    這篇文章主要為大家介紹了滑動(dòng)窗口算法高效率解決數(shù)組問(wèn)題詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • vscode如何設(shè)置默認(rèn)打開(kāi)的瀏覽器為Chrome

    vscode如何設(shè)置默認(rèn)打開(kāi)的瀏覽器為Chrome

    這篇文章主要介紹了vscode如何設(shè)置默認(rèn)打開(kāi)的瀏覽器為Chrome,需要的朋友可以參考下
    2020-08-08
  • 關(guān)于頁(yè)面刷新,事件重復(fù)提交的方法分享

    關(guān)于頁(yè)面刷新,事件重復(fù)提交的方法分享

    在處理頁(yè)面事件時(shí),我們會(huì)經(jīng)常會(huì)碰到這樣的情況:當(dāng)我們?cè)谔峤灰豁?xiàng)頁(yè)面表單時(shí),在提交成功后,當(dāng)我們?cè)噲D按F5刷新頁(yè)面時(shí),數(shù)據(jù)會(huì)再次的被重復(fù)提交
    2012-10-10
  • Visual Studio和Visual Studio Code之間有什么區(qū)別

    Visual Studio和Visual Studio Code之間有什么區(qū)別

    本文給大家介紹的是Visual Studio和Visual Studio Code之間有什么區(qū)別,希望對(duì)大家的學(xué)習(xí)能夠有所幫助
    2020-02-02
  • 12種實(shí)現(xiàn)301網(wǎng)頁(yè)重定向方法的代碼實(shí)例(含Web編程語(yǔ)言和Web服務(wù)器)

    12種實(shí)現(xiàn)301網(wǎng)頁(yè)重定向方法的代碼實(shí)例(含Web編程語(yǔ)言和Web服務(wù)器)

    這篇文章主要介紹了11種實(shí)現(xiàn)301網(wǎng)頁(yè)重定向方法的代碼實(shí)例,文中包含9種編程語(yǔ)言和3種WEB服務(wù)器配置方法,共計(jì)12種,需要的朋友可以參考下
    2014-07-07
  • 不懂編程該如何使用AI 編程技巧詳解

    不懂編程該如何使用AI 編程技巧詳解

    在當(dāng)今數(shù)字化時(shí)代,編程不再是專屬于程序員的領(lǐng)域,通過(guò)人工智能(AI)的協(xié)助,甚至是非編程專業(yè)人士也能輕松涉足,對(duì)于那些沒(méi)有編程基礎(chǔ)卻渴望利用 AI 進(jìn)行編程的人來(lái)說(shuō),AI 就是你編程學(xué)習(xí)的得力伙伴
    2023-11-11

最新評(píng)論

鲁山县| 邻水| 固始县| 南京市| 囊谦县| 乌拉特后旗| 尤溪县| 江阴市| 长兴县| 永嘉县| 辽宁省| 安国市| 东乌珠穆沁旗| 武汉市| 石首市| 阿尔山市| 新绛县| 手机| 辛集市| 沿河| 宁远县| 上高县| 东阳市| 鄯善县| 临安市| 南木林县| 东安县| 浪卡子县| 建平县| 广饶县| 乃东县| 武邑县| 自治县| 分宜县| 黑水县| 襄垣县| 苏州市| 宁国市| 曲阜市| 伽师县| 隆尧县|