[譯]C# 7系列,Part 4: Discards 棄元

来源:https://www.cnblogs.com/wenhx/archive/2019/12/09/csharp-7-series-part-4-discards.html

原文:https://blogs.msdn.microsoft.com/mazhou/2017/06/27/c-7-series-part-4-discards/ 有時我們想要忽略一個方法返回的值,特別是那些out參數,一個典型的例子是檢查一個字元串是否可以解析成另一種類型: 這裡我們要忽略pars ...


原文:https://blogs.msdn.microsoft.com/mazhou/2017/06/27/c-7-series-part-4-discards/

有時我們想要忽略一個方法返回的值,特別是那些out參數,一個典型的例子是檢查一個字元串是否可以解析成另一種類型:

bool parsedValue;
if (bool.TryParse("TRUE", out parsedValue)) { /* 其他代碼 */ }

這裡我們要忽略parsedValue。我們還希望使這個變數不可訪問,以便開發人員不能引用它。

C# 7.0有一個叫做discards(譯註:官方翻譯:棄元)的新特性,可以在這個場景中用來實現我們的目標。

棄元

棄元是可以賦值但不能從中讀取的局部變數。也就是說,它們是“只寫”的局部變數。它們沒有名稱,而是用_(下劃線)表示。_是上下文關鍵字,與var非常相似,並且_不能被讀取(即不能出現在賦值的右側)。

如果我們將棄元應用到上面的代碼,它將看起來像這樣:

if (bool.TryParse("TRUE", out bool _)) { /* 其他代碼 */ }

因為_是不可讀的,所以它不會出現在IDE的智能感知中,也不會編譯代碼。

棄元適用的場景

  • 帶有out修飾符的聲明表達式,例如:bool.TryParse(“字元串”,out _)
  • 模式匹配子句,例如case int _ 或 if (x is string _)
  • 解構:
    • 在聲明中:如var (a, _, c) = myObj
    • 在賦值:如var a, b;(a, b, _) = myObj
    • 值元組解構:例如 var (a, _, _) = (1,2,3)

關鍵字_

請始終記住_是一個上下文相關的關鍵字,就像var一樣,這意味著如果您已經在當前上下文中聲明瞭一個局部變數_,並且它位於作用域中,那麼_將不是一個棄元,而是會在作用域中引用該局部變數。

更有趣的是,看看下麵的代碼:

bool _ = false, v = false;
if (bool.TryParse("TRUE", out var _))
{
     v = _;
}

v的值是多少?

答案是false。if的條件為真,因為字元串“true”可以解析為一個布爾值true,但是這裡我們用了out var _,這覆蓋了前面聲明的變數_的作用域,它是一個棄元。然後,if語句中的賦值v = _只讀取前面聲明的局部變數_的值(為false),並賦值給v,因此v的值為false。如果我們刪除var來將代碼更改為out _,那麼v的值將為true,因為_不再是一個棄元了(譯註:是一個普通變數),並且它保存瞭解析後的布爾值。

結論

C#中的棄元允許忽略一些局部變數。這是一個設計時特性,運行時可能仍然需要這個局部變數,編譯器也可能為它生成一個名稱。因為_關鍵字是上下文關鍵字,所以你需要設置一個編碼策略來避免使用_作為名稱聲明局部變數以減少混淆。這個特性與早期的.NET版本相容,因為它不需要更改CLR。 

 

系列文章:


您的分享是我們最大的動力!

更多相關文章
一周排行
  • 比如要拆分“呵呵呵90909086676喝喝999”,下麵當type=0返回的是中文字元串“呵呵呵,喝喝”,type=1返回的是數字字元串“90909086676,999”, private string GetStrings(string str,int type=0) { IList<strin ...
  • Swagger一個優秀的Api介面文檔生成工具。Swagger可以可以動態生成Api介面文檔,有效的降低前後端人員關於Api介面的溝通成本,促進項目高效開發。 1、使用NuGet安裝最新的包:Swashbuckle.AspNetCore。 2、編輯項目文件(NetCoreTemplate.Web.c ...
  • 2020 年 7 月 30 日, 由.NET基金會和微軟 將舉辦一個線上和為期一天的活動,包括 微軟 .NET 團隊的演講者以及社區的演講者。本次線上大會 專註.NET框架構建微服務,演講者分享構建和部署雲原生應用程式的最佳實踐、模式、提示和技巧。有關更多信息和隨時瞭解情況:https://focu... ...
  • #abp框架Excel導出——基於vue #1.技術棧 ##1.1 前端採用vue,官方提供 UI套件用的是iview ##1.2 後臺是abp——aspnetboilerplate 即abp v1,https://github.com/aspnetboilerplate/aspnetboilerp ...
  • 前言 本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 作者:碧茂大數據 PS:如有需要Python學習資料的小伙伴可以加下方的群去找免費管理員領取 input()輸入 Python提供了 input() 內置函數從標準輸入讀入一 ...
  • 從12年到20年,python以肉眼可見的趨勢超過了java,成為了當今It界人人皆知的編程語言。 python為什麼這麼火? 網路編程語言搜索指數 適合初學者 Python具有語法簡單、語句清晰的特點,這就讓初學者在學習階段可以把精力集中在編程對象和思維方法上。 大佬都在用 Google,YouT ...
  • 在社會上存在一種普遍的對培訓機構的學生一種歧視的現象,具體表現在,比如:當你去公司面試的時候,一旦你說了你是培訓機構出來的,那麼基本上你就涼了,那麼你瞞著不說,然後又通過了面試成功入職,但是以後一旦在公司被髮現有培訓經歷,可能會面臨被降薪,甚至被辭退,培訓機構出來的學生,在用人單位眼裡就是能力低下的 ...
  • from typing import List# 這道題看了大佬寫的代碼,經過自己的理解寫出來了。# 從最外圍的四周找有沒有為O的,如果有的話就進入深搜函數,然後深搜遍歷# 判斷上下左右的位置是否為Oclass Solution: def solve(self, board: List[List[s ...
  • import requests; import re; import os; # 1.請求網頁 header = { "user-agent":'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, li ...
  • import requests; import re; import os; import parsel; 1.請求網頁 header = { "user-agent":'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537. ...