2 回答

TA貢獻1946條經驗 獲得超4個贊
C#中的類是利用命名空間組織起來的。命名空間提供了一種從邏輯上組織類的方式,防止命名沖突。
命名空間聲明
用namespace 關鍵字用于聲明一個命名空間。此命名空間范圍允許您組織代碼并為您提供了創建全局唯一類型的方法。
namespace name
{
類型定義
}
其中:在命名空間中,可以聲明類、接口、結構、枚舉、委托 命名空間。
如果未顯式聲明命名空間,則會創建默認命名空間。該默認的命名空間(有時稱為全局命名空間)。全局命名空間中的任何標識符都可用于命名的命名空間中。
命名空間聲明可以作為頂級聲明出現在編譯單元中,當命名空間聲明作為頂級聲明出現在編譯單元中時,該命名空間成為全局命名空間的一個成員。
命名空間聲明出現在另一個命名空間聲明內時,該內部命名空間就成為包含著它的外部命名空間的一個成員。
無論是何種情況,一個命名空間的名稱在它所屬的命名空間內必須是唯一的。命名空間隱式地為 public,而且在命名空間的聲明中不能包含任何訪問修飾符。
嵌套的命名空間
命名空間聲明中聲明命名空間,各命名空間用”.”分隔。
例如:
namespace N1.N2
{
class A {}
class B {}
}
在語義上等效于
namespace N1
{
namespace N2
{
class A {}
class B {}
}
}
引用類
引用一個類可以用完全限定名來限定引用類(類名前加上命名空間名),以防止命名沖突。
using 指令來導入其他命名空間和類型的名稱,直接地而不是通過限定名來引用它們。
Using指令
using 別名指令為一個命名空間或類型啟用一個別名。
using 命名空間指令用于導入一個命名空間的類型成員。
(1) using 命名空間指令將一個命名空間中所包含的類型導入到編譯單元或命名空間體中,從而可以直接使用這些被導入的類型的標識符而不必加上它們的限定名。
如:
namespace N1.N2
{
class A {}
}
namespace N3
{
using N1.N2;
class B
{
public static void Main()
{
A a=new A();
}
}
}
上面的示例中,在 N3 命名空間中N1.N2 的類型成員是直接可用的,不需要完全限定名.
(2)using 命名空間指令導入包含在給定命名空間中的類型,但要注意,它不導入嵌套的命名空間。
示例:
namespace N1.N2
{
class A {}
}
namespace N3
{
using N1;
class B
{
public static void Main()
{
A a=new A(); //錯誤,N1.N2命名空間中的類型沒有導入到命名空間N3中
}
}
}
(3)using 命名空間指令導入的名稱會被編譯單元或命名空間體中具有相同名稱的成員所隱藏。
例如:
namespace N1.N2
{
class A {}
class B {}
}
namespace N3
{
using N1.N2;
class A {}//N3.A
}
在 N3 命名空間中的A類與N1.N2命名空間中的A類名稱相同,則N1.N2.A被N3.A隱藏,A 引用 N3.A 而不是 N1.N2.A。
(4)同一編譯單元或命名空間體中的 using 命名空間指令導入多個命名空間時,如果它們所包含的類型中有重名的,則直接引用該名稱就被認為是不明確的。
示例:
namespace N1
{
class A {}
}
namespace N2
{
class A {}
}
namespace N3
{
using N1;
using N2;
class B
{
public static void Main()
{
A a=new A()// 錯誤A類明確,要使用完全限定名
}
}
}
N1 和 N2 都包含一個成員 A,而由于 N3 將兩者都導入,所以在 N3 中引用 A 會導致一個編譯時錯誤名稱沖突.
using 別名指令用于為一個命名空間或類型指定一個別名。
using 標識符 = 命名空間或類型名稱 ;
例如:
namespace N1.N2
{
class A {}
}
namespace N3
{
using A = N1.N2.A;
class B: A {}
}
上面的示例中,在 N3 命名空間中,A 是 N1.N2.A 的別名,因此類 N3.B 從類 N1.N2.A 派生。通過為 N1.N2 創建別名 R 然后引用 R.A 可以得到同樣的效果:
namespace N3
{
using R = N1.N2;
class B: R.A {}
}
using 別名指令中的別名在直接包含該 using 別名指令的編譯單元或命名空間的聲明空間內必須是唯一的。例如:
namespace N3
{
class A {}
}
namespace N3
{
using A = N1.N2.A; // 錯誤,命名沖突
}
上例中,N3 已包含了成員 A,因此 using 別名指令使用 A 作標識符會導致一個編譯時錯誤。
- 2 回答
- 0 關注
- 854 瀏覽
添加回答
舉報