[英]Generic return type in C#
正在練習泛型。 考慮下面的堆棧方法。 除了在泛型方法中拋出異常之外,執行錯誤檢查的最佳方法是什么。 如果我想在此方法中返回一些結果,該怎么辦?
public T pop()
{
if (top >= 0)
return arr[top--];
return -1 or null;
}
您唯一能做的就是返回default(T)
,它是類型T
的默認值(引用類型為null
,整數類型為零,其他值類型為零字段對象)。 然而,這通常是因為你有沒有辦法區分一個壞主意0
這是彈出或0
表示有錯誤。 在這種情況下,例外通常是最好的方法,但您也可以按如下方式更改方法:
public bool TryPop(out T value)
{
if (top >= 0)
{
value = arr[top--];
return true;
}
value = default(T);
return false;
}
您可以return default(T)
,它將返回0個初始化值類型(例如,所有數值類型將初始化為0),並且null為引用類型。
我來到這里尋找一個稍微不同的問題的解決方案,涉及一個靜態方法,它接受兩個通用數組並返回一個新的通用數組。 由於我的方法是靜態的,我不能使用這個例子,除了作為靈感。 相反,我開發了以下解決方案。
T [ ] raMerged = ( T [ ] ) alMerged.ToArray ( typeof ( T ) );
return raMerged;
在上面的代碼片段中,alMerged是一個通用對象T的ArrayList。
這滿足方法簽名指定的合同條件,如下所示。
public static T [ ] MergeNewItemsIntoArray<T> (
T [ ] paMasterList ,
T [ ] paNewItems )
where T : IComparable , new ( )
在簽名中,where子句說明了我在幾個線程中找到的另一個問題的解決方案,其中沒有一個直接解決了這個問題。 然而,希望這至少會幫助另一個靈魂。
看來你的問題確實有兩個部分
第一部分是如果一個默認值不可用,如何提供默認值。 正如其他人指出的那樣,C#表達式default(T)
將適用於這種情況。 它為引用類型返回null
,為結構體返回0初始化值。
第二部分是處理錯誤情況的最佳方法,而不是拋出異常。 集合API傾向於將TryXXX模式用於此類場景
bool TryPop(out T value) {
if ( top >= 0 ) {
value = arr[top--];
return true;
}
value = default(T);
return false;
}
你的問題不清楚。 錯誤檢查可以像往常一樣完成 - 捕獲異常。 通常應該通過拋出異常來引發錯誤。 畢竟,這就是他們的目標。
如果你想返回null
你可以這樣做,但是你必須確保類型T
是一個類,而不是結構,如下所示:
public T pop()
where T: class
{
...
}
如果你想在堆棧為空時能夠返回null,你可以嘗試這樣的事情:
class GenericStack<T>
{
T[] arr;
int top;
public T pop()
{
if (top >= 0)
return arr[top--];
return default(T);
}
}
然后你可以使用這樣的用法:
var stack = new GenericStack<int?>();
var res = stack.pop(); // res will be null
請注意堆棧對象的類型是int? 所以我們可以返回空值。
直接方法(使用泛型和返回值或null)
class DemoClass<T> where T : struct
{
public T? PopValueOrNull()
{
if ( this._top >= 0 ) {
return this._arr[this._top--];
}
return null;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.