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

基于不要返回null之EmptyFactory的應(yīng)用詳解

 更新時間:2013年05月13日 17:32:52   作者:  
本篇文章對不要返回null之EmptyFactory進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
有很多書上都提出過一個建議:不要返回null對象。
比如下面的GetUsers方法:
public class User
{
    public string Id { get; set; }
    public string Name { get; set; }
}

public List<User> GetUsers()
{
    List<User> result = new List<User>();

    // search db for user
    return result;
}
如果其他方法由GetUsersOfxxx,GetUsersByXXX之類的方法,那么就有大量
List<User> result = new List<User>();

考慮到這一點(diǎn),可以將new List<User>()  封裝到方法中,這就是”工廠”模式了.
因為可能不是List<User> ,也許是Stack<User> 更或者是ObservableCollection<User>

所以配合泛型,代碼如下:
public static class EmptyFactory
{
    public static T Empty<T>() where T : IEnumerable, new()
    {
        return new T();
    }
}

使用如下:
List<string> emptyList = new List<string>();
Stack<string> emptyStack = new Stack<string>();
ObservableCollection<string> emptyObserable = new ObservableCollection<string>();

emptyList = EmptyFactory.Empty<List<string>>();
emptyStack = EmptyFactory.Empty<Stack<string>>();
emptyObserable = EmptyFactory.Empty<ObservableCollection<string>>();
雖然這樣寫可以滿足要求,但是可以發(fā)現(xiàn)基本沒什么好處,寫EmptyFactory還不如new 來得快。
不過如果能夠緩存對象的話,也許EmptyFactory有作用。
考慮到這一點(diǎn),為EmptyFactory增加緩存機(jī)制的代碼如下,使用Dictionary<Type,Object> 來實現(xiàn)
復(fù)制代碼 代碼如下:

public static class EmptyFactory
{
    private static Dictionary<Type, object> cacheEmptyObjects =
                     new Dictionary<Type, object>();
    public static T Empty<T>() where T : IEnumerable, new()
    {
        Type genericType = typeof(T);
        if (cacheEmptyObjects.ContainsKey(genericType))
        {
            return (T)cacheEmptyObjects[genericType];
        }
        else
        {
            T tempEmptyObject = new T();
            cacheEmptyObjects.Add(genericType, tempEmptyObject);
            return tempEmptyObject;
        }
    }
}

測試代碼如下:

 image

不過這種方法有一個缺陷,對于值類型而言,需要裝箱。

其根本原因是因為EmptyFactory不知道T是什么,如果EmptyFactory知道T的話,那么就可以使用Dictionary<T,T> 的緩存了。

解決這個問題的思路是將EmptyFactory變成泛型類:

代碼如下:

復(fù)制代碼 代碼如下:

public static class EmptyFactory<T> where T : IEnumerable, new()
{
    private static Dictionary<Type, T> cacheEmptyObjects = new Dictionary<Type, T>();
    public static T Empty()
    {
        Type genericType = typeof(T);
        if (cacheEmptyObjects.ContainsKey(genericType))
        {
            return cacheEmptyObjects[genericType];
        }
        else
        {
            T tempEmptyObject = new T();
            cacheEmptyObjects.Add(genericType, tempEmptyObject);
            return tempEmptyObject;
        }
    }
}

使用的時候,只需要

image

當(dāng)然也可以EmptyFactory<List<User>>.Empty();

為什么不用Enumersble.Empty<T>方法呢?

因為Enumerable.Empty<T> 返回的是IEnumerable<T>對象。

相關(guān)文章

  • 解析C#設(shè)計模式編程中適配器模式的實現(xiàn)

    解析C#設(shè)計模式編程中適配器模式的實現(xiàn)

    這篇文章主要介紹了C#設(shè)計模式編程中適配器模式的實現(xiàn),分別舉了類的對象適配器與對象的適配器模式的例子,需要的朋友可以參考下
    2016-02-02
  • 詳解C#中的泛型以及編程中使用泛型的優(yōu)點(diǎn)

    詳解C#中的泛型以及編程中使用泛型的優(yōu)點(diǎn)

    這篇文章主要介紹了詳解C#中的泛型以及編程中使用泛型的優(yōu)點(diǎn),對泛型的支持時C#語言中的重要特性,需要的朋友可以參考下
    2016-02-02
  • C#將異步改成同步方法示例

    C#將異步改成同步方法示例

    這篇文章主要為大家介紹了C#將異步改成同步方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • C#?將Excel轉(zhuǎn)為PDF時自定義表格紙張大小的代碼思路

    C#?將Excel轉(zhuǎn)為PDF時自定義表格紙張大小的代碼思路

    這篇文章主要介紹了C#?將Excel轉(zhuǎn)為PDF時自定義表格紙張大小的代碼思路,轉(zhuǎn)換前的頁面大小設(shè)置為該版本中寫入的新功能,在舊版本和免費(fèi)版本中暫不支持,感興趣的朋友跟隨小編一起看看實例代碼
    2021-11-11
  • C#的自定義語法糖的使用詳解

    C#的自定義語法糖的使用詳解

    這篇文章主要介紹了C#的自定義語法糖的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • C#委托與事件初探

    C#委托與事件初探

    事件是委托的一種特殊形式,當(dāng)發(fā)生有意義的事情時,事件處理對象通知過程。接下來通過本文給大家介紹C#委托與事件初探,感興趣的朋友一起學(xué)習(xí)吧
    2016-02-02
  • httpwebreqeust讀取httponly的cookie方法

    httpwebreqeust讀取httponly的cookie方法

    下面小編就為大家?guī)硪黄猦ttpwebreqeust讀取httponly的cookie方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • 一個可逆加密的類(使用3DES加密)

    一個可逆加密的類(使用3DES加密)

    表示三重數(shù)據(jù)加密標(biāo)準(zhǔn)算法的基類,TripleDES 的所有實現(xiàn)都必須從此基類派生。是從 SymmetricAlgorithm 類里繼承出來。
    2011-07-07
  • Unity3D Shader實現(xiàn)掃描顯示效果(2)

    Unity3D Shader實現(xiàn)掃描顯示效果(2)

    這篇文章主要為大家詳細(xì)介紹了Unity3D Shader實現(xiàn)掃描顯示效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • C#合并多種格式文件為PDF的方法

    C#合并多種格式文件為PDF的方法

    這篇文章主要為大家詳細(xì)介紹了C#合并多種格式文件為PDF的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評論

卢湾区| 镇安县| 昌宁县| 乐安县| 达州市| 司法| 峨眉山市| 界首市| 济南市| 五河县| 郴州市| 茂名市| 宜黄县| 阜城县| 文山县| 电白县| 张家口市| 都江堰市| 长沙市| 阿拉善右旗| 琼中| 蓬安县| 广饶县| 彭泽县| 土默特左旗| 奈曼旗| 荔浦县| 临江市| 北海市| 嘉义市| 济阳县| 蕉岭县| 伊金霍洛旗| 星座| 阳西县| 土默特右旗| 蓬莱市| 冕宁县| 靖边县| 邢台县| 津南区|