日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

dart系列之:和null说再见,null使用真实实践

發(fā)布時間:2024/2/28 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 dart系列之:和null说再见,null使用真实实践 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 簡介
  • 不需要初始化對象為null
  • null的三元操作符
  • 如果在使用中需要判斷類型是否為空,則不要使用late
  • 本地變量的類型提升
  • 總結(jié)

簡介

null可能是大家在編寫程序中最為頭疼的一個東西,稍不留意的情況下就有可能使用到了這個空字符。所以dart在2.12引入了nll safety,默認(rèn)情況下強(qiáng)制所有的類型都不為null,只有在你認(rèn)為它可以為null的時候才可以設(shè)置為null。

雖然有了null safety,但是這里還有一些我們需要考慮的null的最佳實(shí)踐。

不需要初始化對象為null

在dart2.12之后,所有的對象都強(qiáng)制為非空的,除非你顯示指定其為可空的對象。

如果一個對象可以為空,那么我們可以這樣指定:

String? name;

如果定義一個對象可以為空,那么對dart來說會隱式對其初始化為null。

所以下面的顯示初始化為null是完全沒有必要的:

String? name=null;

同樣的,如果參數(shù)是一個可以為空的對象,那么dart也會將其初始化為null,我們也沒有必要顯示去設(shè)置其值:

void echoName(String? name){print(name); }

null的三元操作符

所謂三元就是有三個變量,我們常見的三元操作符就是?:,通常來說是這樣用的:

name==null?true:false;

上面的邏輯實(shí)際上是把一個null轉(zhuǎn)換成了一個bool類型。

為了實(shí)現(xiàn)這個功能,dart提供了一個更加簡潔的操作符??, 可以這樣使用:

name??false;

上面的代碼表示如果name是空,則返回false。

注意,這里只是返回值改變了,但是name值本身并沒有變化,也不會將name從一個可為空的類型,變成不為空的類型。所以如果我們在if語句里面對字符進(jìn)行判斷,則還是需要顯示進(jìn)行null的比較:

int measureMessage(String? message) {if (message != null && message.isNotEmpty) {// dart知道m(xù)essage不為空return message.length;}return 0; }

如果這樣編寫,則會出現(xiàn)異常:

int measureMessage(String? message) {if (message?.isNotEmpty ?? false) {//dart并不知道m(xù)essage不為空return message!.length;}return 0; }

如果在使用中需要判斷類型是否為空,則不要使用late

late是做什么用的呢?late表示該類型目前不會初始化,但是會在未來的某個時間對其進(jìn)行初始化。

所以,如果你用late表示某個類型,那么在后續(xù)使用的時候是不需要進(jìn)行手動判斷該類型是否為空的。

如果你仍然要手動判斷,那么就沒必要設(shè)置該類型為late。

本地變量的類型提升

dart有一個非常好的特性,就是當(dāng)我們判斷一個變量不為空之后,該變量就會被提升為非空變量。

當(dāng)提升為非空變量之后,就可以自由訪問該非空變量內(nèi)部的屬性和方法了。

但是可惜的是,dart中的類型提升只是針對與local變量或者參數(shù)而言的,對于類變量或者是top level的變量并不適用,所以我們需要將這些變量拷貝到本地變量,從而使用類型提升的特性。

我們看下面的例子:

class UploadException {final Response? response;UploadException([this.response]);@overrideString toString() {var response = this.response;if (response != null) {return 'Could not complete upload to ${response.url} ''(error code ${response.errorCode}): ${response.reason}.';}return 'Could not upload (no response).';} }

其中UploadException中的response是一個頂級變量,雖然我們對其進(jìn)行測試是否為空,但是在使用的過程中還是不能直接訪問其內(nèi)部的屬性,因?yàn)閞esponse可能為空。

為了使用dart的類型提升的特性,我們可以將頂級的變量賦值給一個本地變量,從而在null測試之后,自動將其提升為非空的類型,從而直接訪問其內(nèi)部的屬性。

總結(jié)

以上就是dart中null用法的最佳實(shí)踐。

本文已收錄于 http://www.flydean.com/29-dart-null-effective/

最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發(fā)現(xiàn)!

歡迎關(guān)注我的公眾號:「程序那些事」,懂技術(shù),更懂你!

總結(jié)

以上是生活随笔為你收集整理的dart系列之:和null说再见,null使用真实实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。