Dlaczego dyrektywa „using” i „using” używają tego samego słowa kluczowego w języku C #?


10

usingDyrektywa daje nam dostęp do typów bez użycia ich w pełni kwalifikowane nazwy:

using MyNamespace.Foo.Bar;

usingOświadczenie działa jak cukier składniowej dla try/ finallybloków, które zapewniają, że obiekty są usuwane odpowiednio:

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

Te dwie sytuacje wydają się nie mieć ze sobą nic wspólnego. Dlaczego używają tego samego słowa kluczowego?

Wątpię, czy ktokolwiek kiedykolwiek pomyliłby te dwa przypadki, ale wydaje się dziwne, że nie tworzy się nowego słowa dla nowej funkcji.


Nawiasem mówiąc, przeczytałem również o podwójnym użyciu classw C ++ (jednym do deklarowania klas, drugim do definiowania parametrów szablonu), ale drugi przypadek w końcu otrzymał własne słowo kluczowe typename, co ma dla mnie większy sens.

Odpowiedzi:


7

Masz rację, ponieważ oba zastosowania usingsą ze sobą niezwiązane.

W usingobu przypadkach istnieje jednak kilka dobrych powodów .

  • usingOświadczenie zostało stworzone dla .NET 1.0 i sprawia, że sens semantyczny ( „Używam tego obszaru nazw w poniższym kodzie”)
  • W obu przypadkach usingma to sens semantyczny. Mówiąc wprost , jesteś usingprzestrzenią nazw lub usingzadeklarowanym obiektem jednorazowego użytku.
  • Przeciążając usingsłowo kluczowe, projektanci języków nie musieli tworzyć kolejnych słów zastrzeżonych w języku. Pomaga to utrzymać czystość języka.

Możliwe, że zważywszy na swój czas, projektanci języków mogli użyć importdeklaracji przestrzeni nazw w celu ujednolicenia dwóch opcji ( usingobiekt jednorazowy pojawił się w późniejszej wersji platformy .NET). Nigdy się nie dowiemy i to naprawdę nie jest ważne, ponieważ jest bardzo jasne, które z dwóch znaczeń używasz ze względu na kontekst.

Powiedziawszy to wszystko, nie idź i nie zaśmiecaj swojego kodu using MyNamespace.DisposableObject = DisposableObject;wszędzie aliasami przestrzeni nazw.


Dzięki. Czy możesz rozwinąć pojęcie „pomaga utrzymać język w czystości”? Według mnie przeciążenie słowa kluczowego powoduje, że język jest mniej czysty. Wydaje mi się, że lepiej byłoby utworzyć nowe słowo kluczowe i użyć osobnych słów kluczowych dla oddzielnych funkcji.
eigenchris,

5
Słowa kluczowe nie mogą być używane jako identyfikatory. Wprowadzenie nowego słowa kluczowego psuje każdy program, który używa tego słowa kluczowego jako identyfikatora. Możesz wprowadzić słowo kluczowe w sposób kompatybilny wstecz, tylko jeśli masz dostęp do każdego wiersza kodu źródłowego, jaki kiedykolwiek napisano w całej historii C♯, w tym zastrzeżonego kodu źródłowego, tajnego kodu źródłowego, wojskowego kodu źródłowego i tak dalej.
Jörg W Mittag,

@ JörgWMittag, Niezupełnie prawda. C # ma całą masę kontekstowych słów kluczowych, które zostały dodane w taki sposób, że istniejące identyfikatory o tej nazwie nie kolidowały z kodem. varbędący klasycznym przykładem, w którym nazwany typ w zakresie varma pierwszeństwo przed słowem kluczowym.
David Arno,

@ JörgWMittag Albo alternatywą jest umożliwienie wyboru wersji językowej kompilatora (np. g++ --std=c++11Lub zezwolenie plikom źródłowym na określenie dialektu (jak w Haskell (?), Racket, Perl, a nawet Python). Język można również zaprojektować w sposób, w jaki słowa kluczowe nigdy nie kolidują składniowo z możliwymi identyfikatorami, bez rezerwowania niektórych identyfikatorów (chociaż może to być trudne dla implementacji języka wybiegającego z młyna za pomocą parsera LALR z leksem przed nim)
amon

1
@eigenchris zawsze możesz poprzedzić słowo kluczowe @, aby użyć go jako identyfikatora, takiego jak@using
Bill Tür

4

Projektanci języków zazwyczaj starają się ograniczyć liczbę słów kluczowych. Kiedy słowo kluczowe jest zarezerwowane, nie może być użyte jako identyfikator w kodzie użytkownika, co jest denerwujące, jeśli jest to tylko potrzebne słowo. Jest to również przeszkodą przy przenoszeniu kodu z innych języków - a Microsoft chciał, aby ludzie przenosili kod z Java do C #. C # ma więcej słów kluczowych niż Java, ale każde nowe słowo kluczowe utrudnia. Ponadto języki .net zostały zaprojektowane do interakcji z interfejsami API napisanymi w różnych językach, które mogą nie mieć tych samych słów kluczowych, co prowadzi do irytacji, jeśli członek publiczny jest również słowem kluczowym.

Oba zastosowania usingsą jednoznaczne, ponieważ pojawiają się w pozycjach w składni, „użycie” jest odpowiednim terminem w obu przypadkach. Dlatego warto ponownie użyć tego samego słowa kluczowego. Zanotujesz inne przykłady ponownego użycia słów kluczowych, na przykład:

  • new w ogólnych ograniczeniach
  • inw foreachparametrach typu wariantowego
  • defaultjako klauzula w switchi jako operator ( default(T)).
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.