mehr Vorteile oder Nachteile zu delegieren, die Mitglieder über die klassischen Funktionen?

class my_class
{
    public int add_1(int a, int b) {return a + b;}
    public func<int, int, int> add_2 = (a, b) => {return a + b;}
}

add_1 ist eine Funktion in der Erwägung, dass add_2 ein Delegierter. Allerdings ist in diesem Zusammenhang die Delegierten können forfill eine ähnliche Rolle.

Wegen Präzedenzfall und das design der Sprache ist die Standard-Wahl für C# müssen Methoden Funktionen.

Jedoch beide Ansätze haben vor-und Nachteile, so dass ich produziert habe eine Liste. Gibt es noch mehr Vorteilen oder Nachteilen der beiden Ansätze?

Vorteile zu herkömmlichen Methoden.

  • mehr konventionelle
  • Benutzer von außen die Funktion finden Sie unter benannte Parameter - für die add_2 syntax arg_n und eine Art ist in der Regel nicht genug Informationen.
  • funktioniert besser mit intellisense - ty Minitech
  • arbeitet mit Reflexion - ty Minitech
  • arbeitet mit erbschaft - ty Eric Lippert
  • hat "dieses" - ty CodeInChaos
  • geringere Gemeinkosten, Geschwindigkeit und Speicher - ty Minitech und CodeInChaos
  • brauchen nicht zu denken über public\private in Bezug auf die beiden ändern und mit der Funktion. - ty CodeInChaos
  • weniger dynamisch, weniger ist erlaubt, dass zur Kompilierzeit nicht bekannt - ty CodeInChaos

Vorteile "Feld der delegate-Typ" - Methoden.

  • mehr im Einklang, nicht member-Funktionen und Daten-member, es ist nur einfach alle Daten der Mitglieder.
  • können äußerlich Aussehen und Verhalten sich wie eine variable.
  • speichern Sie es in einem container funktioniert gut.
  • mehrere Klassen nutzen könnte, die gleiche Funktion, als ob es wurden jeweils diejenigen member-Funktion ist, wäre dies sehr allgemein, präzise und haben gute Wiederverwendung von code.
  • einfach, überall zu verwenden, zum Beispiel als lokale Funktion.
  • vermutlich funktioniert gut, wenn übergeben, um mit garbage collection.
  • mehr Dynamik, weniger bekannt sein muss zur compile-Zeit, zum Beispiel könnte es sein, Funktionen, konfigurieren Sie das Verhalten der Objekte zur Laufzeit.
  • als ob die Kapselung ist es code, kombiniert und überarbeitet, msdn.microsoft.com/en-us/library/ms173175%28v=vs.80%29.aspx
  • Benutzer außerhalb der Funktion sehen Unbenannte Parameter - manchmal ist das hilfreich, obwohl es schön wäre, um in der Lage sein, Sie zu benennen.
  • kann kompakter sein, in diesem einfachen Beispiel wird zum Beispiel die Rückgabe beseitigt werden könnten, wenn es ein parameter die Klammern könnten auch entfernt werden.
  • roll ' r eigenen Verhaltensweisen wie Vererbung - ty Eric Lippert
  • anderen überlegungen wie der funktionale, modulare, verteilte, (code zu schreiben, zu testen oder Argumentation über code) etc...

