Warum empfiehlt die .NET Framework-Richtlinien, dass Sie nicht ref / out Argumente verwenden Sie?

StackOverflow https://stackoverflow.com/questions/214688

  •  03-07-2019
  •  | 
  •  

Frage

Offenbar sind sie „verwirrend“. Ist das ernsthaft der Grund? Können Sie von irgendwelchen anderen denken?

War es hilfreich?

Lösung

Haben Sie, wie viele Entwickler gesehen nicht wirklich verstehen, ref / aus?

Ich benutze sie, wo sie wirklich notwendig sind, aber sonst nicht. Sie sind in der Regel nur dann sinnvoll, wenn Sie tatsächlich zwei oder mehr Werte zurückgeben wollen - in diesem Fall ist es zumindest wert ist Denken darüber, ob es eine Möglichkeit gibt das Verfahren zur Herstellung nur anstelle eines tun. Manchmal mit ref / out ist die am besten geeignete Ansatz -. Die verschiedenen TryParse Methoden etc

Andere Tipps

Meiner Meinung nach sind sie ein Code Geruch betrachtet, da in der Regel eine viel bessere Option ist. Rückkehr ein Objekt

Wenn Sie bemerken, in der .NET-Bibliothek sie nur in einigen speziellen Fällen verwendet werden, nämlich TryParse -ähnlichen Szenarien, in denen:

  • eine Klasse zurückkehren würde bedeuten, einen Werttyp Box
  • der Vertrag des Verfahrens erfordert es, schnell zu sein, und so Boxen / Unboxing ist kein gangbarer Weg.

ref / out bedeutet automatisch Veränderlichkeit und funktionale Programmierung mit unveränderlichen Werten ist der letzte Schrei in diesen Tagen. Versuchen Sie, einen Anruf zu Dictionary.TryGetValue in einer LINQ-Abfrage einfügen. Die API erfordert Deklarieren von Variablen und ruiniert jeden ‚fließend‘ in der API.

Das ist nicht zu sagen, das ist „der Grund“, aber es ist ein Beispiel für ein „Grund“.

(Siehe auch

http://lorgonblog.spaces.live.com/blog /cns!701679AD17B6D310!181.entry

für Kommentierung wie funktionalen Sprachen beschäftigen sich mit solchen APIs).

Verwirrend ist wahrscheinlich der beste Grund. Verwirrende Mittel verringert Wartbarkeit und eine erhöhte Wahrscheinlichkeit auf subtile Bugs einzuführen. Ich sehe sie in einer ähnlichen Ansicht auf die „gehe zu“ Steuerflussrechnung. Zwar ist es nicht von Natur aus schlecht aus eigenem Antrieb, hat es zu viele viele unmöglich führen Programme im Laufe der Jahrzehnte zu lesen / verstehen.

Bleiben Sie weg von allem, was Ihr Code verwirrender machen, dann muss es sein.

Having said that, diese Keywords existieren wahrscheinlich, weil der Framework-Entwickler für solche Dinge brauchen sah. Verwenden Sie sie, wenn es keine geeignete Abhilfe ist, aber vermeiden sie, wenn Sie können.

ref / out auch mit „Func“ Delegierten nicht funktionieren, so dass diese Art APIs sind weniger zusammensetzbare / wiederverwendbar mit einigen anderen APIs, die Delegierten verwenden.

Nur ein Gedanke, finde ich ref / out, nützlich zu sein, wenn die Argumente den Stand der Ausführung erfassen in Zielmethode anstatt zurückgegebenen Daten zu erfassen. Betrachten wir ein Szenario, wenn Sie eine Fehlermeldung von einem Dienst erhalten möchten, die Customer-Objekt zurückgibt.

Customer GetCustomerById(int id, out string errorMessage);

Wenn diese Methode fehlschlägt, würden Sie wahrscheinlich null zurück Customer-Objekt oder eine Ausnahme werfen. Allerdings, wenn ich die Fehlerursache wissen will (Validierung? Datenbank?), Würde ich Argument aus. errormessage Argument hier hat nichts mit Daten zu tun, einfach verwendet, um zu erfassen, was mit der Ausführung der Methode falsch ist.

Persönlich, wenn ich eine Methode, die erwartet wird, um zwei oder mehr wesentlichen Daten / Werte zurückzukehren, würde ich das Design meines Codes überdenken.

Der Grund, warum ich gesagt wurde, ist die 1,0 GC Probleme hatte, als ref / out verwendet wurde. Die GC in 2.0 (und wahrscheinlich nicht 1.1 entweder) nicht solche Probleme haben, damit ich normalerweise davon ausgehen, es wäre ein nun nicht nützlich Erbe ist.

@TraumaPony Es wäre schön, wenn Sie uns eine Quelle geben (URL oder etwas) zu diesem .NET Framework guidlines.

Sie sollten Objekte zurückkehren wahrscheinlich ist der wahrscheinlichste Grund, dass sie empfehlen die Verwendung ref nicht oder aus.

„ref“ wirklich braucht nur verwendet werden, wenn skalare Werte vorbei, aber ich sehe die Leute es verwenden oft für Objekte, die sowieso als Referenz übergeben werden.

Ist das nicht die Komplexität des Codes Grund genug? Vergleichen Sie:

int myValue;
ReadFromSomewhere(ref myValue);

An:

int myValue = ReadFromSomewhere();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top