Existiert diese Funktion? Eigene geschweifte Klammern in C # definieren

8
___ answer2883093 ___

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.

    
___ answer2883013 ___

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.

    
___ answer2883126 ___

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.

    
___ answer2883161 ___

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%     
___ answer2883117 ___

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.

    
___ answer2883491 ___

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.

    
___ answer2932023 ___

Die magische Klasse:

%Vor%

Verwendung:

%Vor%     
___ answer2883663 ___

Wie andere bereits gesagt haben, kann %code% missbraucht werden, um den Begriff eines Bereichs in deinem Code. Es kann sogar die Verschachtelung unterstützen.

    
___ answer2883053 ___

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 .

    
___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die für die Erstellung einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ tag123readability ___ Lesbarkeit ist ein subjektiver Parameter, der verwendet wird, um einen Aspekt der Codequalität zu messen. Es basiert auf der Annahme, dass Code sowohl in seiner Form als auch in seiner Bedeutung für den Menschen leicht verständlich sein sollte. ___ answer2883087 ___

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%     
___ tag123net ___ Das .NET-Framework ist ein Software-Framework, das hauptsächlich für das Microsoft Windows-Betriebssystem entwickelt wurde. Es enthält eine Implementierung der Basisklassenbibliothek, Common Language Runtime (allgemein als CLR bezeichnet), Common Type System (allgemein als CTS bezeichnet) und Dynamic Language Runtime. Es unterstützt viele Programmiersprachen, einschließlich C #, VB.NET, F # und C ++ / CLI. NICHT für Fragen zu .NET Core verwenden. ___ tag123syntacticsugar ___ Syntactic Sugar ist ein Informatikbegriff, der sich auf Syntax innerhalb einer Programmiersprache bezieht, die das Lesen oder das Ausdrücken erleichtern soll. ___ qstnhdr ___ Existiert diese Funktion? Eigene geschweifte Klammern in C # definieren ___
Carlos 21.05.2010, 14:34
quelle

10 Antworten

19

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.

    
Joel Coehoorn 21.05.2010, 14:48
quelle
5

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%     
saret 21.05.2010 14:48
quelle
3

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.

    
Dan Bryant 21.05.2010 14:53
quelle
1

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.

    
David Neale 21.05.2010 14:37
quelle
1

Es gibt keine native Funktion, die das tut, was Sie wollen. Sie können die using -Anweisung jedoch einfach verwenden, indem Sie IDisposable implementieren.

%Vor%     
Brian Gideon 21.05.2010 14:57
quelle
1

Persönlich missbrauche ich so viel 1 using , dass ich dafür eine DisposeHelper Klasse habe:

%Vor%

Damit kann ich ganz einfach eine IDisposable von einer beliebigen Methode zurückgeben:

%Vor%

Sie können es auch einfach inline machen:

%Vor%

Oder mit dem Zusatz von onInit Aktion:

%Vor%

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.

    
Mark Brackett 21.05.2010 15:40
quelle
1

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.

    
Brian MacKay 21.05.2010 14:52
quelle
1

Die magische Klasse:

%Vor%

Verwendung:

%Vor%     
Dykam 28.05.2010 19:49
quelle
0

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 .

    
ladenedge 21.05.2010 14:44
quelle
0

Wie andere bereits gesagt haben, kann IDisposable missbraucht werden, um den Begriff eines Bereichs in deinem Code. Es kann sogar die Verschachtelung unterstützen.

    
Jordão 21.05.2010 16:08
quelle