我有一个名为 FindSpecificRowValue 的函数,它接收一个数据表并返回包含特定值的行号。如果找不到该值,我想向调用函数表明这一点。
是最好的方法:
- 编写一个函数,如果未找到则返回 false,如果找到则返回 true,并将找到的行号作为 byref/输出参数,或
- 编写一个返回 int 的函数,如果未找到行值,则返回 -999,如果找到,则返回行号?
我有一个名为 FindSpecificRowValue 的函数,它接收一个数据表并返回包含特定值的行号。如果找不到该值,我想向调用函数表明这一点。
是最好的方法:
就我个人而言,我不会使用该方法名称。
我会改用两种方法:
TryFindSpecificRow
FindSpecificRow
这将遵循 Int32.Parse/TryParse 的模式,在 C# 中它们可能如下所示:
public static Boolean TryFindSpecificRow(DataTable table, out Int32 rowNumber)
{
if (row-can-be-found)
{
rowNumber = index-of-row-that-was-found;
return true;
}
else
{
rowNumber = 0; // this value will not be used anyway
return false;
}
}
public static Int32 FindSpecificRow(DataTable table)
{
Int32 rowNumber;
if (TryFindSpecificRow(table, out rowNumber))
return rowNumber;
else
throw new RowNotFoundException(String.Format("Row {0} was not found", rowNumber));
}
编辑:更改为更适合该问题。
失败的函数应该抛出异常。
如果失败是预期流程的一部分,则返回带外值是可以的,除非您无法预先确定带外值是什么,在这种情况下您必须抛出异常。
如果我必须在您的选项之间进行选择,我会选择选项 2,但使用常量而不是 -999...
您还可以将返回值定义为Nullable,如果没有找到,则返回 Nothing。
我会选择选项 2。虽然我认为我只会使用 -1 而不是 -999。
理查德哈里森是对的,命名常量比裸 -1 或 -999 更好。
我会选择 2,或者返回值指示是否找到该值的其他变体。
函数返回(或提供引用)的行的值似乎已经表明是否找到了该值。如果未找到值,则提供不包含该值的行号似乎没有意义,因此返回值应为 -1、Null 或任何其他适用于特定语言的值。否则,返回行号这一事实表明已找到该值。
因此,似乎不需要单独的返回值来指示是否找到了该值。但是,如果类型 1 适合特定语言的习语,以及在其中执行函数调用的方式,则类型 1 可能是合适的。
使用 2) 但返回 -1 (如果返回对行的引用,则返回空引用),该习语被广泛使用(包括通过 .nets indexOf (item) 函数),这就是我可能会做的。
BTW -1 比 -999 更容易接受和广泛使用“幻数”,这就是它“正确”的唯一原因(此处使用引号是有原因的)。
然而,这在很大程度上与您的期望有关。项目是否应该一直在那里,但您只是不知道在哪里?在这种情况下,正常返回索引,如果不存在则抛出错误/异常。
在这种情况下,该项目可能不存在,这是一个正常的条件。这是绑定到数据表的 GridView 中未选择值的错误陷阱。
其他一些尚未提及的可能性:
// 方法一:支持协方差;失败时可以返回 default<T>。 T TryGetThing(ref bool 成功); // 方法2:不支持协方差,但在某些情况下可能允许更简洁的代码 // 如果失败,调用代码将使用一些特定的值。 T TryGetThing(T DefaultValue); // 方法3:不支持协方差,但在某些情况下可能允许更简洁的代码 // 如果失败,调用代码将使用一些特定的值,但应该 // 除非必要,否则不花时间计算该值。 T TryGetThing(Func<T> AlternateGetMethod); // 方法四:是否支持协方差;如果这是应该的,ErrorMethod 可以抛出 // 发生,或者它可以设置一些其他方式对调用者可见的标志。 T TryGetThing(操作错误方法);
第一种方法与 Microsoft 在支持协变接口之前开发的方法相反。最后一个在某些方面是最通用的,但可能需要在每次使用时创建几个新的 GC 对象实例(例如闭包和委托)。