Wie kann ich Iteratorblöcke zwingen, Parameter zu validieren, bevor sie gepackt und als Fortsetzung zurückgegeben werdenC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Wie kann ich Iteratorblöcke zwingen, Parameter zu validieren, bevor sie gepackt und als Fortsetzung zurückgegeben werden

Post by Anonymous »

Situation: Eine Methode, die ihre Argumente validiert und einen Iterator zurückgibt;

Code: Select all

public static IEnumerable Range(double startingValue, double step, int count)
{
// I would really like this validation to be performed before returning the iterator
if (count < 0) throw new ArgumentOutOfRangeException("count must be >= 0");

double currentValue = startingValue;
for (int i = 0; i < count; i++)
{
yield return currentValue;
currentValue += step;
}
}
Problem: Der Iterator wird erstellt und zurückgegeben, bevor tatsächlich validiert wird, dass die Anzahl gültig ist.
Das bedeutet, dass der Code viel später als der Aufruf zum Erstellen des Iterators fehlschlagen kann.

Möglicherweise – wenn der Bereich als Argument an eine andere Funktion übergeben wird. Sehr viel später.

Code: Select all

[TestMethod]
[TestCategory(nameof(TestCategoryEnum.UnitTest))]
[ExpectedException(typeof(ArgumentOutOfRangeException))]
public void TestCreateRangeNegativeCount_01()
{
var range = Range(1.0, 1.0, -100);

// Should never reach here
Assert.Fail(); // Uh-uh. Absolutely reaches here...

foreach (var obs in range)
{
Assert.Fail();
}
}
Meine aktuelle Lösung besteht darin, den Iteratorblock in eine weitere Methode unterhalb von „Range“ zu packen und stattdessen das zurückzugeben.
Allerdings fühlt sich das sehr wie eine hackige Problemumgehung an.
Gibt es eine (bessere) Möglichkeit, die Methode „Range“ dazu zu bringen, ihre Argumente zu validieren, bevor sie den Iterator zurückgibt?
Ich gehe davon aus, dass dies aufgetreten ist und bereits beantwortet, aber leider konnte ich es bei der Suche nicht finden.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post