欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

1、概述

隱式類型轉(zhuǎn)換是微軟為了 C# 支持匿名類型而加入的,使用 var 通常可以使代碼的可讀性更強,甚至是幫我們解決一些嚴重的性能問題。為了清楚的明白 var 的作用機制,我們首先來看看編譯器為 var 做了哪些工作?

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

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

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

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

我們再來看一下兩段代碼的IL:

本文示例的源代碼

DnSpy 的反編譯結(jié)果

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

注意:string也是語法糖,編譯時,string被替換為System.String寫進IL。

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

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

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

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

為了明白良好可讀性的問題,我們先來看一個代碼片段:

var foo = new SomeType();

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

var huaWei = PhoneFactory.CreatePhone();

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

var result = someObject.DoSomething(someParameter);

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

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

2、someObject的含義不明;

3、DoSomething含糊不清;

4、無法明確的知道someParameter代碼什么。

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

var mostPopularPhone = someObject.DoSomething(someParameter);

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

Phone mostPopularPhone = someObject.DoSomething(someParameter);

這被我寫在之前所在公司的開發(fā)手冊上,我相信我的經(jīng)驗一定是正確的。

讓我們再來看一個新的示例:

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

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

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

怎么樣,是不是看到這樣的代碼,心里舒服多了?因為你的理解成本更低了,心情舒暢了,一下子搬磚都能搬到5樓了。

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

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

2、在其它復雜情況下,盡量直接寫出var的類型。

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

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

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

我們看看以下兩個代碼片段:

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 原先的返回類型應當為 IQueryable<string>,但在這里被顯式聲明的 phones 的 IEnumerable<string> 強制轉(zhuǎn)換了,熟悉 EF 的朋友們一定知道,IQueryable<T> 為延遲加載,本身并不會立刻查詢數(shù)據(jù)庫,事實上它只生成了一個表達式樹,在最終需要使用數(shù)據(jù)的時候才會真正執(zhí)行查詢動作。

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

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

5、總結(jié)

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

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

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

總結(jié)

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

相關(guān)文章

  • Jenkins?腳本命令行應用小結(jié)

    Jenkins?腳本命令行應用小結(jié)

    這篇文章主要介紹了Jenkins?腳本命令行應用總結(jié),包括批量刪除Jenkins 項目構(gòu)建記錄,非多分支項目及分支項目,文章結(jié)合示例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-04-04
  • Jenkins使用publish?html?report插件展示HTML報告的方法

    Jenkins使用publish?html?report插件展示HTML報告的方法

    這篇文章主要介紹了Jenkins使用publish?html?report插件展示HTML報告的方法,展示普通的html如何展示在jenkins上,本文通過圖文并茂的形式給大家介紹的非常詳細,需要的朋友可以參考下
    2022-03-03
  • Git回退到指定版本三種方法及常見的錯誤

    Git回退到指定版本三種方法及常見的錯誤

    在Git中回退到指定版本并不是刪除或撤銷之前的提交,而是創(chuàng)建一個新的提交,該提交包含指定版本的內(nèi)容,這篇文章主要給大家介紹了關(guān)于Git回退到指定版本三種方法及常見的錯誤,需要的朋友可以參考下
    2024-03-03
  • 如何禁止瀏覽器使用后退按鈕功能

    如何禁止瀏覽器使用后退按鈕功能

    瀏覽器的后退按鈕使得我們能夠方便地返回以前訪問過的頁面,它無疑非常有用。但有時候我們不得不關(guān)閉這個功能,以防止用戶打亂預定的頁面訪問次序。
    2014-09-09
  • webp 格式圖片顯示異常分析及解決方案

    webp 格式圖片顯示異常分析及解決方案

    WebP,谷歌(google)開發(fā)的一種旨在加快圖片加載速度的圖片格式。提供了有損壓縮與無損壓縮(可逆壓縮)的圖片文件格式,能節(jié)省大量的服務(wù)器帶寬資源和數(shù)據(jù)空間,這篇文章主要介紹了webp 格式圖片顯示異常分析及解決方案,需要的朋友可以參考下
    2023-04-04
  • kafka?rabbitMQ及rocketMQ隊列的消息可靠性保證分析

    kafka?rabbitMQ及rocketMQ隊列的消息可靠性保證分析

    這篇文章主要介紹了kafka?rabbitMQ及rocketMQ隊列的消息可靠性保證分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • 基于IntelliJ IDEA/Android Studio插件開發(fā)指南(推薦)

    基于IntelliJ IDEA/Android Studio插件開發(fā)指南(推薦)

    Android Studio是基于Intellij IDEA開發(fā)的,所以開發(fā)Android Studio的插件,其實就是開發(fā)IDEA的插件。根據(jù)官方推薦,使用IDEA IDE來開發(fā)IDEA插件,本文給大家介紹插件開發(fā)的基本流程,感興趣的朋友一起看看吧
    2021-10-10
  • 淺析hosts 文件的作用及修改 hosts 文件的方法

    淺析hosts 文件的作用及修改 hosts 文件的方法

    hosts是一個沒有擴展名的系統(tǒng)文件,其基本作用就是將一些常用的網(wǎng)址域名與其對應的 IP 地址建立一個關(guān)聯(lián)“ 數(shù)據(jù)庫 ”。接下來通過本文給大家介紹hosts 文件的作用及修改 hosts 文件的方法,需要的朋友參考下吧
    2018-01-01
  • 使用.gitignore文件簡化Git倉庫管理

    使用.gitignore文件簡化Git倉庫管理

    .gitignore文件用于指定在git中應該被忽略的文件或目錄,前端的node_modules目錄包含大量文件,如果將其添加到版本管理系統(tǒng)中,會使倉庫變得龐大,不利于倉庫的管理,本文介紹了使用.gitignore文件來簡化你的Git倉庫管理
    2023-10-10
  • vscode怎么編譯運行

    vscode怎么編譯運行

    本文給大家分享的是vscode怎么一鍵編譯運行的方法,非常的簡單實用,有需要的小伙伴可以參考下
    2020-02-02

最新評論