標籤:c# items 泛型類 程式 cat ++ str help dynamic
建議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為泛型型別變數指定初始值