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

淺談C#9.0新特性之參數(shù)非空檢查簡(jiǎn)化

 更新時(shí)間:2020年06月16日 10:38:52   作者:王亮  
這篇文章主要介紹了淺談C#9.0新特性之參數(shù)非空檢查簡(jiǎn)化,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

參數(shù)非空檢查是縮寫類庫很常見的操作,在一個(gè)方法中要求參數(shù)不能為空,否則拋出相應(yīng)的異常。比如:

public static string HashPassword(string password)
{
  if(password is null)
  {
    throw new ArgumentNullException(nameof(password));
  }
  ...
}

當(dāng)異常發(fā)生時(shí),調(diào)用者很容易知道是什么問題。如果不加這個(gè)檢查,可能就會(huì)由系統(tǒng)拋出未將對(duì)象引用為實(shí)例之類的錯(cuò)誤,這不利于調(diào)用者診斷錯(cuò)誤。

由于這個(gè)場(chǎng)景太常見了,于是我經(jīng)常在我的項(xiàng)目中通過一個(gè)輔助類來做此類檢查。這個(gè)類用來檢查方法參數(shù),所以命名為 Guard,主要代碼如下:

public static class Guard
{
  public static void NotNull(object param, string paramName)
  {
    if (param is null)
    {
      throw new ArgumentNullException(paramName);
    }
  }

  public static void NotNullOrEmpty(string param, string paramName)
  {
    NotNull(param, paramName);
    if (param == string.Empty)
    {
      throw new ArgumentException($"The string can not be empty.", paramName);
    }
  }

  public static void NotNullOrEmpty<T>(IEnumerable<T> param, string paramName)
  {
    NotNull(param, paramName);
    if (param.Count() == 0)
    {
      throw new ArgumentException("The collection can not be empty.", paramName);
    }
  }
  ...
}

這個(gè)類包含了三個(gè)常見的非空檢查,包括 null、空字符串、空集合的檢查。使用示例:

public static string HashPassword(string password)
{
  Guard.NotNull(password, nameof(password));
  ...
}

public static IEnumerable<TSource> DistinctBy<TSource, TKey>(
  this IEnumerable<TSource> source,
  Func<TSource, TKey> keySelector)
{
  Guard.NotNullOrEmpty(source, nameof(source));
  ...
}

介于這種非空檢查極其常見,C# 9.0 對(duì)此做了簡(jiǎn)化,增加了操作符‘!',放在參數(shù)名后面,表示此參數(shù)不接受 null 值。使用方式如下:

public static string HashPassword(string password!)
{
  ...
}

簡(jiǎn)化了很多有木有。這個(gè)提案已經(jīng)納入 C# 9.0 的特性中,但目前(2020-06-13)還沒有完成開發(fā)。

這個(gè)特性只支持非 null 檢查,其它參數(shù)檢查場(chǎng)景還是不夠用的,我還是會(huì)通過輔助類來進(jìn)行像空字符串、空集合的檢查。

這個(gè)特性在寫公共類庫的時(shí)候很有用,但我想大多數(shù)人在寫業(yè)務(wù)邏輯代碼的時(shí)候可能用不到這個(gè)特性,一般會(huì)封自己的參數(shù)檢查機(jī)制。比如,我在項(xiàng)目中,對(duì)于上層 API 開發(fā),我通過封裝一個(gè)輔助類(ApiGuard)來對(duì)對(duì)參數(shù)進(jìn)行檢查,如果參數(shù)不通過,則拋出相應(yīng)的業(yè)務(wù)異常,而不是 ArgumentNullException。比如下面的一段截取自我的 GeekGist 小項(xiàng)目的代碼:

public static class ApiGuard
{
  public static void EnsureNotNull(object param, string paramName)
  {
    if (param == null) throw new BadRequestException($"{paramName} can not be null.");
  }

  public static void EnsureNotEmpty<T>(IEnumerable<T> collection, string paramName)
  {
    if (collection == null || collection.Count() == 0)
      throw new BadRequestException($"{paramName} can not be null or empty.");
  }

  public static void EnsureExist(object value, string message = "Not found")
  {
    if (value == null) throw new BadRequestException(message);
  }

  public static void EnsureNotExist(object value, string message = "Already existed")
  {
    if (value != null) throw new BadRequestException(message);
  }
  ...
}

使用示例:

public async Task UpdateAsync(long id, BookUpdateDto dto)
{
  ApiGuard.EnsureNotNull(dto, nameof(dto));
  ApiGuard.EnsureNotEmpty(dto.TagValues, nameof(dto.TagValues));

  var book = await DbSet
    .Include(x => x.BookTags)
    .FirstOrDefaultAsync(x => x.Id == id);
  ApiGuard.EnsureExist(book);

  Mapper.Map(dto, book);

  ...
}

