2011-02-15 104 views
2

我一直在想這個,但從來不明白爲什麼。爲什麼C#不需要名稱空間或完整名稱空間(完全限定名稱)?

簡單的例子:

public IEnumerator<Effect> GetEnumerator () 
{ 
    return this.Effects.GetEnumerator (); 
} 

System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator () 
{ 
    return this.GetEnumerator (); 
} 

爲什麼你必須指定:

System.Collections.IEnumerator

但不只是:

Collections.IEnumerator

我我不是說這樣比較好,但對我來說似乎是這樣逐步解決衝突的方法。

因爲有時候會有相當深的嵌套類型,所以如果由於碰撞而必須鍵入完整名稱會感覺不好,而不是僅僅使用包含它的直接名稱空間來加前綴,以便編譯器可以嘗試在當前導入/使用的名稱空間。

另外,當我第一次啓動C#時,我總是發現自己這樣做,認爲這是如何工作的。看看其他人對C#有什麼新鮮感會很酷,以前從未使用過命名空間概念。

回答

1

因爲是using System.*;

沒有這樣的事情這會工作:

namespace System 
{ 

    /*System.*/Collections.IEnumerator GetEnumerator () 
    { 
     return this.GetEnumerator (); 
    } 


} 

但你應該輕輕地添加任何東西到System

+0

非常感謝Henk,我希望它像你用「使用System。*;」所說的那樣。這是一個請求的功能?另外我不能做你的例子,如果我的類型必須在另一個名稱空間,對不對? – 2011-02-15 22:49:39

2

using System.Collections; 

然後,你可以寫短形式Collections.IEnumerator

+0

是的,對於這個例子你可以這樣做,但我的意思是要求有碰撞類型的人,比如你不能導入兩個命名空間,所以必須是完全限定的但是在想,你可以省去一些頂級命名空間從碰撞類型。 – 2011-02-15 22:41:30

3

我覺得富呸想說的是:

using Collections = System.Collections; 

注意,對於這一個正確的位置位於命名空間和類之外,如下所示:

namespace MyNamespace 
{ 
    using SysCollections = System.Collections; 

    public class MyClass 
    { 
     SysCollections.ArrayList mySampleField; 
    } 
} 

我打算使用SysCollections來顯示該別名命名沒有限制。

此外,請注意using System正是您所需的「使用System。*」。

所以,這個工作,這是大多數人會做:

using System; 

namespace MyNamespace 
{ 
    public class MyClass 
    { 
     Collections.ArrayList mySampleField; 
    } 
} 
相關問題