Warum verwenden die Anweisung "using" und die Anweisung "using" dasselbe Schlüsselwort in C #?


10

Die usingRichtlinie ermöglicht uns den Zugriff auf Typen ohne Verwendung ihrer vollqualifizierten Namen:

using MyNamespace.Foo.Bar;

Die usingAnweisung fungiert als syntaktischer Zucker für try/ finallyBlöcke, die sicherstellen, dass Objekte ordnungsgemäß entsorgt werden:

using(var x = new MyDisposableClass()) { ... }

Diese beiden Situationen scheinen nichts miteinander zu tun zu haben. Warum verwenden sie dasselbe Schlüsselwort?

Ich bezweifle, dass irgendjemand jemals die beiden Fälle verwechseln würde, aber es scheint seltsam, kein neues Wort für eine neue Funktionalität zu erstellen.


Nebenbei habe ich auch über die doppelte Verwendung von classin C ++ gelesen (eine zum Deklarieren von Klassen, eine zum Definieren von Vorlagenparametern), aber der zweite Fall hat schließlich ein eigenes Schlüsselwort erhalten typename, was für mich sinnvoller ist.

Antworten:


7

Sie haben Recht damit, dass beide Verwendungen von usingnicht miteinander zusammenhängen.

In usingbeiden Fällen gibt es jedoch mehrere gute Gründe .

  • Die usingAnweisung wurde für .NET 1.0 erstellt und ist semantisch sinnvoll ("Ich verwende diesen Namespace im folgenden Code").
  • In beiden Fällen usingmacht semantisch Sinn. Im Klartext sind Sie usingein Namespace oder usingdas deklarierte Einwegobjekt.
  • Durch Überladen des usingSchlüsselworts mussten die Sprachdesigner kein weiteres reserviertes Wort in der Sprache erstellen. Dies hilft, die Sprache sauberer zu halten.

Es ist möglich, dass sich die Sprachdesigner angesichts ihrer Zeit importfür Namespace-Deklarationen entschieden haben, um die beiden Auswahlmöglichkeiten zu unterscheiden ( usingein Einwegobjekt wurde in einer späteren Version von .NET geliefert). Wir werden es nie erfahren und es ist wirklich nicht wichtig, da es extrem klar ist, welche der beiden Bedeutungen Sie aufgrund des Kontexts verwenden.

Nachdem Sie das alles gesagt haben, verunreinigen Sie Ihren Code nicht using MyNamespace.DisposableObject = DisposableObject;überall mit Namespace-Aliasnamen.


Vielen Dank. Können Sie erweitern, was Sie unter "hilft, die Sprache sauberer zu halten" verstehen? In meinen Augen macht das Überladen des Schlüsselworts die Sprache weniger sauber. Ich würde denken, es wäre sauberer, ein neues Schlüsselwort zu erstellen und separate Schlüsselwörter für separate Funktionen zu verwenden.
Eigenchris

5
Schlüsselwörter können nicht als Bezeichner verwendet werden. Durch die Einführung eines neuen Schlüsselworts wird jedes Programm unterbrochen, das dieses Schlüsselwort als Kennung verwendet. Sie können ein Schlüsselwort nur abwärtskompatibel einführen, wenn Sie Zugriff auf alle Quellcodezeilen haben, die jemals in der gesamten Geschichte von C♯ geschrieben wurden, einschließlich proprietären Quellcodes, geheimen Quellcodes, militärischen Quellcodes usw.
Jörg W Mittag

@ JörgWMittag, nicht ganz richtig. C # enthält eine ganze Reihe von Kontextschlüsselwörtern, die so hinzugefügt wurden, dass vorhandene Bezeichner mit diesem Namen nicht mit dem Code in Konflikt stehen. varDies ist das klassische Beispiel, bei dem ein In-Scope-Typ mit dem Namen varVorrang vor dem Schlüsselwort hat.
David Arno

@ JörgWMittag Oder die Alternative besteht darin, die Sprachversion des Compilers auswählbar zu machen (wie g++ --std=c++11oder Quelldateien die Angabe eines Dialekts zu ermöglichen (wie in Haskell (?), Racket, Perl, sogar Python). Eine Sprache kann auch in entworfen werden Eine Möglichkeit, bei der Schlüsselwörter niemals syntaktisch mit möglichen Bezeichnern in Konflikt geraten, ohne einige Bezeichner zu reservieren (obwohl dies für Ihre normale Sprachimplementierung mit einem LALR-Parser mit einem Lexer im
Vordergrund

1
@eigenchris Sie können Keword immer mit einem @ voranstellen, um es als Kennung zu verwenden wie@using
Bill Tür

4

Sprachdesigner versuchen im Allgemeinen, die Anzahl der Schlüsselwörter zu begrenzen. Wenn ein Schlüsselwort reserviert ist, kann es nicht als Kennung im Benutzercode verwendet werden. Dies ist ärgerlich, wenn es nur das Wort ist, das Sie benötigen. Dies ist auch ein Hindernis beim Portieren von Code aus anderen Sprachen - und Microsoft wollte, dass Benutzer Code von Java nach C # portieren. C # hat mehr Schlüsselwörter als Java, aber jedes neue Schlüsselwort würde es schwieriger machen. Darüber hinaus sind die .net-Sprachen so konzipiert, dass sie mit APIs interagieren, die in verschiedenen Sprachen geschrieben sind und möglicherweise nicht dieselben Schlüsselwörter enthalten. Dies führt zu Belästigungen, wenn ein öffentliches Mitglied auch ein Schlüsselwort ist.

Die beiden Verwendungen von usingsind eindeutig, da sie an Positionen in der Syntax erscheinen. Eine "Verwendung" ist in beiden Fällen ein geeigneter Begriff. Es ist also sinnvoll, dasselbe Schlüsselwort wiederzuverwenden. Sie werden andere Beispiele für die Wiederverwendung von Schlüsselwörtern bemerken, zum Beispiel:

  • new in allgemeinen Einschränkungen
  • inin foreachund in variantenartigen Parametern
  • defaultals Klausel in switchund als Operator ( default(T)).
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.