2016-07-29 34 views
25

わかりましたので、私はC#と.NET上で本を読んでいると、DateTime構造体と、次のコードについて学びながら:System.Collectionsは「システム名前空間の名前空間」ですか?

DateTime dt = new DateTime(2015, 10, 17); 

私は「なぜ私はそれを参照する必要はありませんでした自分自身を尋ねました上に書いてusing System.DateTime "と書く?

DateTimeは構造体であり、型を参照するために "using"キーワードが使用されていることに気がつきました(typeは、set {class、interface、structure、enumeration、delegate}のメンバーを参照する一般的な用語です) )、特定の名前空間で定義されています(この場合、DateTimeはSystem Namespaceの型構造です)。

しかし、私は(私はC#コンソールアプリケーションを作成したとき、彼らは自動的にそこに置かれた)私のファイルの先頭に、以下のusingディレクティブが検出されたことに気づいた:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

私はなぜusingディレクティブを思っていましたusing Systemに従う必要がありました。それらはすべてSystem名前空間の下にないので、すでに参照されているはずです。

set {class、interface、structure、enumeration、delegate}のタイプではなく、の名前空間であるため、その下に宣言されているものがすべてあるためです。しかし、それを "名前空間システムの名前空間(または名前空間システムに属している)"と呼ぶのは間違いでしょうか?もしそうなら、暗黙的にusing Systemに含まれているのではなく、名前空間の名前空間を明示的に参照しなければならない理由は何ですか?

私の質問がはっきりしていることを希望しますが、そうでない場合は私に教えてください。

+1

誤解を明確にするために、あなたの例で使用するものはすべての名前空間です。この構文を使ってクラス(または構造体)を持つことはないので、 'using System.DateTime'のようなことは決してありません。 https://msdn.microsoft.com/en-us/library/sf0df423.aspxに記載されている 'using'を使う他の方法もあります。名前解決の観点からは、構造体やクラス(とインタフェースや他の何かを考えることができます)はすべて同じように動作します。 – Chris

答えて

24

内部的には、すべての.netタイプは常にフルタイプの名前を持ちます。

System.DateTime 
System.Collections.Generic.Dictionary<string, int> 
System.Threading.Tasks.Task 

「使用する」とは、「目に見えないもの」を 'の前のすべてに参照させるものです。キャラクター。ですから、

DateTime 

を書くときだけは(System.DateTimeを)存在しているのでC#は

System.DateTime 
System.Collections.Generic.DateTime 
System.Linq.DateTime 
System.Text.DateTime 
etc... 

をしようと、それは明確な試合だし、C#のは、あなたが何を言ってるのか知っています。

2つの一致があった場合、あいまいさに関するコンパイルエラーが発生します。したがって、System.Threading.Task.DateTimeの場合、プログラムはコンパイルされません。

すべてこれはあなたの質問に対する回答の場面を設定します。

using System; 

が含まれている場合は、すべてがあいまいでないことを確認するのが難しくなります。あなたは2つの理論のクラス

System.WebPages.Button 
System.Desktop.Button 

を区別したい場合たとえば、その後、昔ながらのusing Systemnew Button()で素晴らしいプレーではないでしょう。

3

その理由は、でない場合、特定の状況で望ましくない名前の衝突を避けることができないからです。たとえば、BazFoo名前空間にあり、BazFoo.Bar名前空間にある場合は、常にタイプを完全修飾する必要があります。 Foo.BazまたはFoo.Bar.Bazをコード内に挿入すると、usingディレクティブが無意味になります。

あなたのタイプを含む両方の名前空間に実際にusingディレクティブがある場合、名前の衝突に対処する必要があります。

1

名前空間を指定せずに名前空間内の型を使用するusingディレクティブを作成します。 usingディレクティブでは、指定した名前空間にネストされている名前空間にアクセスすることはできません。

私はコードを使用しない場合、私はプロジェクト名\コード\のDBFILESように私のフォルダ構造の名前空間原因を割り当てられていたときに https://msdn.microsoft.com/en-us/library/sf0df423.aspx

から同じことが起こります。私のコントローラの1つでは、DBFilesのクラスにアクセスできないため、すべてのクラス名スペースをルート名前空間に設定しています。

2

他のディレクティブを使用する必要はありません。新しいリストを作成するには

System.Collections.Generic.List<String> listOfStrings = new System.Collections.Generic.List<String>; 

が、usingステートメントを使用すると、単にそれを宣言することができます:あなたがリストを望んでいた場合、あなたは自分のコード内で宣言することができ

List<String> listOfStrings = new List<String>; 

あなたができない理由のみで、後者の操作を行います。システムと呼ばれるリスト内のクラスだけでなく、System.Collections.GenericでListクラスがあるかもしれないので、

using System; 

です。もしそうなら、新しいリストオブジェクトを作成するとき、どのListクラスを参照しているのかはどのように分かりますか?

これは基本的に名前の競合を防ぎ、プログラマが物事を論理的に名前のついたグループにグループ化するために使用されます。入力と出力に関連するクラスはSystem.IOにあります