Nicht genau, aber Sie können einen Aktionsdelegaten verwenden, um etwas zu schließen:
%Vor%Und benutze es so:
%Vor%Beachten Sie, dass es einige Einschränkungen gibt. Sie können beispielsweise keine sinnvolle Rückgabeanweisung in den neuen geschweiften Klammern haben. Dank Closures können Sie zumindest noch lokale Variablen verwenden.
Nein, es gibt keine Möglichkeit, eigene Keywords zu definieren. Diese sind durch die Sprache definiert und in den Compiler integriert, um sie in IL zu interpretieren. Wir haben dieses Abstraktionsniveau noch nicht erreicht!
Schau dir an, wie aufgeregt jeder wird, wenn Dinge wie %code% und %code% eingeführt werden.
In diesem Sinne bearbeiten Sie Ihren Post, um anzuzeigen, wie die Syntax für das Beispiel %code% aussehen soll. Es wäre interessant zu sehen.
Sie können solche Konstrukte nicht direkt definieren, aber es gibt Möglichkeiten, ähnliche prägnante Muster zu erstellen:
Sie können Klassen definieren, die IDisposable implementieren, um diese Art von Blockbenutzungssemantik einzukapseln. Wenn Sie zum Beispiel eine Klasse haben, die das Erfassen einer ReaderWriterLockSlim-Sperre (acquire on construct, release on Dispose) kapselt, können Sie eine Eigenschaft in Ihrer Klasse erstellen, die die Instanz erstellt, was zu einer Syntax wie dieser führt:
%Vor%Dies ist wohl ein Missbrauch von IDisposable, aber dieses Muster wurde definitiv im Produktionscode verwendet.
Sie können die aspektorientierte Programmierung verwenden (mit Werkzeugen wie PostSharp ), um einen Methodenrumpf mit wiederverwendbarer Eingabe- / Beendigungslogik zu umbrechen. Dies wird oft verwendet, um Protokollierung oder andere bereichsübergreifende Probleme, die Sie auf Ihren Code anwenden möchten, zu injizieren, ohne ihn zu verstopfen.
Sie können Funktionen schreiben, die Delegaten als Parameter annehmen, die dann die delegierte Logik in einer ähnlichen Struktur einschließen. Zum Beispiel für den ReaderWriterLockSlim können Sie eine Methode wie folgt erstellen:
%Vor%Dies kann sehr mächtig sein, da die Unterstützung für Lambda-Ausdrücke mit Closures eine beliebig komplexe Logik ermöglicht, ohne manuell Wrapper-Funktionen zu erstellen und erforderliche Parameter in Feldern zu übergeben.
Es gibt keine native Funktion, die das tut, was Sie wollen. Sie können die %code% -Anweisung jedoch einfach verwenden, indem Sie %code% implementieren.
%Vor%Ich verstehe, dass es in der nächsten Version von Visual Studio einen großen Schub in Richtung dieser Art von Flexibilität geben wird.
On .net rockt Anders Hejlsberg sagte kürzlich, dass eines der Hauptthemen der nächsten Visual Studio-Veröffentlichung (2012 ?) wird "Compiler as a Service" sein und seither haben einige andere Leute angedeutet, dass dies eine Menge Türen für die Spracherweiterung und engere Integration mit DSLs (Domain-Specific Languages) eröffnen wird.
Im Moment können Sie mit DSLs ziemlich schöne Sachen machen, einschließlich der Erstellung Ihrer eigenen Keywords, obwohl es meiner Meinung nach immer noch etwas zu peinlich ist. Wenn Sie interessiert sind, lesen Sie diesen Artikel über das Entwerfen von DSLs in Boo .
Es könnte dich ein wenig umhauen.
Persönlich missbrauche ich so viel 1 %code% , dass ich dafür eine %code% Klasse habe:
%Vor%Damit kann ich ganz einfach eine %code% von einer beliebigen Methode zurückgeben:
%Vor%Sie können es auch einfach inline machen:
%Vor%Oder mit dem Zusatz von %code% Aktion:
%Vor%aber das ist nur hässlich.
1 : Technisch gesehen ist es eher ein Missbrauch von %code% als von %code% . Schließlich möchte ich tatsächlich ein %code% - was %code% mir gibt. Es stellt sich jedoch heraus, dass ich %code% implementieren muss, um %code% zu erhalten. Wie auch immer, ich bin damit einverstanden. Die Semantik ist mir ziemlich klar - wenn du etwas startest, erwarte ich, dass du auch das etwas beendest. Wenn Sie beispielsweise eine Meldung "Beginning Task" in die Protokolldatei schreiben, erwarte ich auch eine Protokollmeldung "Ending Task". Ich habe nur eine umfassendere Definition von "Ressourcen freisetzen" als die meisten Entwickler.
Die magische Klasse:
%Vor%Verwendung:
%Vor%Wie andere bereits gesagt haben, kann %code% missbraucht werden, um den Begriff eines Bereichs in deinem Code. Es kann sogar die Verschachtelung unterstützen.
Ich denke, Sie würden nach Präprozessordirektiven suchen, aber C # unterstützt diese nicht . Am nächsten könnten Visual Studio-Snippets sein, die Sie verwenden können < a href="https://stackoverflow.com/questions/33994/what-code-snippet-editor-do-you-use"> design yourself .
Leider nicht. Um dies zu unterstützen, müsste der c # -Compiler für den Endbenutzer erweiterbarer sein. Dies würde beinhalten, dass Sie in der Lage sind, Ihre eigenen Schlüsselwörter zu definieren und Makrounterstützung usw. zu haben ...
Was Sie jedoch tun können, ist Methoden zu erstellen, die mindestens ein ähnliches Gefühl haben: (Beispiel für die erneute Implementierung des Schlüsselwortes lock in user code)
%Vor%mit dann wäre so:
%Vor%ODER
%Vor%ODER
%Vor%Nicht genau, aber Sie können einen Aktionsdelegaten verwenden, um etwas zu schließen:
%Vor%Und benutze es so:
%Vor%Beachten Sie, dass es einige Einschränkungen gibt. Sie können beispielsweise keine sinnvolle Rückgabeanweisung in den neuen geschweiften Klammern haben. Dank Closures können Sie zumindest noch lokale Variablen verwenden.
Leider nicht. Um dies zu unterstützen, müsste der c # -Compiler für den Endbenutzer erweiterbarer sein. Dies würde beinhalten, dass Sie in der Lage sind, Ihre eigenen Schlüsselwörter zu definieren und Makrounterstützung usw. zu haben ...
Was Sie jedoch tun können, ist Methoden zu erstellen, die mindestens ein ähnliches Gefühl haben: (Beispiel für die erneute Implementierung des Schlüsselwortes lock in user code)
%Vor%mit dann wäre so:
%Vor%ODER
%Vor%ODER
%Vor%Sie können solche Konstrukte nicht direkt definieren, aber es gibt Möglichkeiten, ähnliche prägnante Muster zu erstellen:
Sie können Klassen definieren, die IDisposable implementieren, um diese Art von Blockbenutzungssemantik einzukapseln. Wenn Sie zum Beispiel eine Klasse haben, die das Erfassen einer ReaderWriterLockSlim-Sperre (acquire on construct, release on Dispose) kapselt, können Sie eine Eigenschaft in Ihrer Klasse erstellen, die die Instanz erstellt, was zu einer Syntax wie dieser führt:
%Vor%Dies ist wohl ein Missbrauch von IDisposable, aber dieses Muster wurde definitiv im Produktionscode verwendet.
Sie können die aspektorientierte Programmierung verwenden (mit Werkzeugen wie PostSharp ), um einen Methodenrumpf mit wiederverwendbarer Eingabe- / Beendigungslogik zu umbrechen. Dies wird oft verwendet, um Protokollierung oder andere bereichsübergreifende Probleme, die Sie auf Ihren Code anwenden möchten, zu injizieren, ohne ihn zu verstopfen.
Sie können Funktionen schreiben, die Delegaten als Parameter annehmen, die dann die delegierte Logik in einer ähnlichen Struktur einschließen. Zum Beispiel für den ReaderWriterLockSlim können Sie eine Methode wie folgt erstellen:
%Vor%Dies kann sehr mächtig sein, da die Unterstützung für Lambda-Ausdrücke mit Closures eine beliebig komplexe Logik ermöglicht, ohne manuell Wrapper-Funktionen zu erstellen und erforderliche Parameter in Feldern zu übergeben.
Nein, es gibt keine Möglichkeit, eigene Keywords zu definieren. Diese sind durch die Sprache definiert und in den Compiler integriert, um sie in IL zu interpretieren. Wir haben dieses Abstraktionsniveau noch nicht erreicht!
Schau dir an, wie aufgeregt jeder wird, wenn Dinge wie var
und dynamic
eingeführt werden.
In diesem Sinne bearbeiten Sie Ihren Post, um anzuzeigen, wie die Syntax für das Beispiel ReaderWriterLockSlim
aussehen soll. Es wäre interessant zu sehen.
Es gibt keine native Funktion, die das tut, was Sie wollen. Sie können die using
-Anweisung jedoch einfach verwenden, indem Sie IDisposable
implementieren.
Persönlich missbrauche ich so viel 1 using
, dass ich dafür eine DisposeHelper
Klasse habe:
Damit kann ich ganz einfach eine IDisposable
von einer beliebigen Methode zurückgeben:
Sie können es auch einfach inline machen:
%Vor% Oder mit dem Zusatz von onInit
Aktion:
aber das ist nur hässlich.
1 : Technisch gesehen ist es eher ein Missbrauch von IDisposable
als von using
. Schließlich möchte ich tatsächlich ein try/finally
- was using
mir gibt. Es stellt sich jedoch heraus, dass ich IDisposable
implementieren muss, um try/finally
zu erhalten.
Wie auch immer, ich bin damit einverstanden. Die Semantik ist mir ziemlich klar - wenn du etwas startest, erwarte ich, dass du auch das etwas beendest. Wenn Sie beispielsweise eine Meldung "Beginning Task" in die Protokolldatei schreiben, erwarte ich auch eine Protokollmeldung "Ending Task". Ich habe nur eine umfassendere Definition von "Ressourcen freisetzen" als die meisten Entwickler.
Ich verstehe, dass es in der nächsten Version von Visual Studio einen großen Schub in Richtung dieser Art von Flexibilität geben wird.
On .net rockt Anders Hejlsberg sagte kürzlich, dass eines der Hauptthemen der nächsten Visual Studio-Veröffentlichung (2012 ?) wird "Compiler as a Service" sein und seither haben einige andere Leute angedeutet, dass dies eine Menge Türen für die Spracherweiterung und engere Integration mit DSLs (Domain-Specific Languages) eröffnen wird.
Im Moment können Sie mit DSLs ziemlich schöne Sachen machen, einschließlich der Erstellung Ihrer eigenen Keywords, obwohl es meiner Meinung nach immer noch etwas zu peinlich ist. Wenn Sie interessiert sind, lesen Sie diesen Artikel über das Entwerfen von DSLs in Boo .
Es könnte dich ein wenig umhauen.
Ich denke, Sie würden nach Präprozessordirektiven suchen, aber C # unterstützt diese nicht . Am nächsten könnten Visual Studio-Snippets sein, die Sie verwenden können < a href="https://stackoverflow.com/questions/33994/what-code-snippet-editor-do-you-use"> design yourself .
Wie andere bereits gesagt haben, kann IDisposable
missbraucht werden, um den Begriff eines Bereichs in deinem Code. Es kann sogar die Verschachtelung unterstützen.
Tags und Links .net c# readability syntactic-sugar