精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

從NullObject談C#6.0改進

開發 后端 開發工具
本文來聊一聊我們經常會做的空值檢查問題,從一個簡單的空值檢查Any Where,到設計模式的NullObjectPattern,再到C#6.0“可能”會提供的語法,讓我們體驗一次語言開發上的“持續改進”,Let’s go~

[[131771]]

什么是空引用異常

作為一個敲過代碼的碼農來說,似乎沒有誰沒有遇到過NullReferenceException這 個問題,有些時候當方法內部調用一個屬性、方法(委托)時,我們控制這些屬性在“外部”的表現(當然某些情況下使用ref關鍵字除外),所以我們要在方法 的內部去判斷屬性、委托方法是否為Null來避免可能的、錯誤使用上帶來的空引用異常,這樣當我們知道如果對象為Null的話,我們會實現符合我們“預 期”的行為。

解決空引用異常---Check Any Where

這很簡單,我只要在需要用的地方檢查一下是否為Null就可以了。是的,這非常簡單,語義也很清晰,但是當你要重復檢查一個對象實體10000萬次時,你的代碼中將存在10000個如下代碼段:

 

  1. public void Check() 
  2.         { 
  3.             if (Person.AlivePerson() != null
  4.             { 
  5.                 Person.AlivePerson().KeepAlive = true
  6.             }  
  7.         } 

 

你能容忍這樣的行為嗎?

         If(OK)

                   Continue;

         Else

                   Close;

應用NullObject設計模式

NullObjectPattern出自forth by Gamma(設計模式4人組),核心內容是:提供一個給定對象的空值代理,空值代理中提供不做任何事情的方法實現。

接下來讓我們看看維基百科上的C#實現:

 

  1. // compile as Console Application, requires C# 3.0 or higher 
  2. using System; 
  3. using System.Linq; 
  4. namespace MyExtensionWithExample { 
  5.     public static class StringExtensions {  
  6.         public static int SafeGetLength(this string valueOrNull) {  
  7.             return (valueOrNull ?? string.Empty).Length;  
  8.         } 
  9.     } 
  10.     public static class Program { 
  11.         // define some strings 
  12.         static readonly string[] strings = new [] { "Mr X.""Katrien Duck"null"Q" }; 
  13.         // write the total length of all the strings in the array 
  14.         public static void Main(string[] args) { 
  15.             var query = from text in strings select text.SafeGetLength(); // no need to do any checks here 
  16.             Console.WriteLine(query.Sum()); 
  17.         // The output will be: 18  
  18.         } 
  19.     } 

 

在C#語言中,我們通過靜態的擴展方法來實現將檢查方式統一在方法內部,而不是寫的到處都是,上面的例子中是在String類上實現了一個SafeGetLength擴展方法,將為所有String類型提供了一個方法,這樣我們在“代碼整潔”上又進了一步。

下面我們再來看一個更常用的例子---來自于StackOverFlow

***,說一個細節問題,以上代碼均沒有實現“線程安全”,在大牛Eric Lippert的文章中針對線程安全有過一個更精彩的討論,請戳這里

改進后的代碼時在方法內部增加了一個臨時變量,作為方法內部的拷貝,實現線程安全,如果有疑問請參考我的《C#堆vs棧》中對方法內部變量在堆棧上的表現一章。

 

  1. public class SomeClass 
  2.     { 
  3.         public event EventHandler<EventArgs> MyEvent; 
  4.  
  5.         private void DoSomething() 
  6.         { 
  7.             var tmp = MyEvent; 
  8.  
  9.             tmp.Raise(this, EventArgs.Empty); 
  10.         } 
  11.     } 

 

 #p#

更“潮”的方式-C#6.0語法

      來自MSDN Magazine的Mark Michaelis(《C#本質論》作者)給我們介紹了C#6.0在語言可能帶來的新改進,其中就有針對“Null條件運算符”的改進。

  C#6.0更多參考:

  Part One: https://msdn.microsoft.com/zh-cn/magazine/dn683793.aspx

  Part Two: https://msdn.microsoft.com/zh-cn/magazine/dn802602.aspx

  即使是 .NET 開發新手,也可能非常熟悉 NullReferenceException。有一個例外是幾乎總是會指出一個 Bug,因為開發人員在調用 (null) 對象的成員之前未進行充分的 null 檢查。請看看以下示例:

 

  1. public static string Truncate(string value, int length) 
  2.   string result = value; 
  3.   if (value != null// Skip empty string check for elucidation 
  4.   { 
  5.     result = value.Substring(0, Math.Min(value.Length, length)); 
  6.   } 
  7.   return result; 

 

如果不進行 null 檢查,此方法會引發 NullReferenceException。盡管這很簡單,但檢查字符串參數是否為 null 的過程卻稍微有些繁瑣。通常,考慮到比較的頻率,該繁瑣的方法可能沒有必要。C# 6.0 包括一個新的 null 條件運算符,可幫助您更加簡便地編寫這些檢查:

 

  1. public static string Truncate(string value, int length) 
  2. {           
  3.   return value?.Substring(0, Math.Min(value.Length, length)); 
  4.  
  5. [TestMethod] 
  6. public void Truncate_WithNull_ReturnsNull() 
  7.   Assert.AreEqual<string>(null, Truncate(null42)); 

 

根據 Truncate_WithNull_ReturnsNull 方法所演示的內容,如果對象的值實際上為 null,則 null 條件運算符將返回 null。這帶來了一個問題,即 null 條件運算符在調用鏈中出現時會是什么情況?如以下示例中所示:

 

  1. public static string AdjustWidth(string value, int length) 
  2.   return value?.Substring(0, Math.Min(value.Length, length)).PadRight(length); 
  3.  
  4. [TestMethod] 
  5. public void AdjustWidth_GivenInigoMontoya42_ReturnsInigoMontoyaExtended() 
  6.   Assert.AreEqual<int>(42, AdjustWidth("Inigo Montoya"42).Length); 

 

盡管 Substring 是通過 null 條件運算符進行調用的,并且 null value?.Substring 似乎返回了 null,但語言行為按您的想法進行。這簡化了對 PadRight 的調用過程,并立即返回 null,從而避免會導致出現 NullReferenceException 的編程錯誤。這個概念稱為“null 傳播”。

Null 條件運算符會根據具體條件進行 null 檢查,然后再調用目標方法以及調用鏈中的所有其他方法。這將可能產生一個令人驚訝的結果,例如,text?.Length.GetType 語句中的結果。

如果 null 條件運算符在調用目標為 null 時返回 null,那么調用會返回值類型的成員時最終會是什么數據類型(假定值類型不能為 null)?例如,從 value?.Length 返回的數據類型不能只是 int。答案當然是:可以為 null 的類型(int?)。實際上,嘗試僅將結果分配給 int 將會出現編譯錯誤:

int length = text?.Length; // Compile Error: Cannot implicitly convert type 'int?' to 'int'

Null 條件具有兩種語法形式。首先,問號在點運算符前面 (?.)。其次,將問號和索引運算符結合使用。例如,給定一個集合(而非在索引到集合之前顯式進行 null 檢查),您就可以使用 null 條件運算符執行此操作:

 

  1. public static IEnumerable<T> GetValueTypeItems<T>( 
  2.   IList<T> collection, params int[] indexes) 
  3.   where T : struct 
  4.   foreach (int index in indexes) 
  5.   { 
  6.     T? item = collection?[index]; 
  7.     if (item != null) yield return (T)item; 
  8.   } 

 

  此示例使用了運算符 ?[…] 的 null 條件索引形式,導致僅在集合不為 null 時才索引到集合。通過 null 條件運算符的此形式,T? item = collection?[index] 語句在行為上相當于:

T? item = (collection != null) ? collection[index] : null.

請注意,null 條件運算符僅可檢索項目,不會分配項目。如果給定 null 集合,那么這意味著什么?

請注意針對引用類型使用 ?[…] 時的隱式歧義。由于引用類型可以為 null,因此對于集合是否為 null,或者是否元素本身實際上就是 null 而言,來自 ?[…] 運算符的 null 結果不明確。

Null 條件運算符的一個非常有用的應用程序解決了 C# 自 C# 1.0 以來一直存在的的一個特性,即在調用委托之前檢查是否為 null。我們來看一下中顯示的 C# 2.0 代碼。

  圖 1 在調用委托之前檢查是否為 Null

 

  1. class Theremostat 
  2.   event EventHandler<float> OnTemperatureChanged; 
  3.   private int _Temperature; 
  4.   public int Temperature 
  5.   { 
  6.     get 
  7.     { 
  8.       return _Temperature; 
  9.     } 
  10.     set 
  11.     { 
  12.       // If there are any subscribers, then 
  13.       // notify them of changes in temperature 
  14.       EventHandler<float> localOnChanged = 
  15.         OnTemperatureChanged; 
  16.       if (localOnChanged != null
  17.       { 
  18.         _Temperature = value; 
  19.         // Call subscribers 
  20.         localOnChanged(this, value); 
  21.       } 
  22.     } 
  23.   } 

 

  通過使用 null 條件運算符,整個 set 實現過程就可簡化為:

OnTemperatureChanged?.Invoke(this, value)

  現在,您只需對將 null 條件運算符作為前綴的 Invoke 進行調用,不再需要將委托實例分配給本地變量,從而實現線程安全,甚至是在調用委托之前顯式檢查值是否為 null。

C# 開發人員都很想知道在***的四個版本中是否對此內容有所改進。答案是最終進行了改進。僅此一項功能就可以改變調用委托的方式。

另一個 null 條件運算符普及的常見模式是與 coalesce 運算符結合使用。您無需在調用 Length 之前對 linesOfCode 進行 null 檢查,而是可以編寫項目計數算法,如下所示:

List<string> linesOfCode = ParseSourceCodeFile("Program.cs"); return linesOfCode?.Count ?? 0;

在這種情況下,任何空集合(無項目)和 null 集合均標準化為返回相同數量。總之,null 條件運算符將實現以下功能:

  1.  如果操作數為 null,則返回 null

  2.  如果操作數為 null,則簡化調用鏈中的其他調用

  3.  如果目標成員返回一個值類型,則返回可以為 null 的類型 (System.Nullable<T>)。

  4.  以線程安全的方式支持委托調用

  5.  可用作成員運算符 (?.) 和索引運算符 (?[…])

 示例代碼下載

引用

http://stackoverflow.com/questions/13629051/net-event-raising-and-nullobject-pattern ---線程安全的擴展機制

https://msdn.microsoft.com/zh-cn/magazine/dn802602.aspx ---C#6.0 Null條件運算符

http://en.wikipedia.org/wiki/Null_Object_pattern ---維基百科上的NullObjectPattern解釋

作者:Stephen Cui
出處:http://www.cnblogs.com/cuiyansong

責任編輯:王雪燕 來源: 博客園
相關推薦

2011-04-12 16:40:40

C++復雜度

2010-07-19 09:01:54

.NET 4.0緩存

2016-04-07 10:33:32

知乎執行力

2017-09-27 18:21:36

報表性能集算器

2013-08-15 13:29:52

Moco程序庫設計

2011-06-29 18:12:17

2015-07-02 10:37:32

C#Json字符串類代碼

2010-04-23 09:07:14

2011-07-29 10:32:31

黑莓BBMBBM 6.0

2011-12-06 10:04:12

QQ手機移動應用應用設計

2020-12-20 10:02:17

ContextReactrender

2014-04-15 13:16:00

Code Review

2010-07-23 15:13:11

身份驗證云服務

2010-01-14 11:07:59

Visual C++

2010-01-11 11:02:59

Visual C++

2010-01-21 10:44:59

Visual C++

2020-08-27 07:32:37

MySQL半成品狀態

2020-01-13 10:45:35

JavaScript解析前端

2017-05-05 14:26:43

2021-02-20 09:47:44

Covid-19工業智能
點贊
收藏

51CTO技術棧公眾號

亚洲高清免费| 少妇高潮一区二区三区99| 91麻豆视频网站| 国产成人精品a视频一区www| 男人晚上看的视频| 97久久精品| 欧美在线视频你懂得| 永久免费在线看片视频| 五月婷婷六月丁香| 久久精品国产免费看久久精品| 久久最新资源网| 免费a级黄色片| 香蕉久久久久久| 亚洲成人一区二区在线观看| 婷婷久久青草热一区二区 | 国产日产一区二区三区| 成人久久18免费网站麻豆| 国产成人在线亚洲欧美| 久操免费在线视频| 成人在线电影在线观看视频| 精品美女一区二区| www欧美激情| 国产高清自产拍av在线| 国产精品家庭影院| 欧美精品在线一区| 粉嫩av一区二区夜夜嗨| 激情综合五月婷婷| 日本久久精品视频| 伊人国产在线观看| 久久精品一区二区不卡| 国产一区二区日韩精品欧美精品| 国产伦精品一区二区三区88av| 色8久久影院午夜场| 亚洲成a人v欧美综合天堂下载 | 亚洲av无码一区二区二三区| 国产在线一区不卡| 欧美午夜电影网| 欧美 激情 在线| missav|免费高清av在线看| 中文字幕在线观看不卡视频| 欧美日韩精品中文字幕一区二区| 亚洲高清精品视频| 激情五月婷婷综合| 国产精品久久久久aaaa九色| 黑人一级大毛片| 激情综合亚洲| 免费97视频在线精品国自产拍| 亚洲精品91在线| 一区三区在线欧| 亚洲精品v天堂中文字幕| 日韩大尺度视频| 视频精品一区| 欧美大片一区二区三区| 美女流白浆视频| 欧美视频三区| 日韩精品中午字幕| 韩国三级hd中文字幕有哪些| 成人国产精品一区二区网站| 欧美精品第1页| 中文字幕 欧美日韩| 欧美性生活一级| 精品视频在线免费| 欧美在线观看视频网站| 精灵使的剑舞无删减版在线观看| 一区二区在线看| 日韩亚洲欧美一区二区| 欧美人与牲禽动交com| 一区二区三区产品免费精品久久75| 特级西西人体www高清大胆| 黄色网在线免费看| 夜夜亚洲天天久久| 国产手机免费视频| 久热在线观看视频| 日本精品视频一区二区| 欧美精品性生活| 成人噜噜噜噜| 亚洲成人黄色网| v8888av| 欧美一区二区三| 色爱精品视频一区| 欧美成人免费观看视频 | 啊啊啊一区二区| 性高爱久久久久久久久| 欧美另类videos死尸| 国产人妻精品久久久久野外| 成人午夜网址| 亚洲免费一在线| 欧美h片在线观看| 亚洲视频高清| 国产精品成人播放| 国产成人麻豆精品午夜在线| 成人高清av在线| 日本不卡二区高清三区| 国产黄大片在线观看画质优化| 夜夜揉揉日日人人青青一国产精品| 成人性生活视频免费看| 奇米777日韩| 日韩一区二区免费电影| 国产ts丝袜人妖系列视频| 日韩精品诱惑一区?区三区| 欧美国产日韩一区二区在线观看| 国产精品国产三级国产专区52| 日本伊人精品一区二区三区观看方式| 91九色精品视频| 乱色精品无码一区二区国产盗| 2024国产精品视频| 在线天堂一区av电影| 国产中文在线播放| 欧美精品在线观看播放| 艳妇乳肉亭妇荡乳av| 色狮一区二区三区四区视频| 欧美黄色三级网站| 久久精品99北条麻妃| 丁香五精品蜜臀久久久久99网站 | 成人精品福利| 天天色天天操综合| 亚洲18在线看污www麻豆| 日本国产精品| 九九精品在线观看| 中文字幕av无码一区二区三区| 国产成人综合亚洲91猫咪| 三区精品视频| 欧美男男激情videos| 日韩美女视频在线| 2025国产精品自拍| 日本成人中文字幕| 美女一区视频| 黑人玩欧美人三根一起进| 欧美亚洲图片小说| 手机av免费看| 亚洲激情另类| 超碰在线97av| 成人午夜在线影视| 欧美制服丝袜第一页| 欧美色图亚洲激情| 亚洲精品1区| 国产成人看片| 在线视频国产区| 欧美精品精品一区| 四虎国产成人精品免费一女五男| 性一交一乱一区二区洋洋av| 国产精品美女久久久久av福利| 成人在线直播| 制服丝袜av成人在线看| 亚洲欧美综合7777色婷婷| 人人精品人人爱| 日本免费高清一区二区| 悠悠资源网亚洲青| 日韩久久精品成人| 美日韩一二三区| 2024国产精品| 欧美成人免费高清视频| 最新精品国偷自产在线| 奇门遁甲1982国语版免费观看高清| 天堂av中文字幕| 天天综合色天天综合| 日批在线观看视频| 午夜亚洲性色福利视频| 久久精品日韩| 人人鲁人人莫人人爱精品| 亚洲欧美三级在线| 波多野结衣二区三区| 国产日韩一级二级三级| 少妇网站在线观看| 久久久久久免费视频| 91中文在线视频| 肉体视频在线| 日韩成人av网址| 人妻丰满熟妇av无码区| 欧美国产日韩亚洲一区| 免费黄频在线观看| 欧美日韩hd| 国语精品中文字幕| free欧美| 久久精品国产亚洲精品| www.国产麻豆| 欧美日韩中文在线观看| 怡红院一区二区三区| 精品无人码麻豆乱码1区2区| 免费人成自慰网站| 亚洲日产av中文字幕| 国产精品无av码在线观看| 福利在线视频网站| 亚洲精品狠狠操| 亚洲最新av网站| 一区二区三区小说| 亚洲av无码国产精品久久| 日产国产欧美视频一区精品| www亚洲国产| 日韩激情啪啪| 国产在线观看精品| 7777kkk亚洲综合欧美网站| 亚洲欧洲第一视频| 国产精品亚洲lv粉色| 午夜精品福利一区二区蜜股av| 日韩免费成人av| 国产精品69毛片高清亚洲| 97成人在线观看视频| 香蕉综合视频| 免费观看成人高| 国产精品视频一区二区三区| 4438全国亚洲精品在线观看视频| av在线收看| 亚洲成年人在线播放| 中文字幕视频二区| 亚洲成年人网站在线观看| 色撸撸在线视频| 99久久免费视频.com| 免费成年人高清视频| 99成人在线| 日本一道在线观看| 一区二区三区日本久久久| 国产69精品久久久久9999apgf | 国产在线更新| 亚洲视频电影图片偷拍一区| 国产91麻豆视频| 欧美色大人视频| 中文字幕第15页| 亚洲精品国产精华液| 极品人妻videosss人妻| www.激情成人| 手机精品视频在线| 日本 国产 欧美色综合| 欧美日本视频在线观看| 一区二区三区四区在线观看国产日韩| 欧美精品123| 欧美黄色影院| 北条麻妃高清一区| 999精品视频在线观看| 国产精品久久久久久久久久免费| 77thz桃花论族在线观看| 久久综合免费视频| 秋霞成人影院| 中文字幕精品久久久久| 视频国产在线观看| 亚洲精品大尺度| 成人1区2区3区| 91精品国产91热久久久做人人| 看黄色一级大片| 日本道色综合久久| 成人免费a视频| 精品久久久久久久久久久| 国产精品第56页| 一区二区久久久久久| 天天做夜夜爱爱爱| 亚洲日本在线看| 99成人在线观看| 国产精品久久久久影院色老大| 亚洲精品国产91| 久久青草国产手机看片福利盒子| 国产精品无码一区二区三| 成人三级在线视频| 师生出轨h灌满了1v1| 风间由美性色一区二区三区| 久久久久无码国产精品一区李宗瑞| 精品系列免费在线观看| www.成人黄色| 国产精品一卡二卡在线观看| 国模大尺度视频| 国产成人在线观看| 中文字幕人妻一区| 99精品国产视频| 91中文字幕永久在线| 2021久久国产精品不只是精品| 中文字幕免费高清| 国产精品第四页| 欧美成欧美va| 黄色成人在线免费| 久久人人爽人人爽人人片av免费| 欧美日韩在线亚洲一区蜜芽| www.亚洲天堂.com| 亚洲精品v天堂中文字幕| 黄色的视频在线免费观看| 视频在线观看99| av片在线观看网站| 欧美激情视频网| 色戒汤唯在线观看| 国产欧美va欧美va香蕉在| 欧洲大片精品免费永久看nba| 国产免费一区二区三区| 国际精品欧美精品| 8x8x华人在线| 性欧美暴力猛交另类hd| 一级黄色片在线免费观看| 成人手机电影网| 亚洲av成人无码久久精品 | 亚洲天堂影视av| 国产网友自拍视频导航网站在线观看 | 亚洲iv一区二区三区| 极品束缚调教一区二区网站| 日韩欧美激情一区二区| 欧美色一级片| 欧美一级黄色影院| 成人激情视频网站| 免费看日本黄色片| 亚洲综合一二三区| 精品免费囯产一区二区三区| 亚洲1区2区3区视频| 日本精品入口免费视频| 精品国产乱码久久久久久1区2区| 亚洲日本香蕉视频| 综合网中文字幕| 182在线播放| 国产精品美女视频网站| 欧美变态网站| 亚洲视频精品一区| 国产一区视频在线观看免费| 奇米影音第四色| 不卡的av在线播放| 欧美极品jizzhd欧美仙踪林| 国产精品久久久久久久久搜平片 | 超碰caoprom| 国产精品美女久久久久久久 | 成人黄色在线播放| 极品束缚调教一区二区网站| 久久精品人人做人人爽电影| 欧美日韩亚洲一区在线观看| 日本熟妇人妻xxxxx| 本田岬高潮一区二区三区| jizz18女人高潮| 午夜精品视频在线观看| 99国产在线播放| 中文国产成人精品| 国产精品一二三产区| 99电影在线观看| 日韩片欧美片| 国产精品天天av精麻传媒| 成人免费毛片片v| 亚洲精品一区二区三区在线播放| 日本精品视频一区二区| 少妇人妻偷人精品一区二区| 欧美华人在线视频| 亚洲成a人片777777久久| 日本视频一区二区在线观看| 久久aⅴ国产紧身牛仔裤| 久久久国产精品久久久| 久久精品欧美日韩| 日韩aaaaaa| 日韩一级片在线播放| 搞黄网站在线观看| 国产精品视频不卡| 精品国产一区探花在线观看 | 久久一区欧美| 中文字幕无码人妻少妇免费| 亚洲成人免费电影| 国产高潮流白浆喷水视频| 欧美巨乳在线观看| 伊人久久大香线蕉综合影院首页| 国产女人水真多18毛片18精品 | 国产成人在线中文字幕| 99久re热视频精品98| 激情综合亚洲精品| 日韩精品一区二区三区在线视频| 色老头久久综合| 国产免费a∨片在线观看不卡| 69视频在线免费观看| 丝袜美腿一区二区三区动态图| 青青青在线视频播放| 成人综合婷婷国产精品久久蜜臀| 久久精品无码人妻| 精品黑人一区二区三区久久| 国产一二三在线| 精品国产aⅴ麻豆| 亚洲精品麻豆| 国产美女免费网站| 在线亚洲高清视频| 好操啊在线观看免费视频| 亚洲va欧美va在线观看| 自拍日韩欧美| 国产成人无码一区二区在线观看| 婷婷综合五月天| 永久免费av在线| 成人免费福利在线| 国产精品av一区二区| 一边摸一边做爽的视频17国产 | 亚洲另类欧美日韩| 夜夜躁日日躁狠狠久久88av| 日韩精品第一| 亚洲制服欧美久久| 丰满少妇久久久久久久| 91视频免费网址| 日韩视频―中文字幕| av在线成人| 欧美日韩成人免费视频| 久久免费午夜影院| 一级黄色大片免费| 欧美精品久久久久| 亚洲理论电影| 在线一区二区不卡| 亚洲国产精品久久久久婷婷884| 丰满人妻熟女aⅴ一区| 国产精品视频自在线| 中文字幕人成人乱码| 日本aaa视频| 在线播放一区二区三区| 国产高清视频色在线www| 深夜福利成人| 91在线云播放| 一级黄色录像大片| 久久99精品久久久久久琪琪|