3

データテーブルを取り、特定の値を含む行番号を返す FindSpecificRowValue という関数があります。その値が見つからない場合は、呼び出し元の関数にそのことを示したいと思います。

次への最良のアプローチは次のとおりです。

  1. 見つからない場合は false を返し、見つかった場合は true を返し、見つかった行番号を byref/output パラメーターとして返す関数を記述します。または、
  2. int を返す関数を作成し、行の値が見つからない場合は -999 を返し、見つかった場合は行番号を返しますか?
4

8 に答える 8

13

個人的には、そのメソッド名ではどちらも行いません。

代わりに、次の 2 つの方法を作成します。

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

戻り値をNullableとして定義し、何も見つからない場合は Nothing を返すこともできます。

于 2008-10-29T13:57:21.383 に答える
3

失敗した関数は例外をスローする必要があります。

失敗が予想されるフローの一部である場合、範囲外の値を返すことは問題ありません。ただし、範囲外の値が何であるかを事前に決定できない場合は除きます。

あなたのオプションから選択する必要がある場合、オプション 2 を選択しますが、-999 ではなく定数を使用します...

于 2008-10-29T13:48:39.997 に答える
2

オプション 2 を選択します。ただし、-999 ではなく -1 を使用すると思います。

リチャード・ハリソンは、名前付き定数がそのままの -1 や -999 よりも優れているという点で正しいです。

于 2008-10-29T13:45:26.210 に答える
1

2) を使用しますが、-1 (行への参照を返す場合は null 参照) を返します。

ところで、-1 は -999 よりも許容範囲が広く、広く使用されている「マジック ナンバー」です。

ただし、これの多くは、期待するものと関係があります。アイテムは常にそこにあるはずですが、どこにあるのかわかりませんか? その場合、通常どおりインデックスを返し、そこにない場合はエラー/例外をスローします。

于 2008-10-29T14:36:05.920 に答える
1

2、または戻り値が値が見つかったかどうかを示す他のバリエーションを使用します。

関数が返す (または参照を提供する) 行の値は、値が見つかったかどうかを既に示しているようです。値が見つからなかった場合、値を含まない行番号を指定しても意味がないように思われるため、戻り値は -1 または Null、または特定の言語に適したその他の値にする必要があります。それ以外の場合、行番号が返されたという事実は、値が見つかったことを示します。

したがって、値が見つかったかどうかを示す別の戻り値は必要ないようです。ただし、タイプ 1 は、特定の言語のイディオムや、その中で関数呼び出しが実行される方法に適合する場合に適している場合があります。

于 2008-10-29T14:26:13.493 に答える
0

まだ言及されていない別のいくつかの可能性:

// 方法 1: 共分散をサポートします。失敗時に default<T> を返すことができます。
T TryGetThing(ref bool success);

// 方法 2: 共分散はサポートされていませんが、場合によってはよりクリーンなコードが可能になる場合があります
// 呼び出しコードは、失敗した場合に特定の値を使用します。
T TryGetThing(T DefaultValue);

// 方法 3: 共分散はサポートされていませんが、場合によってはよりクリーンなコードが可能になる場合があります
// 呼び出しコードは、失敗した場合に特定の値を使用しますが、
// 必要な場合を除き、その値の計算に時間をかけません。
T TryGetThing(Func<T> AlternateGetMethod);

// 方法 4: 共分散をサポートします。ErrorMethod は、それが必要な場合にスローできます
// 発生するか、他の方法で呼び出し元に表示されるフラグを設定できます。
T TryGetThing(Action ErrorMethod);

最初のアプローチは、Microsoft が共変インターフェイスのサポートが存在する前に開発した方法の逆です。後者はいくつかの点で最も汎用性がありますが、使用するたびにいくつかの新しい GC オブジェクト インスタンス (クロージャーとデリゲートなど) の作成が必要になる可能性があります。

于 2012-03-22T22:32:18.173 に答える
0

この場合、アイテムがそこにない可能性があり、それは問題ありません。これは、データ テーブルにバインドする GridView で選択されていない値のエラー トラップです。

于 2008-10-29T15:26:30.767 に答える