Frage

Ich habe eine Funktion FindSpecificRowValue genannt, die die Zeilennummer in einer Datentabelle und gibt nimmt, die einen bestimmten Wert enthält. Wenn dieser Wert nicht gefunden wird, mag ich so an die anrufende Funktion anzuzeigen.

Ist der beste Ansatz zu:

  1. Schreiben Sie eine Funktion, die falsch zurück, wenn nicht gefunden wird, dann, wenn gefunden, und die gefundene Zeilennummer als byref / Ausgabe-Parameter oder
  2. Schreiben Sie eine Funktion, die einen int zurückgibt und -999 Pass zurück, wenn der Zeilenwert nicht gefunden wird, die Zeilennummer, wenn es?
War es hilfreich?

Lösung

Persönlich würde ich nicht tun, entweder mit dem Methodennamen.

Ich würde stattdessen zwei Methoden machen:

TryFindSpecificRow
FindSpecificRow

Dies würde das Muster der Int32.Parse / TryParse folgen, und in C # sie könnte wie folgt aussehen:

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

Edit:. Changed geeignetere auf die Frage sein

Andere Tipps

Funktionen, die Ausnahmen auslösen ausfallen sollte.

Wenn der Fehler Teil der erwarteten Strömung ist dann einen aus Bandwert Rückkehr ist in Ordnung, es wäre denn, Sie können nicht im Voraus bestimmen, was ein Out-of-Band-Wert wäre, in dem Fall, dass Sie eine Ausnahme werfen.

Wenn ich zwischen den Optionen wählen hätte, würde ich die Option 2, wähle aber eine Konstante verwenden, anstatt -999 ...

Sie können auch Rückgabewert als Nullable und zurück Nichts definieren wenn nichts gefunden.

würde ich Option wählen 2. Obwohl ich glaube, ich würde nur -1 verwenden nicht -999.

Richard Harrison ist richtig, dass ein benannte Konstante ist besser als ein bloßes -1 oder -999.

I mit 2 gehen würde, oder eine andere Variante, bei der Rückgabewert zeigt an, ob der Wert gefunden wurde.

Es scheint, dass der Wert der Zeile die Funktion zurückkehrt (oder ein Verweis auf) bereits gibt an, ob der Wert gefunden wurde. Wenn ein Wert nicht gefunden wurde, dann scheint es keinen Sinn zu machen, eine Zeilennummer zur Verfügung zu stellen, die nicht den Wert enthält, so sollte der Rückgabewert -1, oder Null, oder was auch immer anderer Wert für die jeweilige Sprache geeignet. Ansonsten wurde die Tatsache, dass eine Zeilennummer zurückgegeben gibt den Wert gefunden wurde.

So es scheint keine Notwendigkeit für einen separaten Rückgabewert zu sein, um anzuzeigen, ob der Wert gefunden wurde. Allerdings Typ 1 sein könnte sinnvoll, wenn es mit den Idiomen der jeweiligen Sprache paßt, und die Art und Weise Funktionsaufrufe sind in ihm ausgeführt wird.

mit 2 gehen), aber -1 zurück (oder einer Nullreferenz, wenn ein Verweis auf die Zeile) zurückkehrt, das Idiom ist umfangreich verwendet (einschließlich von durch .nets indexOf (Artikel) Funktionen), ist es, was würde ich wahrscheinlich tun .

BTW -1 ist mehr akzeptabel und widly „magische Zahl“ als -999 verwendet, das ist der einzige Grund, warum es „richtig“ (Anführungszeichen es für einen Grund verwendet wird).

Wie sehr dies hat mit dem zu tun, was Sie erwarten. Sollte der Artikel immer dort sein, aber Sie wissen einfach nicht, wo? In diesem Fall gibt den Index normalerweise, und einen Fehler / Ausnahme auslösen, wenn er nicht da ist.

In diesem Fall könnte das Element nicht da sein, und das ist ein in Ordnung Zustand. Es ist ein Fehler Fall für nicht ausgewählte Werte in einem Gridview, die zu einer Datentabelle bindet.

Noch ein paar Möglichkeiten noch nicht erwähnt:

// Method 1: Supports covariance; can return default<T> on failure.
T TryGetThing(ref bool success); 

// Method 2: Does not support covariance, but may allow cleaner code in some cases
// where calling code would use some particular value in in case of failure.
T TryGetThing(T DefaultValue);

// Method 3: Does not support covariance, but may allow cleaner code in some cases
// where calling code would use some particular value in case of failure, but should
// not take the time to compute that value except when necessary.
T TryGetThing(Func<T> AlternateGetMethod);

// Method 4: Does support covariance; ErrorMethod can throw if that's what should
// happen, or it can set some flag which is visible to the caller in some other way.
T TryGetThing(Action ErrorMethod);

Der erste Ansatz ist die Umkehrung des Verfahrens Microsoft in den Tagen entwickelt, bevor die Unterstützung für covariant Schnittstellen vorhanden war. Die letzte ist in gewisser Weise die vielseitigste, ist aber wahrscheinlich die Schaffung von ein paar neuen GC-Objektinstanzen (beispielsweise einen Verschluss und ein Delegierter) jedes Mal, es wird benutzt, um zu verlangen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top