正在练习泛型。考虑下面的堆栈方法。除了在泛型方法中抛出异常之外,执行错误检查的最佳方法是什么。如果我想在此方法中返回一些结果,该怎么办?
public T pop()
{
if (top >= 0)
return arr[top--];
return -1 or null;
}
答案 0 :(得分:15)
你唯一能做的就是返回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;
}
答案 1 :(得分:6)
您可以执行return default(T)
,它将返回0个初始值类型(例如,所有数值类型将初始化为0),并且对于引用类型为null。
答案 2 :(得分:1)
好像你的问题确实有两个部分
第一部分是如果一个默认值不可用,如何提供默认值。正如其他人指出的那样,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;
}
答案 3 :(得分:1)
我来到这里寻找一个稍微不同的问题的解决方案,涉及一个静态方法,它接受两个通用数组并返回一个新的通用数组。由于我的方法是静态的,我不能使用这个例子,除了作为灵感。相反,我开发了以下解决方案。
T [ ] raMerged = ( T [ ] ) alMerged.ToArray ( typeof ( T ) );
return raMerged;
在上面的代码片段中,alMerged是一个通用对象T的数组列表。
这满足方法签名指定的合同条件,如下所示。
public static T [ ] MergeNewItemsIntoArray<T> (
T [ ] paMasterList ,
T [ ] paNewItems )
where T : IComparable , new ( )
在签名中,where子句说明了我在几个主题中找到的另一个问题的解决方案,其中没有一个直接解决了这个问题。然而,希望这至少会帮助另一个灵魂。
答案 4 :(得分:0)
你的问题不清楚。错误检查可以像往常一样完成 - 捕获异常。 引发错误通常应该通过抛出异常来完成。毕竟,这就是他们的目标。
如果你想返回null
,你可以这样做,但是你必须确保类型T
是一个类,而不是结构,如下所示:
public T pop()
where T: class
{
...
}
答案 5 :(得分:0)
如果你想在堆栈为空时能够返回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?所以我们可以返回空值。
答案 6 :(得分:0)
直接方法(使用泛型和返回值或null)
class DemoClass<T> where T : struct
{
public T? PopValueOrNull()
{
if ( this._top >= 0 ) {
return this._arr[this._top--];
}
return null;
}
}