Ich betrachte die MvcContrib Grid-Komponente und ich bin fasziniert und gleichzeitig abgestoßen von einem syntaktischen Trick, der in der Gittersyntax :
.Attributes(style => "width:100%")
Die obige Syntax setzt das style-Attribut des generierten HTML auf width:100%
. Wenn Sie genau hinschauen, ist "Stil" nirgends angegeben. Er wird abgeleitet aus dem Name des Parameters im Ausdruck! Ich musste nachforschen und fand heraus, wo die "Magie" passiert:
Hash(params Func<object, TValue>[] hash)
{
foreach (var func in hash)
{
Add(func.Method.GetParameters()[0].Name, func(null));
}
}
Der Code verwendet also in der Tat den formalen Namen der Parameter zur Kompilierungszeit, um das Wörterbuch der Attribut-Name-Wert-Paare zu erstellen. Das daraus resultierende Syntaxkonstrukt ist in der Tat sehr ausdrucksstark, aber gleichzeitig auch sehr gefährlich.
Die allgemeine Verwendung von Lambda-Ausdrücken ermöglicht die Ersetzung der Namen ohne Nebenwirkung verwendet werden. Ich sehe ein Beispiel in einem Buch, das sagt collection.ForEach(book => Fire.Burn(book))
Ich weiß, dass ich in meinen Code schreiben kann collection.ForEach(log => Fire.Burn(log))
y es bedeutet dasselbe . Aber mit der MvcContrib Grid-Syntax finde ich plötzlich Code, der aktiv nach den Namen sucht und Entscheidungen trifft, die ich für meine Variablen wähle!
Also ist dies gängige Praxis mit der C# 3.5/4.0-Gemeinschaft und die Lambda-Ausdrücke Liebhaber? Oder handelt es sich um einen abtrünnigen Außenseiter, über den ich mir keine Sorgen machen sollte?
10 Stimmen
+1 für die Einführung der Hash-Rakete in C#
2 Stimmen
Foreach (var func in hash) ändern in: Array.ForEarch(hash, func => Add(func.Method.GetParameters()[0].Name, func(null)));
34 Stimmen
Ich würde behaupten, dass dies offensichtlich ist, solange man bereit ist, die Absicht des Codes zu betrachten und nicht nur die Syntax zu analysieren. Wenn Sie guten Code lesen, sollten Sie das ohnehin tun. Die Syntax ist nur ein Vehikel für die Intention, und ich würde behaupten, dass dies ein Code ist, der die Intention offenbart.
4 Stimmen
Waren sie ehemalige Perl-Benutzer? Dort,
style => "width:100%"
ist gleichbedeutend mit"style", "width:100%"
in jeder Hinsicht.3 Stimmen
@Eric Es muss schlimm sein, wenn ein Mitglied des Compiler-Teams einen solchen Kommentar abgibt. Vielleicht sollten Sie Anders fragen, was er denkt?
3 Stimmen
Ich warte auf stackoverflow.com/users/8560 einspringen und seinen Kodex verteidigen...
0 Stimmen
Dies führt nur zu Problemen und unbeabsichtigten Folgen.
193 Stimmen
Ich habe Anders (und den Rest des Designteams) gefragt, was sie davon halten. Sagen wir einfach, die Ergebnisse wären in einer familienfreundlichen Zeitung nicht druckbar.
4 Stimmen
@Eric Lippert: Es gibt freche, schlüpfrige, blaue, bunte, nicht familienfreundliche Zeitungen? Wo kann ich diese finden? Könnten Sie darüber hinaus die Einzelheiten der Abscheulichkeiten erläutern? Ich würde wirklich gerne wissen, warum ihr das so schlimm findet...
14 Stimmen
Klar, in Seattle ist es "The Stranger". Was die Gründe für die Abscheulichkeit angeht, so könnten wir mit dem nicht offensichtlichen, cleveren (denken Sie daran, clever ist schlecht cleverer Code ist schwer zu pflegen), überhaupt nicht im Rahmen der von den Entwicklern von Lambdas vorgesehenen Anwendungsfälle, langsam, spröde, unportabel und unnötig.
22 Stimmen
C# fehlt derzeit eine saubere, einfache Syntax für Maps, insbesondere für Maps, die an Funktionen übergeben werden. Verschiedene dynamische Sprachen (Ruby, Python, JavaScript, ColdFusion 9) haben eine saubere, leichte Syntax für das, in gewissem Umfang oder andere.
1 Stimmen
@Eric Danke für die Frage. Ich habe weiter unten argumentiert, dass dies eine gut aussehende Syntax ist, kann aber Ihr Argument dagegen verstehen. Das sind alles gute Gründe, etwas nicht zu tun.
28 Stimmen
Oh, ich finde, es sieht entzückend aus. Was eine Syntax für Maps angeht, ja, es wäre toll, wenn wir new { {"Do", "A deer" } , {"Re", "Goldene Sonne"} ... } und der Compiler die Konstruktion einer Map ableiten könnte, so wie new[] {1, 2,3 } die Konstruktion eines int-Arrays ableitet. Wir ziehen diese Art von Dingen in Betracht.
2 Stimmen
Was ist eigentlich eine Syntaxkarte?
15 Stimmen
Eine "Map" ist das, was die .NET-Bibliothek ein "Dictionary" nennt - ein Gerät, das einen Schlüssel (und der Schlüssel kann ein Schlüssel, ein Paar von Schlüsseln oder was auch immer sein) auf einen Wert "abbildet". Viele Konzepte in der Programmierung sind eigentlich nur eine ausgefallene Art, eine Abbildung zu erstellen. Zum Beispiel könnte man sich someObject.SomeProperty als eine Abbildung des Paares (Wert von someObject, Name von SomeProperty) auf den Wert der Eigenschaft vorstellen. Da diese Idee so grundlegend ist, ist es schön, wenn eine Programmiersprache eine elegante Syntax für die Beschreibung einer beliebigen Abbildung bietet. Sammlungsinitialisierer sind ein guter Anfang.
6 Stimmen
Soeben gebloggt von K. Scott Allen - "Deine Abscheulichkeit ist mein cleverer Hack" odetocode.com/Blogs/scott/archive/2009/11/30/
1 Stimmen
Ich schätze, das passiert, wenn jemand Rails verwenden möchte, aber C# kennt? Nicht alles, was man in RoR machen kann, muss auf andere Sprachen und Frameworks portiert werden
8 Stimmen
Ich habe versucht, auf einige der hier aufgeworfenen Fragen in meinem Blog zu antworten: jeremyskinner.co.uk/2009/12/02/lambda-abuse-the-mvccontrib-hash
1 Stimmen
Lambdas werden zu den regulären Ausdrücken von .NET Achselzucken
19 Stimmen
Eric Lippert, ich respektiere Sie sehr, aber ich denke, dass Sie und die Gruppe (einschließlich Anders, den ich FREAKIN' TREMENDOUSLY respektiere) dies zu hart anpacken. Wie Sie zugeben, fehlt es C# an einer präzisen Syntax für Maps, und einige andere Sprachen (wie Ruby) haben großartige Syntaxen. Dieser Typ hat einen Weg gefunden, die Syntax zu bekommen, die er wollte. Ich räume ein, dass es ähnliche Wege gibt, um es auszudrücken, die fast genauso ausdrucksstark wie seine Syntax, aber mit weniger Nachteilen. Aber seine Syntax und die Tatsache, dass er so hart daran gearbeitet hat, um sie zu erhalten, zeigt deutlich, dass eine Verbesserung der Sprache notwendig ist. Die bisherige Leistung deutet darauf hin, dass Sie etwas Großartiges dafür schaffen werden.
6 Stimmen
Ich frage mich, was passiert, wenn dies ein wenig zu sehr optimiert oder - noch schlimmer - verschleiert wird.
2 Stimmen
Ich würde niemanden einstellen, der dies entweder tut oder nicht sofort versteht, warum es nicht getan werden sollte.
9 Stimmen
Ich liebe C#, aber es ist nicht die ausdrucksstärkste Sprache, die es gibt. Es gibt viele Meta-Programmierkonzepte, die C# nicht ausdrücken kann - und doch stoßen wir auf Probleme, deren Lösungen sie erfordern oder von ihnen profitieren könnten. Die CLR verbirgt alle möglichen magischen Missbräuche der unteren Ebenen, und einige Leute beschweren sich auch über sie. Aber sehen Sie sich an, was wir damit alles machen können! Das Gleiche gilt für diesen Lambda-Trick. Es ist eine gut abgerundete Lösung für einen ansonsten hässlichen C#-Ausdruck, sie scheint gut dokumentiert zu sein und ihr Einsatz/Zweck ist visuell offensichtlich, und sie hilft uns, schnell coole Websites zu erstellen.
1 Stimmen
Der anonyme Typ zu IDictionary<string,object> wäre IMHO eine bessere Wahl. Und es wird an vielen Stellen in asp.net MVC verwendet. Ein Map-Typ mit einfacher Init-Syntax wäre sehr schön (ähnliche Syntax als anonyme Typen?) edit: habe die Antwort von Marc Gravell nicht gesehen...
1 Stimmen
Wer ist hier Mitwirkende und Beitragszahler? :)
0 Stimmen
Dies wird allein durch die Tatsache disqualifiziert, dass ein gültiger html-Attributname nicht unbedingt ein gültiger c#-Bezeichnername ist, denken Sie an reservierte Schlüsselwörter.