2012-01-26 11 views
14

この質問には既に質問があります。 私はC#を勉強し始め、C#がネストされた名前空間を自動的にインポートしないことに気付きました。 私は理解していない:C#でネストされた名前空間を自動的にインポートする

using System; 

自動的にSystem名前空間の右側に含まれるすべてのクラスをインポートする必要がありますか? のでusing Windows.Formでも働いていた場合、私は理解するであろう、私は

using System.Windows.Form; 

を書くための必要はないはずです。しかし、コンパイラはそれを解決できませんでした!その前にusing System;のポイントは何ですか? なぜusing System;は、と同様に自動的にインポートされませんSystem.Windows.Forms - 申し訳ありませんが、単語のインポートが間違っている場合は..ここではグローバル名前空間に移動するのが適切な用語です。

+3

C#はそのようには動作しませんが、Javaではワイルドカードを使用して名前空間をインポートできますが、何らかの理由でC#デザイナーはそれを行わないことを選択しました。なぜ議論するのが建設的なのかは分かりません。 – CodingGorilla

+2

Closters - これは正当な質問です。 – Oded

+1

@コーディングゴリラ:「なぜ」は議論ではない。明確な理由がある(すなわち、Odedが述べたように、C#名前空間は物理的なグループではなく論理的である)。 – Brian

答えて

18

C#はJavaではありません。

using directiveが使用されるため、タイプの完全修飾名を入力する必要はありません。また、型名の曖昧さを軽減するためにも役立ちます(エイリアスなど)。

たとえば、Consoleの場合は、System.Consoleと入力する必要はありません。

名前空間とアセンブリの違いを理解することが重要です。名前空間は論理型タイプのグループです。アセンブリはフィジカルタイプのグループです。名前空間はアセンブリにまたがることができます。あなた参照アセンブリ(これはより多くのJavaでパッケージをインポートするようなものです)、あなたはその中のパブリック型のすべてへのアクセスを得る

。タイプを使用するには、そのタイプを一意に識別する必要があります。これは名前空間を通じて行われます。using指示は単に型の完全修飾名を入力する必要がないことを意味します。

+0

したがって、usingは現在のネームスペースのすべてのクラスをインポートしますが、ネストされたネームスペースにヒットした場合は無視します。明示的に指定しない限り、その点ですか? –

+0

@LewsTherin - それを無視しているわけではありません。単に「ショートカット」を指定しなかっただけです。 'using'ディレクティブが使われているので、その型への完全な"パス "を指定する必要はありません。必要に応じて完全なパスを使用して型にアクセスできますが、 'using'ディレクティブを使用するだけで、型を指定する必要がなくなります。 – Oded

+0

アセンブリへの参照の追加は、「このアセンブリからすべての型をロードするAppDomainを既定値に設定する "には、' using'ディレクティブを使用して、現在どのタイプが_visible_であるかをあなたのコードに伝えるだけです。 – Restuta

11

usingディレクティブは、2つの用途があります:あなたは、その名前空間内の型の使用を限定 する必要がないように、名前空間内の型を使用できるようにするに

を:

using System.Text;

名前空間または種類のエイリアスを作成するにはこの は、別名ディレクティブを使用して呼び出されます。

using Project = PC.MyCompany.Project;

http://msdn.microsoft.com/en-us/library/sf0df423.aspx

ただし、システムとSystem.Windows.Formはとにかく名前自体を介して接続されていないことに注意する必要があります。システムをインポート(使用)する場合は、このクラスのSystemアセンブリタイプを使用することを意味します。 実際に使用できるVisual Studioプロジェクトの参照セクションで指定した実際の参照です(これは型のショートカットであるため、文を使用しなくても)。

+0

+1。良い点 - C#では名前空間をアセンブリ間で分割できるため、プロジェクトで他のアセンブリをインポートしていない(またはインポートしたい)可能性があります。 – TrueWill

+0

私はちょうど私がどれほど混乱しているかを理解しました。 私はインポートを使用して混乱し続けますか?そして、私はそれらが異なるものでなければならないと仮定します.. C#はクラスを全くインポートしませんか?私はC++とJavaを知っています。 –

+1

@LewsTherin - .NETでは、 "インポートする"タイプを含むアセンブリに_reference_を追加します。 – Oded

4

C#はネストされた名前空間をインポートしません。これは設計によるものです。

名前空間スコープでコードを整理し、 グローバルに一意の型を作成する方法を提供します。

ネストされた名前空間は、関連する機能をグループ化するために使用されますが、必要に応じてその一部を使用します。

Systemのような大きな名前空間のすべてのタイプを必要としない場合は、必要なのはSystem.Windowsです。

おそらく、なぜC#にJavaのようにusing System.*;のようなものがないのでしょうか。答えは分かりませんが、これはKISSの原則のためです。それはあなたが追加されますと、それらがどのように既存のコードに影響を与えるどのような種類を知ることはありません

select *

を使用してのようなものです。

1

でもJavaで明示的にあなたがネストされた名前空間のすべてを望んでいない時間の

import System.*; 

多くを書く必要があるだろう。これらは単にIntelliSenseを混乱させるでしょう。

0

"使用する"という名前空間は、実装されているすべての定義にアクセスすることを意味します。に直接埋め込み名前空間をルックアップするわけではありません。それ以外の場合は、 "Using"ステートメントの目的を無効にします。

クラス名のあいまいさを避けるために名前空間があります。 "Using"ステートメントは、あいまい性がない(またはほとんどない)ことが分かっているときに、名前空間にネストされた完全修飾型を使用しないようにするためのものです。

1

"using"構文を使用すると、既にプロジェクト設定でReferencesとしてリストされている名前空間に簡単にアクセスできます。名前空間が参照としてリストされている場合は、すでに "using"ディレクティブがないフルネームでアクセスできます。ちょうどキーストロークを保存します。

0

いいえ、これは動作しません。

私はあなたが言ったことに対して良い議論をするでしょう:intellisnseは夢中になり、あなたが望むものが地獄になるのを見つけるでしょう。

usingキーワードはすべてのネームスペースのすべてにアクセスできます。usingキーワードは、クラスまたは構造体がどのクラスから来ているかを指定する必要がないため、簡略化しています(定義済みです) 。

+0

私はエディタの選択肢に基づいてフィーチャーを作成しません(例:インテリセンス付き)。私は、最も簡単なエディタ(例えば:notepad.exe)を念頭に置いて機能を設計します。 –

+0

エディタに依存しないように、私はコンパイラにも同様の議論をすることができます:コンパイルは、ローカルで定義されていないすべてのものについて、モジュールごとにすべてのサブツリーをチェックインする必要があるあなたが使う。困難で無駄なことを超えて、これは多くの名前の衝突を引き起こす可能性があります。 –

関連する問題