色尼玛亚洲综合影院,亚洲3atv精品一区二区三区,麻豆freexxxx性91精品,欧美在线91

[你必須知道的.NET]第二十一回:認(rèn)識全面的null

系列文章導(dǎo)航:

[你必須知道的.NET] 開篇有益

[你必須知道的.NET] 第一回:恩怨情仇:is和as

[你必須知道的.NET] 第二回:對抽象編程:接口和抽象類

[你必須知道的.NET] 第三回:歷史糾葛:特性和屬性

[你必須知道的.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] 第十五回:繼承本質(zhì)論

[你必須知道的.NET] 第十六回:深入淺出關(guān)鍵字---using全接觸

[你必須知道的.NET] 第十七回:貌合神離:覆寫和重載

[你必須知道的.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、??運算符、null object模式,這些閃亮的概念在你眼前晃動,我們有理由相信“存在即合理”,事實上,null不光合理,而且重要。本文,從null的基本認(rèn)知開始,逐層了解可空類型、??運算符和null object模式,在循序之旅中了解不一樣的null。

你必須知道的.NET,繼續(xù)全新體驗,分享更多色彩。

                                                                                                                       www.anytao.com

系列文章導(dǎo)航:

[你必須知道的.NET] 開篇有益

[你必須知道的.NET] 第一回:恩怨情仇:is和as

[你必須知道的.NET] 第二回:對抽象編程:接口和抽象類

[你必須知道的.NET] 第三回:歷史糾葛:特性和屬性

[你必須知道的.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] 第十五回:繼承本質(zhì)論

[你必須知道的.NET] 第十六回:深入淺出關(guān)鍵字---using全接觸

[你必須知道的.NET] 第十七回:貌合神離:覆寫和重載

[你必須知道的.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] 開篇有益

[你必須知道的.NET] 第一回:恩怨情仇:is和as

[你必須知道的.NET] 第二回:對抽象編程:接口和抽象類

[你必須知道的.NET] 第三回:歷史糾葛:特性和屬性

[你必須知道的.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] 第十五回:繼承本質(zhì)論

[你必須知道的.NET] 第十六回:深入淺出關(guān)鍵字---using全接觸

[你必須知道的.NET] 第十七回:貌合神離:覆寫和重載

[你必須知道的.NET] 第十八回:對象創(chuàng)建始末(上)

[你必須知道的.NET] 第十九回:對象創(chuàng)建始末(下)

[你必須知道的.NET]第二十回:學(xué)習(xí)方法論

[你必須知道的.NET]第二十一回:認(rèn)識全面的null

[你必須知道的.NET]第二十二回:字符串駐留(上)---帶著問題思考

[你必須知道的.NET]第三十二回,深入.NET 4.0之,Tuple一二


3 ??運算符

在實際的程序開發(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] 開篇有益

[你必須知道的.NET] 第一回:恩怨情仇:is和as

[你必須知道的.NET] 第二回:對抽象編程:接口和抽象類

[你必須知道的.NET] 第三回:歷史糾葛:特性和屬性

[你必須知道的.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] 第十五回:繼承本質(zhì)論

[你必須知道的.NET] 第十六回:深入淺出關(guān)鍵字---using全接觸

[你必須知道的.NET] 第十七回:貌合神離:覆寫和重載

[你必須知道的.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] 開篇有益

[你必須知道的.NET] 第一回:恩怨情仇:is和as

[你必須知道的.NET] 第二回:對抽象編程:接口和抽象類

[你必須知道的.NET] 第三回:歷史糾葛:特性和屬性

[你必須知道的.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] 第十五回:繼承本質(zhì)論

[你必須知道的.NET] 第十六回:深入淺出關(guān)鍵字---using全接觸

[你必須知道的.NET] 第十七回:貌合神離:覆寫和重載

[你必須知道的.NET] 第十八回:對象創(chuàng)建始末(上)

[你必須知道的.NET] 第十九回:對象創(chuàng)建始末(下)

[你必須知道的.NET]第二十回:學(xué)習(xí)方法論

[你必須知道的.NET]第二十一回:認(rèn)識全面的null

[你必須知道的.NET]第二十二回:字符串駐留(上)---帶著問題思考

[你必須知道的.NET]第三十二回,深入.NET 4.0之,Tuple一二


通過強制將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)系我們修改或刪除,多謝。

主站蜘蛛池模板: 灵丘县| 中江县| 武穴市| 阿荣旗| 乃东县| 巴东县| 任丘市| 社旗县| 顺昌县| 沿河| 平武县| 鲜城| 托里县| 奎屯市| 双城市| 石渠县| 虎林市| 大石桥市| 中西区| 宜都市| 宝兴县| 林口县| 含山县| 兴文县| 金塔县| 黄浦区| 霍城县| 温宿县| 抚顺市| 沭阳县| 盘山县| 南投市| 华池县| 德州市| 东至县| 加查县| 鄂托克旗| 台湾省| 根河市| 阳朔县| 新绛县|