3

我有一个名为 FindSpecificRowValue 的函数,它接收一个数据表并返回包含特定值的行号。如果找不到该值,我想向调用函数表明这一点。

是最好的方法:

  1. 编写一个函数,如果未找到则返回 false,如果找到则返回 true,并将找到的行号作为 byref/输出参数,或
  2. 编写一个返回 int 的函数,如果未找到行值,则返回 -999,如果找到,则返回行号?
4

8 回答 8

13

就我个人而言,我不会使用该方法名称。

我会改用两种方法:

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));
}

编辑:更改为更适合该问题。

于 2008-10-29T13:55:15.520 回答
3

失败的函数应该抛出异常。

如果失败是预期流程的一部分,则返回带外值是可以的,除非您无法预先确定带外值是什么,在这种情况下您必须抛出异常。

如果我必须在您的选项之间进行选择,我会选择选项 2,但使用常量而不是 -999...

于 2008-10-29T13:48:39.997 回答
3

您还可以将返回值定义为Nullable,如果没有找到,则返回 Nothing。

于 2008-10-29T13:57:21.383 回答
2

我会选择选项 2。虽然我认为我只会使用 -1 而不是 -999。

理查德哈里森是对的,命名常量比裸 -1 或 -999 更好。

于 2008-10-29T13:45:26.210 回答
1

我会选择 2,或者返回值指示是否找到该值的其他变体。

函数返回(或提供引用)的行的值似乎已经表明是否找到了该值。如果未找到值,则提供不包含该值的行号似乎没有意义,因此返回值应为 -1、Null 或任何其他适用于特定语言的值。否则,返回行号这一事实表明已找到该值。

因此,似乎不需要单独的返回值来指示是否找到了该值。但是,如果类型 1 适合特定语言的习语,以及在其中执行函数调用的方式,则类型 1 可能是合适的。

于 2008-10-29T14:26:13.493 回答
1

使用 2) 但返回 -1 (如果返回对行的引用,则返回空引用),该习语被广泛使用(包括通过 .nets indexOf (item) 函数),这就是我可能会做的。

BTW -1 比 -999 更容易接受和广泛使用“幻数”,这就是它“正确”的唯一原因(此处使用引号是有原因的)。

然而,这在很大程度上与您的期望有关。项目是否应该一直在那里,但您只是不知道在哪里?在这种情况下,正常返回索引,如果不存在则抛出错误/异常。

于 2008-10-29T14:36:05.920 回答
0

在这种情况下,该项目可能不存在,这是一个正常的条件。这是绑定到数据表的 GridView 中未选择值的错误陷阱。

于 2008-10-29T15:26:30.767 回答
0

其他一些尚未提及的可能性:

// 方法一:支持协方差;失败时可以返回 default<T>。
T TryGetThing(ref bool 成功);

// 方法2:不支持协方差,但在某些情况下可能允许更简洁的代码
// 如果失败,调用代码将使用一些特定的值。
T TryGetThing(T DefaultValue);

// 方法3:不支持协方差,但在某些情况下可能允许更简洁的代码
// 如果失败,调用代码将使用一些特定的值,但应该
// 除非必要,否则不花时间计算该值。
T TryGetThing(Func<T> AlternateGetMethod);

// 方法四:是否支持协方差;如果这是应该的,ErrorMethod 可以抛出
// 发生,或者它可以设置一些其他方式对调用者可见的标志。
T TryGetThing(操作错误方法);

第一种方法与 Microsoft 在支持协变接口之前开发的方法相反。最后一个在某些方面是最通用的,但可能需要在每次使用时创建几个新的 GC 对象实例(例如闭包和委托)。

于 2012-03-22T22:32:18.173 回答