1. 程式人生 > >【轉】編寫高質量代碼改善C#程序的157個建議——建議35:使用default為泛型類型變量指定初始值

【轉】編寫高質量代碼改善C#程序的157個建議——建議35:使用default為泛型類型變量指定初始值

如果 items item 類型變量 color 高質量 使用 per match

建議35:使用default為泛型類型變量指定初始值

有些算法,比如泛型集合List<T>的Find算法,所查找的對象可能會是值類型,也有可能是引用類型。在這種算法內部,我們常常會為這些值類型或引用類型變量指定默認值。於是,問題來了:值類型變量的默認初始值是0值,而引用類型變量的默認初始值是null值,顯然,這會導致下面的編譯出錯:

        public T Func<T>()
        {
            T t = null;return t;
        }

無法將 null 轉換為類型參數“T”,因為它可能是一種不可為 null 的值類型。請考慮改用“default(T)”。

        public T Func<T>()
        {
            T t = 0;
            return t;
        }

無法將類型“int”隱式轉換為“T”。

所以上面的代碼應該改為:

        public T Func<T>()
        {
            T t = default(T);
            return t;
        }

這樣,如果它在運行時碰到T是一個整型,那麽運行時會為其賦值0;如果T在運行時是一個Person這樣的引用類型,則會為其賦null值。

List<T>的Find方法源碼為:

[__DynamicallyInvokable]
public T Find(Predicate<T> match)
{
    if (match == null)
    {
        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
    }
    for (int i = 0; i < this._size; i++)
    {
        if (match(this._items[i]))
        {
            
return this._items[i]; } } return default(T); }

轉自:《編寫高質量代碼改善C#程序的157個建議》陸敏技

【轉】編寫高質量代碼改善C#程序的157個建議——建議35:使用default為泛型類型變量指定初始值