Bitte nicht die Abstimmung zu schließen, das ist schon passiert und hab es wieder geöffnet. Es ist eine berechtigte Frage, auch wenn Sie glaube nicht, dass die Delegierten Ansatz hat viele praktische Nutzung gegeben, wie Sie Konflikte mit etablierten coding style oder Sie nicht wie den Vorteilen der Delegierten.

  • Sind Sie sich bewusst, dass das zweite Beispiel ist nicht eine Funktion? Es ist ein Delegierter.
  • Wenn Sie zurückkehren möchten ungültig, dann verwenden Sie Action<> statt Func<>
  • Wo hast du diesen angeboten eine Wahl?
  • Ein Beispiel, warum das schrecklich ist? my_class a = new my_class(); ein.add_2 = null; ein.add_2(1, 2); ----- NullReferenceException! AHHHH!
  • Ich verstehe nicht, warum das geschlossen wurde. Es ist ein absolut vernünftig Frage über die konkurrierenden Faktoren in der Gestaltung von details der Implementierung der Klasse. ich Häufig verwenden diese Technik in meinen eigenen Programmen, weil es echte Vorteile -- nämlich, dass es mir erlaubt, sehr leicht zu entscheiden, welche Methoden in einer Funktion haben memoization angewendet.
  • Ein Delegat umschließt eine Funktion.
  • So verwenden Sie die readonly keyword, oder eine private setter.
  • Ich Stimme zu, dass es eine gute und interessante Frage. Aber wohl nicht erfüllen, die ALSO die Richtlinien. Fragen dieser Art führen zu Diskussion, subjektive Antworten, und teilweise Antworten, die qualifiziert Sie für eine Schließung.
  • Warum sollten Sie so etwas tun, nur um eine Funktion schreiben, das wird jeder machen, der das guckt Ihr verbringen Monate in verstehen WARUM
  • Ich möchte vermeiden, der zweite für öffentliche Mitglieder. Für interne code kann es sinnvoll sein (insbesondere, wenn static readonly) .
  • Es sei denn, Sie haben sich die Delegierten mit aller Regelmäßigkeit. Oder Javascript, in der die Methoden definiert sind, die in ganz der gleichen Weise.
  • ja 🙂 in der Tat. Schreckliche Weise, um code zu schreiben aus meiner Sicht.
  • Wenn Sie tatsächlich setzen die Delegierten, Sie können dicht über den Gegenwert von this, und Sie erhalten die gleiche Vorteil.
  • Meine größte Sorge zu diesem code, und die Art und Weise die Frage beantwortet wurde, ist das Gefühl, dass der OP meint, dass die beiden gleichwertig sind, wie Sie sein würde, wenn dies JavaScript.
  • Ich denke, Javascript ist keine option 1, da kann man wieder einsetzen, "Methoden", und alle Aufrufe werden Laufzeit dynamisch. Zu sehen, dass er bekam eine etwas genaue und ansehnliche Liste von pros und cons, ich bin nicht sicher, ob die OP fehlt nichts, außer vielleicht die Angst gegen den grain und verliert einige perf/Sicherheit 🙂 Wenn Sie möchten, dass einige Validierung von Menschen zu beantworten, obwohl die Benutzer solcher code (das ersetzt jede Methode, die mit option 2) wäre sehr überrascht, und vielleicht Sauer ist, da es möglicherweise wegspülen eine Menge von Werkzeugen und perf für potenziell wenig Verstärkung.
  • JavaScript hat Methoden, nicht nur Klassen. Und was die OP fehlt, ist, dass die Vorteile für Methode 2 sind nicht wichtig, außer in einem winzigen Bruchteil der Fälle. Die Frage gestellt wird, als ob die beiden vielleicht äquivalent: sind Sie nicht, es sei denn, Sie sind verpflichtet, tun, lösen einen kleinen fcaction der Fälle.
  • Ich bezweifle, dass eine funktionale Programmierer, wie Sie Ihre öffentlichen veränderlichen Feld.
  • Feste CodeInChaos. Ich dachte an die Verwendung von Funktionen als Parameter an Funktionen und solche, aber probbably, havn ' T viel getan, funktional. Ich getroffen habe, dass line-out, wenn Sie denken, ein Weg, der auch etwas ähnlich, aber wahr, ich werde es anstelle 😛
  • Aktuelle version der Antwort: ich denke, dass eric erwähnt überlastung, nicht die Vererbung. Sie können auch verwenden die Delegierten void zurück - nutzen Sie einfach Action statt Func wie @Hogan erwähnt.
  • Die Abstimmung zu schließen. Siehe Ben Voight ' s Kommentar. Ich mag die Antworten auf diese Frage, aber die Art und Weise es wird gebeten, erfordert eine subjektive Antwort. SO Fragen sollten nie einfach Fragen für weitere Diskussion, und das sollten Sie auch nicht sein, die Eimer zu werfen, Daten in. Mit dem Eimer ist nützlich, Sie sollten aber nicht die wichtigste Frage. SO Fragen sollte Fragen für eine definitive Antwort für eine bestimmte Frage. Einer Weise zu formulieren, diese Frage, um eine Objektive Antwort (das ist die Frage, die fast alle beantwortet, obwohl es gar nicht gefragt): "Warum würde jemand ersetzen Sie jede Methode-definition mit einer delegieren?"
  • Ich habe mir vor kurzem aktualisiert die Einführung der Frage Merlyn. Aber nicht, wie Sie vorgeschlagen, wie es scheint, eine sehr einseitige Art zu Fragen es. Beachten Sie auch, dass es schon geschlossen, bevor und schnell wieder geöffnet wird. ty Hogan, ich habe gerade sanktioniert dein Kommentar.

Schreibe einen Kommentar