3 Stimmen

C# Out-Parameter-Trickserei?

Hallo, ich habe C#-Code, der ähnlich wie dieser aussieht:

int someNumber;
Thing someThing;

doStuff(out someNumber);
someThing = new Thing(someNumber); 

Was ich gerne wissen würde, ist, ob es eine Möglichkeit gibt, den someNumber zu entfernen und someThing direkt in den Parameterargumenten zu instanziieren.

Editieren des tatsächlichen Codes gibt mir 8 Out-Parameter zurück, aber ich habe versucht es einfach zu halten, daher sieht es eher so aus:

int someNumber1, someNumber2, somNumber3, someNumber4,
someNumber5, someNumber6, someNumber7, someNumber8;

Thing someThing1, someThing2, someThing3, someThing4,
someThing5, someThing6, someThing7, someThing8;

doStuff(out someNumber1, out someNumber2, out someNumber3, out someNumber4,
out someNumber5, out someNumber6, out someNumber7, out someNumber8);

someThing1 = new Thing(someNumber1); etc.....................

5voto

Jon Skeet Punkte 1325502

Nun, wenn Sie sich regelmäßig dabei finden, könnten Sie etwas Ähnliches tun:

public delegate void OutAction(out T value);

public TResult UseOut
    (OutAction outAction,
     Func selector)
{
    TIntermediate tmp;
    outAction(out tmp);
    return selector(tmp);
}

Rufen Sie es dann wie folgt auf (beachten Sie, dass doStuff hier eine Methodengruppe ist - das Fehlen von () ist beabsichtigt!):

Thing someThing = UseOut(doStuff, x => new Thing(x));

Ich sage nicht unbedingt, dass das eine gute Idee ist, aber es ist etwas, über das Sie nachdenken können.

EDIT: Wenn Sie anfangen, mehrere Parameter zu bekommen, wird es viel schwieriger - denn der out-Parameter könnte der erste, zweite, dritte, vierte usw. sein...

EDIT: Etwas einfachere Version:

public TResult ReturnOut(OutAction outAction)
{
    TResult tmp;
    outAction(out tmp);
    return tmp;
}

Verwendung:

Thing someThing = new Thing(ReturnOut(doStuff));

3voto

Marc Gravell Punkte 970173

Nun, zunächst einmal, gibt es einen Grund, warum Sie hier nicht einfach eine normale Rückkehr verwenden können anstelle von out? Es wäre sauberer (es sei denn, es gibt einen guten Grund).

Dann können Sie verwenden:

someThing = new Thing(doStuff());

1voto

Neil Barnwell Punkte 39692

Nicht wirklich. Du könntest someThing als byref übergeben, damit die doStuff-Methode es initialisiert, aber das ist hässlich. Was du hier hast, ist in Ordnung.

Es wäre wahrscheinlich am besten, einfach einen Wert von doStuff zurückzugeben, in diesem Fall ist dies der beste Ansatz:

var thing = new Thing(doStuff());

Out-Parameter werden am besten verwendet, wenn du das TryParse-Muster implementieren möchtest oder wenn du mehrere Werte aus einem Funktionsaufruf zurückgeben möchtest. Um ehrlich zu sein, selbst dann ist es möglicherweise am besten, ein Objekt mit Eigenschaften zurückzugeben, die die benötigten Werte enthalten.

0voto

Aistina Punkte 12045

Ich denke nicht, dass dies möglich ist, da doStuff keinen Wert zurückgibt. Warum möchtest du das tun? Meiner Meinung nach ist es sowieso viel lesbarer, diese beiden Funktionsaufrufe auf getrennte Zeilen zu setzen, und selbst wenn es möglich wäre, gäbe es sicherlich keine Leistungssteigerung.

0voto

GeekyMonkey Punkte 11711

Wenn Sie die aufgerufene Funktion nicht ändern können und nicht bereit sind, sie zu umschließen, dann sind Sie mit dem vorhandenen Code stecken geblieben.

Ich würde jedoch vorschlagen, sie zu umschließen, um sie zu bereinigen. Ich würde sie dazu bringen, ein Integer-Array zurückzugeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X