Ich schreibe eine Art Warteschlangenimplementierung mit einer TryDequeue
Methode, die ein ähnliches Muster wie verschiedene .NET- TryParse
Methoden verwendet. Wenn die Aktion erfolgreich war, out
gebe ich einen booleschen Wert zurück und verwende einen Parameter, um den tatsächlichen Wert in der Warteschlange zurückzugeben.
public bool TryDequeue(out Message message) => _innerQueue.TryDequeue(out message);
Jetzt vermeide ich gerne out
Params, wann immer ich kann. C # 7 gibt uns variable Delkarationen aus, um die Arbeit mit ihnen zu erleichtern, aber ich betrachte Params immer noch eher als notwendiges Übel als als nützliches Werkzeug.
Das von dieser Methode gewünschte Verhalten ist wie folgt:
- Wenn es ein zu löschendes Objekt gibt, geben Sie es zurück.
- Wenn keine zu löschenden Elemente vorhanden sind (die Warteschlange ist leer), stellen Sie dem Anrufer genügend Informationen zur Verfügung, um entsprechend zu handeln.
- Geben Sie nicht einfach einen leeren Artikel zurück, wenn noch keine Artikel verfügbar sind.
- Machen Sie keine Ausnahmen, wenn Sie versuchen, eine leere Warteschlange zu löschen.
Derzeit verwendet ein Aufrufer dieser Methode fast immer ein Muster wie das folgende (unter Verwendung der C # 7-Out-Variablensyntax):
if (myMessageQueue.TryDequeue(out Message dequeued))
MyMessagingClass.SendMessage(dequeued)
else
Console.WriteLine("No messages!"); // do other stuff
Welches ist nicht das schlechteste, alles in allem. Aber ich kann nicht anders, als zu glauben, dass es dafür vielleicht bessere Möglichkeiten gibt (ich bin absolut bereit zuzugeben, dass es keine gibt). Ich hasse es, wenn der Anrufer seinen Fluss mit einer Bedingung unterbrechen muss, wenn er nur einen Wert erhalten möchte, falls einer existiert.
Welche anderen Muster gibt es, um dasselbe "Versuch" -Verhalten zu erreichen?
Für den Kontext kann diese Methode möglicherweise in VB-Projekten aufgerufen werden. Bonuspunkte für etwas, das in beiden Fällen gut funktioniert. Diese Tatsache sollte jedoch sehr wenig Gewicht haben.
Option<T>
Struktur und geben Sie sie zurück. Diesebool Try(..., out data)
Funktionen sind ein Gräuel.