Frage

Ich rufe an:

myResult = MakeMyCall(inputParams, out messages);

aber die Nachrichten interessieren mich eigentlich nicht.Wenn es ein Eingabeparameter wäre, der mir egal wäre, würde ich einfach eine Null übergeben.Wenn es die Rückkehr wäre, die mir egal wäre, würde ich es einfach weglassen.

Gibt es eine Möglichkeit, mit einem Out etwas Ähnliches zu tun, oder muss ich eine Variable deklarieren, die ich dann ignoriere?

War es hilfreich?

Lösung

Beginnend mit C # 7.0 ist es möglich, Parameter zu vermeiden als auch predeclaring, wie sie zu ignorieren.

public void PrintCoordinates(Point p)
{
    p.GetCoordinates(out int x, out int y);
    WriteLine($"({x}, {y})");
}

public void PrintXCoordinate(Point p)
{
    p.GetCoordinates(out int x, out _); // I only care about x
    WriteLine($"{x}");
}

Quelle: https : //blogs.msdn.microsoft.com/dotnet/2017/03/09/new-features-in-c-7-0/

Andere Tipps

Sie haben eine Variable deklarieren, die Sie dann ignorieren. Dies ist am häufigsten der Fall mit dem TryParse (oder TryWhatever) Mustern, wenn es verwendet wird, um die Gültigkeit der Benutzereingabe zu testen (zum Beispiel kann es als Nummer analysiert werden?), Ohne sich um den tatsächlichen geparsten Wert zu sorgen.

verwendet das Wort „entsorgen“ in der Frage, was ich vermute, nur unglücklich war - aber wenn der Out-Parameter von einem Typ ist, die IDisposable implementiert, sollten Sie sicher entsorgen nennen, es sei denn die Methode Dokumentation heißt es ausdrücklich, dass der Wert doesn Empfang ‚t Besitz verleihen. Ich kann mich nicht erinnern, jemals ein Verfahren mit einem Einweg-out Parametern zu sehen, obwohl, so dass ich hoffe, das war nur eine unglückliche Wortwahl.

Leider sind Sie verpflichtet, etwas zu übergeben, da es das Verfahren einzustellen ist nicht erforderlich. So können Sie nicht null senden, weil die Methode, sie setzen erforderlich ist, würde die Luft sprengen.

Ein Ansatz, die Hässlichkeit zu verbergen wäre, das Verfahren in einem anderen Verfahren zu wickeln, die den out Parameter für Sie tut gerne so:

String Other_MakeMyCall(String inputParams)
{
    String messages;

    return MakeMyCall(inputParams, out messages);
}

Dann können Sie Other_MakeMyCall aufrufen, ohne mit out Parameter zur Geige, Sie nicht brauchen.

Wenn die ursprüngliche Funktion wird wie folgt erklärt:

class C
{
    public Result MakeMyCall(Object arg, out List<String> messages);
}

Sie können eine Erweiterung Methode wie folgt erklären:

static class CExtension
{
    public static Result MakeMyCall(this C obj, Object arg)
    {
        List<String> unused;
        return obj.MakeMyCall(arg, out unused);
    }
}

Die Extension-Methode wird wie eine Überlastung verhalten, dass die Out-Parameter optional macht.

Die Visual Basic-Compiler tun dies durch ein Dummy-Variable zu schaffen. C # könnte es tun, wenn Sie Microsoft seine eine gute Idee überzeugen kann.

Wenn die Klasse von messages IDisposable implementiert, sollten Sie es nicht ignorieren. Betrachten Sie so etwas wie der folgende Ansatz (nicht syntaktisch korrekt sein, da ich nicht C # in einer Weile geschrieben habe):

using (FooClass messages) {
    myResult = MakeMyCall(inputParams, messages);
}

Sobald außerhalb des using Block wird messages automatisch entsorgt werden.

Sie müssen eine Variable für den Out-Parameter übergeben.Sie müssen die Variable vor der Übergabe nicht initialisieren:

MyMessagesType messages;
myResult = MakeMyCall(inputParams, out messages); 

Normalerweise können Sie „Nachrichten“ nach dem Aufruf einfach ignorieren – es sei denn, „Nachrichten“ müssen aus irgendeinem Grund entsorgt werden, beispielsweise aufgrund der Nutzung begrenzter Systemressourcen. In diesem Fall sollten Sie Dispose() aufrufen:

messages.Dispose();

Wenn es eine beträchtliche Menge an Speicher verbrauchen könnte und für eine Weile im Gültigkeitsbereich bleiben soll, sollte es wahrscheinlich auf null gesetzt werden, wenn es sich um einen Referenztyp handelt, oder auf eine neue Standardinstanz, wenn es sich um einen Werttyp handelt, damit der Müll verschwindet Collector kann den Speicher zurückfordern:

messages = null; // Allow GC to reclaim memory for reference type.

messages = new MyMessageType(); // Allow GC to reclaim memory for value type.

In diesem Fall habe ich eine generische Erweiterungsmethode für ConcurrentDictionary gemacht, die kein Löschen oder entfernen Methode hat.

//Remove item from list and ignore reference to removed item
public static void TryRemoveIgnore<K,T>(this ConcurrentDictionary<K,T> dictionary, K key)
{
    T CompletelyIgnored;
    dictionary.TryRemove(key, out CompletelyIgnored);
}

Wenn Sie von einer Instanz von ConcurrentDictionary genannt:

ClientList.TryRemoveIgnore(client.ClientId);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top