|
系列文章導(dǎo)航:
[你必須知道的.NET] 第四回:后來居上:class和struct
[你必須知道的.NET] 第五回:深入淺出關(guān)鍵字---把new說透
[你必須知道的.NET] 第六回:深入淺出關(guān)鍵字---base和this
[你必須知道的.NET] 第七回:品味類型---從通用類型系統(tǒng)開始
[你必須知道的.NET] 第八回:品味類型---值類型與引用類型(上)-內(nèi)存有理
[你必須知道的.NET] 第九回:品味類型---值類型與引用類型(中)-規(guī)則無邊
[你必須知道的.NET] 第十回:品味類型---值類型與引用類型(下)-應(yīng)用征途
[你必須知道的.NET] 第十一回:參數(shù)之惑---傳遞的藝術(shù)(上)
[你必須知道的.NET] 第十二回:參數(shù)之惑---傳遞的藝術(shù)(下)
[你必須知道的.NET] 第十三回:從Hello, world開始認(rèn)識IL
[你必須知道的.NET] 第十四回:認(rèn)識IL代碼---從開始到現(xiàn)在
[你必須知道的.NET] 第十六回:深入淺出關(guān)鍵字---using全接觸
[你必須知道的.NET] 第十八回:對象創(chuàng)建始末(上)
[你必須知道的.NET] 第十九回:對象創(chuàng)建始末(下)
[你必須知道的.NET]第二十回:學(xué)習(xí)方法論
[你必須知道的.NET]第二十一回:認(rèn)識全面的null
[你必須知道的.NET]第二十二回:字符串駐留(上)---帶著問題思考
[你必須知道的.NET]第三十二回,深入.NET 4.0之,Tuple一二
[你必須知道的.NET]第二十一回:認(rèn)識全面的null
![]() |
null、nullable、??運(yùn)算符、null object模式,這些閃亮的概念在你眼前晃動,我們有理由相信“存在即合理”,事實上,null不光合理,而且重要。本文,從null的基本認(rèn)知開始,逐層了解可空類型、??運(yùn)算符和null object模式,在循序之旅中了解不一樣的null。 你必須知道的.NET,繼續(xù)全新體驗,分享更多色彩。 |
系列文章導(dǎo)航:
[你必須知道的.NET] 第四回:后來居上:class和struct
[你必須知道的.NET] 第五回:深入淺出關(guān)鍵字---把new說透
[你必須知道的.NET] 第六回:深入淺出關(guān)鍵字---base和this
[你必須知道的.NET] 第七回:品味類型---從通用類型系統(tǒng)開始
[你必須知道的.NET] 第八回:品味類型---值類型與引用類型(上)-內(nèi)存有理
[你必須知道的.NET] 第九回:品味類型---值類型與引用類型(中)-規(guī)則無邊
[你必須知道的.NET] 第十回:品味類型---值類型與引用類型(下)-應(yīng)用征途
[你必須知道的.NET] 第十一回:參數(shù)之惑---傳遞的藝術(shù)(上)
[你必須知道的.NET] 第十二回:參數(shù)之惑---傳遞的藝術(shù)(下)
[你必須知道的.NET] 第十三回:從Hello, world開始認(rèn)識IL
[你必須知道的.NET] 第十四回:認(rèn)識IL代碼---從開始到現(xiàn)在
[你必須知道的.NET] 第十六回:深入淺出關(guān)鍵字---using全接觸
[你必須知道的.NET] 第十八回:對象創(chuàng)建始末(上)
[你必須知道的.NET] 第十九回:對象創(chuàng)建始末(下)
[你必須知道的.NET]第二十回:學(xué)習(xí)方法論
[你必須知道的.NET]第二十一回:認(rèn)識全面的null
[你必須知道的.NET]第二十二回:字符串駐留(上)---帶著問題思考
[你必須知道的.NET]第三十二回,深入.NET 4.0之,Tuple一二
2 Nullable<T>(可空類型)
一直以來,null都是引用類型的特有產(chǎn)物,對值類型進(jìn)行null操作將在編譯器拋出錯誤提示,例如:
//拋出編譯時錯誤
int i = null;
if (i == null)
{
Console.WriteLine("i is null.");
}
系列文章導(dǎo)航:
[你必須知道的.NET] 第四回:后來居上:class和struct
[你必須知道的.NET] 第五回:深入淺出關(guān)鍵字---把new說透
[你必須知道的.NET] 第六回:深入淺出關(guān)鍵字---base和this
[你必須知道的.NET] 第七回:品味類型---從通用類型系統(tǒng)開始
[你必須知道的.NET] 第八回:品味類型---值類型與引用類型(上)-內(nèi)存有理
[你必須知道的.NET] 第九回:品味類型---值類型與引用類型(中)-規(guī)則無邊
[你必須知道的.NET] 第十回:品味類型---值類型與引用類型(下)-應(yīng)用征途
[你必須知道的.NET] 第十一回:參數(shù)之惑---傳遞的藝術(shù)(上)
[你必須知道的.NET] 第十二回:參數(shù)之惑---傳遞的藝術(shù)(下)
[你必須知道的.NET] 第十三回:從Hello, world開始認(rèn)識IL
[你必須知道的.NET] 第十四回:認(rèn)識IL代碼---從開始到現(xiàn)在
[你必須知道的.NET] 第十六回:深入淺出關(guān)鍵字---using全接觸
[你必須知道的.NET] 第十八回:對象創(chuàng)建始末(上)
[你必須知道的.NET] 第十九回:對象創(chuàng)建始末(下)
[你必須知道的.NET]第二十回:學(xué)習(xí)方法論
[你必須知道的.NET]第二十一回:認(rèn)識全面的null
[你必須知道的.NET]第二十二回:字符串駐留(上)---帶著問題思考
[你必須知道的.NET]第三十二回,深入.NET 4.0之,Tuple一二
3 ??運(yùn)算符
在實際的程序開發(fā)中,為了有效避免發(fā)生異常情況,進(jìn)行null判定是經(jīng)常發(fā)生的事情,例如對于任意對象執(zhí)行ToString()操作,都應(yīng)該進(jìn)行必要的null檢查,以免發(fā)生不必要的異常提示,我們常常是這樣實現(xiàn)的:
object obj = new object();
string objName = string.Empty;
if (obj != null)
{
objName = obj.ToString();
}
Console.WriteLine(objName);
系列文章導(dǎo)航:
[你必須知道的.NET] 第四回:后來居上:class和struct
[你必須知道的.NET] 第五回:深入淺出關(guān)鍵字---把new說透
[你必須知道的.NET] 第六回:深入淺出關(guān)鍵字---base和this
[你必須知道的.NET] 第七回:品味類型---從通用類型系統(tǒng)開始
[你必須知道的.NET] 第八回:品味類型---值類型與引用類型(上)-內(nèi)存有理
[你必須知道的.NET] 第九回:品味類型---值類型與引用類型(中)-規(guī)則無邊
[你必須知道的.NET] 第十回:品味類型---值類型與引用類型(下)-應(yīng)用征途
[你必須知道的.NET] 第十一回:參數(shù)之惑---傳遞的藝術(shù)(上)
[你必須知道的.NET] 第十二回:參數(shù)之惑---傳遞的藝術(shù)(下)
[你必須知道的.NET] 第十三回:從Hello, world開始認(rèn)識IL
[你必須知道的.NET] 第十四回:認(rèn)識IL代碼---從開始到現(xiàn)在
[你必須知道的.NET] 第十六回:深入淺出關(guān)鍵字---using全接觸
[你必須知道的.NET] 第十八回:對象創(chuàng)建始末(上)
[你必須知道的.NET] 第十九回:對象創(chuàng)建始末(下)
[你必須知道的.NET]第二十回:學(xué)習(xí)方法論
[你必須知道的.NET]第二十一回:認(rèn)識全面的null
[你必須知道的.NET]第二十二回:字符串駐留(上)---帶著問題思考
[你必須知道的.NET]第三十二回,深入.NET 4.0之,Tuple一二
4 Nulll Object模式
模式之于設(shè)計,正如秘笈之于功夫。正如我們前文所述,null在程序設(shè)計中具有舉足輕重的作用,因此如何更優(yōu)雅的處理“對象為空”這一普遍問題,大師們提出了Null Object Pattern概念,也就是我們常說的Null Object模式。例如Bob大叔在《敏捷軟件開發(fā)--原則、模式、實踐》一書,Martin Fowler在《Refactoring: Improving the Design of Existing Code》一書,都曾就Null Object模式展開詳細(xì)的討論,可見23中模式之外還是有很多設(shè)計精髓,可能稱為模式有礙經(jīng)典。但是仍然值得我們挖據(jù)、探索和發(fā)現(xiàn)。
下面就趁熱打鐵,在null認(rèn)識的基礎(chǔ)上,對null object模式進(jìn)行一點探討,研究null object解決的問題,并提出通用的null object應(yīng)用方式。
解決什么問題?
簡單來說,null object模式就是為對象提供一個指定的類型,來代替對象為空的情況。說白了就是解決對象為空的情況,提供對象“什么也不做”的行為,這種方式看似無聊,但卻是很聰明的解決之道。舉例來說,一個User類型對象user需要在系統(tǒng)中進(jìn)行操作,那么典型的操作方式是:
if (user != null)
{
manager.SendMessage(user);
}
系列文章導(dǎo)航:
[你必須知道的.NET] 第四回:后來居上:class和struct
[你必須知道的.NET] 第五回:深入淺出關(guān)鍵字---把new說透
[你必須知道的.NET] 第六回:深入淺出關(guān)鍵字---base和this
[你必須知道的.NET] 第七回:品味類型---從通用類型系統(tǒng)開始
[你必須知道的.NET] 第八回:品味類型---值類型與引用類型(上)-內(nèi)存有理
[你必須知道的.NET] 第九回:品味類型---值類型與引用類型(中)-規(guī)則無邊
[你必須知道的.NET] 第十回:品味類型---值類型與引用類型(下)-應(yīng)用征途
[你必須知道的.NET] 第十一回:參數(shù)之惑---傳遞的藝術(shù)(上)
[你必須知道的.NET] 第十二回:參數(shù)之惑---傳遞的藝術(shù)(下)
[你必須知道的.NET] 第十三回:從Hello, world開始認(rèn)識IL
[你必須知道的.NET] 第十四回:認(rèn)識IL代碼---從開始到現(xiàn)在
[你必須知道的.NET] 第十六回:深入淺出關(guān)鍵字---using全接觸
[你必須知道的.NET] 第十八回:對象創(chuàng)建始末(上)
[你必須知道的.NET] 第十九回:對象創(chuàng)建始末(下)
[你必須知道的.NET]第二十回:學(xué)習(xí)方法論
[你必須知道的.NET]第二十一回:認(rèn)識全面的null
[你必須知道的.NET]第二十二回:字符串駐留(上)---帶著問題思考
[你必須知道的.NET]第三十二回,深入.NET 4.0之,Tuple一二
通過強(qiáng)制將User屬性實現(xiàn)為null,在調(diào)用Login時仍然能夠保證系統(tǒng)的穩(wěn)定性,有效避免對null的判定操作,這至少可以讓我們的系統(tǒng)少了很多不必要的判定代碼。
詳細(xì)的代碼可以通過本文最后的下載空間進(jìn)行下載。實際上,可以通過引入Facotry Method模式來構(gòu)建對于User和NullUser的創(chuàng)建工作,這樣就可以完全消除應(yīng)用if進(jìn)行判斷的僵化,不過那是另外一項工作罷了。
當(dāng)然,這只是null object的一種實現(xiàn)方案,在此對《Refactoring》一書的示例進(jìn)行改良,完成更具有.NET特色的null object實現(xiàn),你也可以請NullUser繼承Use并添加相應(yīng)的IsNull判定屬性來完成。
借力c# 3.0的Null object
在C# 3.0中,Extension Method(擴(kuò)展方法)對于成就LINQ居功至偉,但是Extension Method的神奇遠(yuǎn)不是止于LINQ。在實際的設(shè)計中,靈活而巧妙的應(yīng)用,同樣可以給你的設(shè)計帶來意想不到的震撼,以上述User為例我們應(yīng)用Extension Method來取巧實現(xiàn)更簡潔IsNull判定,代替實現(xiàn)INullable接口的方法而采用更簡單的實現(xiàn)方式。重新構(gòu)造一個實現(xiàn)相同功能的擴(kuò)展方法,例如:
// Copyright : www.anytao.com
// Author : Anytao,http://www.anytao.com
// Release : 2008/07/31 1.0
public static class UserExtension
{
public static bool IsNull(this User user)
{
return null == user;
}
}
NET技術(shù):[你必須知道的.NET]第二十一回:認(rèn)識全面的null,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。