Wird ein C # -Schlüsselwort verwendet?

7

Wenn ein Objekt IDisposable in C # realisiert, kann man

schreiben %Vor%

Ich habe mich immer gewundert, warum das using wie ein C # -Schlüsselwort aussieht, aber eine im .Net-Framework definierte Schnittstelle erfordert. Ist using ein Schlüsselwort (in diesem Kontext ist es offensichtlich für die Definition Ihrer Bibliothek Importe), oder hat Microsoft es in Visual Studio / .Net Framework überladen? Ich hätte nicht erwartet, dass ein C # -Schlüsselwort von einer Bibliothek abhängt.

    
RichK 03.10.2010, 10:29
quelle

7 Antworten

6

Ja, es ist ein Schlüsselwort. Die Sprache C # basiert auf dem Framework zur Implementierung vieler Schlüsselwörter.

Andere Schlüsselwörter, die sich auf das Framework stützen, sind z. B. foreach (verwendet IEnumerable ) und die LINQ-Syntax (bei Verwendung mit LINQ to Objects ist die System.Linq -Bibliothek erforderlich).

Auch Schlüsselwörter wie int und string hängen von den Typen System.Int32 und System.String im Framework ab.

    
Guffa 03.10.2010, 10:35
quelle
8

Es handelt sich um ein Schlüsselwortkonstrukt, das IDisposable erfordert, da es auf die Dispose-Methode des Objekts wirkt. Es ist nicht zu weit hergeholt, dass ein Keyword einen Typ verwendet. Wenn es ein Schlüsselwort ist und eine Bedingung (IE: Boolean) erforderlich ist, geben Sie

ein     
Tony Abrams 03.10.2010 10:34
quelle
7

Laut Microsoft ist es ein Schlüsselwort.

    
Brian Agnew 03.10.2010 10:31
quelle
4

C # ist fairy eng mit der CLI verbunden, und die Sprachenspezifikation verwendet eine minimale Anzahl von Laufzeitfunktionen. IDisposable für "using" ist eigentlich ungewöhnlich starr, da es in den meisten Fällen (zB "foreach", LINQ, etc.) Unterstützung mit und ohne die spezifische Laufzeit-Implementierung gibt.

Da das IDisposable / using-Konstrukt jedoch der Schlüssel zu .NET ist, bezweifle ich, dass Sie auch nur eine minimale (aber legale) CLI erstellen könnten. Es ist also kein Problem, dies in der Sprachspezifikation zu erwähnen.

Andere Dinge, die an bestimmte Typen gebunden sind:

  • String-Verkettung (+ vs String.Concat)
  • Erweiterungsmethoden
  • generic new ()
  • [Serializable] (entspricht einem IL-Flag, kein Attribut)
  • foreach (kann aber ohne die Schnittstellen verwendet werden)
  • Core-Basistypen (Enum-Array-Objekt ValueType Delegate)
  • Ausdruck-Baum-Compiler (aber nicht in der Spezifikation beschrieben)

usw.

    
Marc Gravell 03.10.2010 11:00
quelle
2

Ja, es besteht eine eindeutige Verbindung zwischen der Sprache und den Unterstützungsassemblys im .NET-Framework. Bei weitem die wichtigste ist mscorlib.dll, die Heimat für die System.IDisposable-Schnittstelle Deklaration. Es ist so wichtig, dass es nicht einmal im Knoten Verweise des C # -Projekts aufgeführt ist. Der C # -Compiler geht davon aus, dass er immer benötigt wird und findet ihn selbst, sofern Sie nicht die spezielle / nostdlib-Kompilierungsoption verwenden.

Andere Beispiele für syntaktische Elemente, die es erfordern:

  • array [], erfordert System.Array
  • [Attribute], erfordert System.Attribute
  • catch, erfordert System.Exception
  • Delegat, erfordert System.MulticastDelegate
  • type ?, erfordert System.Nullable & lt; & gt;
  • params erfordert System.ParamArrayAttribute
  • typeof, erfordert System.Type

Es gibt eine Kopplung zwischen allen grundlegenden Typen und ihrer entsprechenden Deklaration in mscorlib (wie Int32, String, Object, ValueType usw.).

Spätere Beispiele sind die Linq-Query-Verstehenssyntax, die System.Core.dll und das dynamische -Schlüsselwort erfordert und Microsoft.CSharp.dll erfordert. Diese Beispiele sind keineswegs erschöpfend.

Das ist sonst ganz normal, sogar C-Compiler setzen voraus, dass eine Laufzeitbibliothek mit Primitiven wie memset () und ldiv () zur Verfügung steht.

    
Hans Passant 03.10.2010 11:27
quelle
1

Ich denke, mit ein Schlüsselwort, das im Wesentlichen den Code machen

%Vor%

in

%Vor%

Das wichtige Bit mit, warum IDisposable verwendet wird, liegt daran, dass c # stark typisiert ist, hinter den Kulissen seinen Aufruf von Dispose () und der Umsetzung IDisposable den Compiler sagt, es kann.

Ähnlich wie foreach mit IEnumerable und der IEnumerator (Aufruf GetEnumerator (), Strom (), Movenext (), obwohl ich denke, es ist nicht nur diese Sammlung Klassen mit Arrays macht).

    
Roman A. Taycher 03.10.2010 10:34
quelle
1

using ist ein C # -Schlüsselwort, das als syntaktischer Zucker für den Umgang mit IDisposible Objekten dient. Gemäß MSDN

  

using block Definiert einen Bereich, außerhalb dessen ein Objekt oder Objekte entfernt werden.

Mit der using-Anweisung kann der Programmierer angeben, wann Objekte, die Ressourcen verwenden, diese freigeben sollen. Das der using-Anweisung bereitgestellte Objekt muss die IDisposable-Schnittstelle implementieren. Diese Schnittstelle stellt die Dispose-Methode bereit, die die Ressourcen des Objekts freigeben sollte.

Überraschenderweise selbst MSDN nicht klar, wie dies unter der Haube passiert. Es besagt nur, dass das Objekt die IDisposable-Schnittstelle implementieren muss, die die Dispose-Methode für das Objekt bereitstellt, das die Schnittstelle implementiert. Um also das Objekt zu entfernen, muss es die Dispose-Methode für das Objekt aufrufen, das die von dem Objekt verwendeten Ressourcen bereinigt und freigibt.

Sehen Sie sich dieses Beispiel an.

%Vor%

Der Compiler konvertiert den Code so, dass er so aussieht.

%Vor%

Um zu verstehen, wie genau der using-Block unter der Haube funktioniert, empfehle ich Ihnen, dies zu lesen blog-post .

Ссылка

    
this. __curious_geek 03.10.2010 11:36
quelle

Tags und Links