「using」ディレクティブと「using」ステートメントがC#で同じキーワードを使用するのはなぜですか?


10

usingディレクティブは、彼らの完全修飾名を使用せずに、私たちのタイプへのアクセスを提供します:

using MyNamespace.Foo.Bar;

using声明はのためのシンタックスシュガーとして機能try/ finallyオブジェクトは適切に処分されていることを確認したブロック:

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

これら2つの状況は、互いに何の関係もないようです。同じキーワードを使用するのはなぜですか?

2つのケースが混同されることはないでしょうが、新しい機能を表す新しい単語を作成しないのは奇妙に思えます。


余談ですがclass、C ++ での二重使用(1つはクラスの宣言、もう1つはテンプレートパラメータの定義)についても読みましたが、2番目のケースは最終的に独自のキーワードを取得typenameしました。

回答:


7

の両方の使用usingが無関係であることであなたは正しいです。

ただし、usingどちらの場合にも、使用する理由がいくつかあります。

  • using声明は、.NET 1.0用に作成され、(「私は、次のコードでこの名前空間を使用しています」)セマンティック理にかないました
  • どちらの場合も、using意味的に意味があります。プレーンな英語では、あなたはusing名前空間であるかusing、宣言された使い捨てオブジェクトです。
  • usingキーワードをオーバーロードすることにより、言語デザイナーはその言語で別の予約語を作成する必要がなくなりました。これにより、言語をよりクリーンに保つことができます。

時間をもう一度考えると、言語設計者はimport2つの選択肢を明確にするために名前空間宣言に使用することを選択した可能性があります(using使い捨てオブジェクトは.NETの新しいバージョンに含まれていました)。コンテキストによって2つの意味のどちらを使用しているかが非常に明確であるため、私たちは決して知ることはなく、それは本当に重要ではありません。

以上のことをすべて説明したので、using MyNamespace.DisposableObject = DisposableObject;どこにでもネームスペースエイリアスでコードを散らかしてはいけません。


ありがとう。「言語をよりクリーンに保つのに役立つ」という意味を拡張できますか?私の考えでは、キーワードをオーバーロードすると、言語が不明瞭になります。新しいキーワードを作成し、機能ごとに個別のキーワードを使用するほうがクリーンだと思います。
eigenchris

5
キーワードは識別子として使用できません。新しいキーワードを導入すると、そのキーワードを識別子として使用するすべてのプログラムが機能しなくなります。独自のソースコード、秘密のソースコード、軍事用ソースコードなど、C♯の履歴全体でこれまでに記述されたソースコードのすべての行にアクセスできる場合にのみ、下位互換性のある方法でキーワードを導入できます。
イェルクWミッターク

@JörgWMittag、完全には正しくありません。C#には、その名前の既存の識別子がコードと競合しないように追加された、一連のコンテキストキーワードがあります。varというスコープ内のタイプvarがキーワードよりも優先される古典的な例です。
David Arno

@JörgWMittagまたは、代替手段は、コンパイラの言語バージョンを選択可能にすることです(g++ --std=c++11または、ソースファイルで方言を指定できるようにします(Haskell(?)、Racket、Perl、さらにはPythonなど)。言語は、一部の識別子を予約せずに、キーワードが可能な識別子と構文的に衝突しないようにする方法(前にレクサーを備えたLALRパーサーを使用する、一般的な言語の実装では難しい場合があります)
amon

1
あなたはいつもpreceden keword @と同様の識別子として使用することができます@eigenchris@using
ビル・TUR

4

言語デザイナーは一般にキーワードの数を制限しようとします。キーワードが予約されている場合、ユーザーコード内で識別子として使用することはできません。これは、必要な単語だけである場合は不快です。また、コードを他の言語から移植する際の障害にもなり、MicrosoftはJavaからC#にコードを移植することを望んでいました。C#にはJavaよりも多くのキーワードがありますが、新しいキーワードごとに難しくなります。さらに、.net言語は、同じキーワードを持たない可能性があるさまざまな言語で記述されたAPIと対話するように設計されているため、パブリックメンバーもキーワードである場合に不快感が生じます。

の2つの使用法usingは明確です。構文内の位置にあるため、「使用」はどちらの場合でも適切な用語です。したがって、同じキーワードを再利用することは理にかなっています。キーワードの再利用の他の例を次に示します。

  • new 一般的な制約で
  • inforeachバリアント型パラメーター内および内
  • default内の句として、switchおよび演算子(default(T))として。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.