ApiGuard 的好處是,當(dāng) API 接口接到不合要求的參數(shù)時(shí),可以自定義響應(yīng)返回內(nèi)容。比如,增加一個(gè) Filter 或中間件用來全局捕獲業(yè)務(wù)代碼異常,根據(jù)不同的異常返回給前端不同的狀態(tài)碼和消息提示:

private Task HandleExceptionAsync(HttpContext context, Exception exception)
{
  ApiResult result;
  if (exception is BadRequestException)
  {
    result = ApiResult.Error(exception.Message, 400);
  }
  else if (exception is NotFoundException)
  {
    message = string.IsNullOrEmpty(message) ? "Not Found" : message;
    result = ApiResult.Error(message, 404);
  }
  else if (exception is UnauthorizedAccessException)
  {
    message = string.IsNullOrEmpty(message) ? "Unauthorized" : message;
    result = ApiResult.Error(message, 401);
  }
  ...
}

只是一個(gè)參數(shù)非空檢查,在實(shí)際開發(fā)中卻有不少的學(xué)問,所以學(xué)好了理論還要多實(shí)踐才能更透徹的理解它。

到此這篇關(guān)于淺談C#9.0新特性之參數(shù)非空檢查簡(jiǎn)化的文章就介紹到這了,更多相關(guān)C#9.0 參數(shù)非空檢查 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

作者:王亮
出處:http://cnblogs.com/willick
聯(lián)系:liam.wang@live.com

相關(guān)文章

  • C#中dotnetcharting的用法實(shí)例詳解

    C#中dotnetcharting的用法實(shí)例詳解

    這篇文章主要介紹了C#中dotnetcharting的用法,以實(shí)例形式詳細(xì)分析了基于dotnetcharting的圖表繪制的各種常用方法,是非常實(shí)用的技巧,需要的朋友可以參考下
    2014-10-10
  • c#實(shí)現(xiàn)在圖上畫漢字

    c#實(shí)現(xiàn)在圖上畫漢字

    這篇文章主要介紹了c#實(shí)現(xiàn)在圖上畫漢字方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • c#給圖片添加文字的代碼小結(jié)

    c#給圖片添加文字的代碼小結(jié)

    c#編程中,我們需要為圖片添加文字水印,那么就可以參考下面的幾個(gè)代碼
    2012-11-11
  • C#使用HttpClient的正確方式你了解嗎

    C#使用HttpClient的正確方式你了解嗎

    在微服務(wù)架構(gòu)體系中經(jīng)常需要向特定?URL?地址發(fā)送?Http?請(qǐng)求操作,在?.net?core?中?httpClient?使用不當(dāng)會(huì)造成災(zāi)難性的問題,這篇文章主要來分享?.net?core?中通過?IHttpClientFactory?工廠來使用?HttpClient?的正確打開方式
    2021-11-11
  • C#中的自動(dòng)類型轉(zhuǎn)換和強(qiáng)制類型轉(zhuǎn)換

    C#中的自動(dòng)類型轉(zhuǎn)換和強(qiáng)制類型轉(zhuǎn)換

    這篇文章主要介紹了C#中的自動(dòng)類型轉(zhuǎn)換和強(qiáng)制類型轉(zhuǎn)換,非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-08-08
  • XAML如何獲取元素的位置

    XAML如何獲取元素的位置

    這篇文章主要為大家詳細(xì)介紹了XAML如何獲取元素的位置,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • C#正則表達(dá)式大全

    C#正則表達(dá)式大全

    本文詳細(xì)講解了C#正則表達(dá)式的用法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • C# 構(gòu)造函數(shù)如何調(diào)用虛方法

    C# 構(gòu)造函數(shù)如何調(diào)用虛方法

    這篇文章主要介紹了C# 構(gòu)造函數(shù)如何調(diào)用虛方法,文中講解非常詳細(xì),示例代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • C#實(shí)現(xiàn)自定義動(dòng)畫鼠標(biāo)的示例詳解

    C#實(shí)現(xiàn)自定義動(dòng)畫鼠標(biāo)的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)自定義動(dòng)畫鼠標(biāo)效果,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • C#實(shí)現(xiàn)根據(jù)圖片的鏈接地址獲取圖片的后綴名

    C#實(shí)現(xiàn)根據(jù)圖片的鏈接地址獲取圖片的后綴名

    這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)根據(jù)圖片的鏈接地址獲取圖片的后綴名,文中的實(shí)現(xiàn)方法講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-02-02

最新評(píng)論

阜城县| 溆浦县| 偃师市| 武义县| 新郑市| 万安县| 灵川县| 渝北区| 惠州市| 西峡县| 格尔木市| 宁远县| 柳江县| 鲁山县| 安塞县| 长顺县| 巫山县| 沧州市| 海口市| 平湖市| 马山县| 新巴尔虎右旗| 都安| 宁化县| 南召县| 东乌| 滨州市| 芜湖市| 孟村| 景谷| 凤冈县| 册亨县| 泸溪县| 桦南县| 抚顺市| 观塘区| 贡嘎县| 思茅市| 美姑县| 鄄城县| 册亨县|