欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于不要返回null之EmptyFactory的應用詳解

 更新時間:2013年05月13日 17:32:52   作者:  
本篇文章對不要返回null之EmptyFactory進行了詳細的分析介紹,需要的朋友參考下
有很多書上都提出過一個建議:不要返回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>();

考慮到這一點,可以將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有作用。
考慮到這一點,為EmptyFactory增加緩存機制的代碼如下,使用Dictionary<Type,Object> 來實現(xiàn)
復制代碼 代碼如下:

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變成泛型類:

代碼如下:

復制代碼 代碼如下:

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

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

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

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

相關文章

  • C# 中將數(shù)值型數(shù)據(jù)轉換為字節(jié)數(shù)組的方法

    C# 中將數(shù)值型數(shù)據(jù)轉換為字節(jié)數(shù)組的方法

    C# 中將數(shù)值型數(shù)據(jù)轉換為字節(jié)數(shù)組的方法,需要的朋友可以參考一下
    2013-05-05
  • 如何用C#獲取計算機詳細的軟件和硬件信息

    如何用C#獲取計算機詳細的軟件和硬件信息

    我們應該都知道System.Management提供的類可以用于讀取本地計算機設備的各種數(shù)據(jù),下面這篇文章主要給大家介紹了關于如何用C#獲取計算機詳細的軟件和硬件信息的相關資料,需要的朋友可以參考下
    2022-12-12
  • C#常用排序方式總結

    C#常用排序方式總結

    在最近的項目中經(jīng)常會對C#中的數(shù)據(jù)進行排序,對于基本數(shù)據(jù)類型,其排序方式比較簡單,只需要調(diào)用內(nèi)置算法即可實現(xiàn),但對于自定義數(shù)據(jù)類型以及自定義排序規(guī)則的情況實現(xiàn)起來就比較麻煩,所以在本文章中將詳細介紹一下在中C#中如何對數(shù)據(jù)進行排序,需要的朋友可以參考下
    2024-01-01
  • C#中String和StringBuilder的簡介與區(qū)別

    C#中String和StringBuilder的簡介與區(qū)別

    今天小編就為大家分享一篇關于C#中String和StringBuilder的簡介與區(qū)別,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • C#實現(xiàn)Base64編碼與解碼及規(guī)則

    C#實現(xiàn)Base64編碼與解碼及規(guī)則

    這篇文章主要介紹了C#實現(xiàn)Base64編碼與解碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • C#中計時器的簡單實現(xiàn)方法示例

    C#中計時器的簡單實現(xiàn)方法示例

    這篇文章主要介紹了C#中計時器的簡單實現(xiàn)方法,結合實例形式分析了C#計時器的簡單定義與使用技巧,需要的朋友可以參考下
    2017-05-05
  • c# Base64編碼和圖片的互相轉換代碼

    c# Base64編碼和圖片的互相轉換代碼

    Base64編碼在Web方面有很多應用,譬如在URL、電子郵件方面。網(wǎng)上有很多相關的資源用于提供Base64編碼和其他編碼的轉換,.Net Framework也提供了現(xiàn)成的功能類(System.Convert)用于將二進制數(shù)據(jù)轉換為Base64字符串
    2014-08-08
  • C# 打開藍牙設置界面的兩種方法

    C# 打開藍牙設置界面的兩種方法

    這篇文章主要介紹了C# 打開藍牙設置界面的兩種方法,文中講解非常細致,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • c# 繼承快速入門

    c# 繼承快速入門

    這篇文章主要介紹了c# 繼承快速入門的相關資料,幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C#中using關鍵字的使用方法示例

    C#中using關鍵字的使用方法示例

    在C#語句中,將using關鍵字作為一個語句時,該語句的作用是定義一個用大括號規(guī)定的范圍,在該范圍的末尾,系統(tǒng)會立即釋放using后小括號內(nèi)指定的對象,下面這篇文章主要給大家介紹了關于C#中using關鍵字使用的相關資料,需要的朋友可以參考下
    2022-06-06

最新評論