namespace
namespace 關鍵字用於聲明一個範圍。此命名空間範圍允許您組織代碼並為您提供了建立全域唯一類型的方法:
- 命名空間名可以是任何合法的標識符。命名空間名可以包含句號。
- 即使未顯式聲明命名空間,也會建立預設命名空間。該未命名的命名空間(有時稱為全域命名空間)存在於每一個檔案中。全域命名空間中的任何標識符都可用於命名的命名空間中。
- 命名空間隱式具有公用訪問權,並且這是不可修改的。
- 在兩個或更多的聲明中定義一個命名空間是可以的。如在同一個檔案中分別將兩個類定義為
MyCompany
命名空間的一部分:
- // keywords_namespace.cs
namespace Hunts.Test
{
class MyClass1
{
//
}
}
namespace Hunts.Test
{
class MyClass2
{
//
}
}
樣本:(略)
using
using 關鍵字有兩個主要用途:
- 作為指令,用於為命名空間建立別名或匯入其他命名空間中定義的類型。
using namespace;
using alias = type|namespace;
// Type:您想通過 alias 表示的類型。
這種做法可以用於處理在同時引用包含了相同名稱的類的命名空間,並需要使用而引發的衝突。(見樣本1)
// namespace:您想通過 alias 表示的命名空間。或者是一個命名空間,它包含您想在無需指定完全限定名的情況下使用的類型。
- 作為語句,用於定義一個範圍,在此範圍的末尾將釋放對象。
- Font myFont = new Font("Arial", 10.0f);
using (myFont)
{
// use myFont
}
樣本:
- 下面的樣本顯示了如何為類定義 using 指令和 using 別名:
- // using 關鍵字
// keywords_using.cs
using System;
namespace N1
{
class A
{
public void Test()
{
//
}
}
}
namespace N2
{
class A
{
public void Test()
{
//
}
}
}
namespace Hunts.Keywords
{
// 一般做法
//using N1;
//using N2;
using type1 = N1.A;
using type2 = N2.A;
class App
{
static void Main()
{
// 一般做法
// N1.A c1 = new N1.A();
// N2.A c2 = new N2.A();
type1 t1 = new type1();
type2 t2 = new type2();
//
}
}
}
注意:
- C# 通過 .NET Framework 公用語言運行庫 (CLR) 來自動釋放用來儲存不再需要的對象的記憶體。記憶體的釋放具有不確定性;一旦 CLR 決定執行記憶體回收,就會釋放記憶體。但是,通常最好儘快釋放諸如檔案控制代碼和網路連接這樣的有限資源。
- using 語句允許程式員指定使用資源的對象應當何時釋放資源。為 using 語句提供的對象必須實現 IDisposable 介面。此介面提供了 Dispose 方法,該方法將釋放此對象的資源。
- 可以在到達 using 語句的末尾時,或者在該語句結束之前引發了異常並且控制權離開語句塊時,退出 using 語句。
外部別名
有時可能有必要引用具有相同完全限定類型名的程式集的兩個版本,例如當需要在同一應用程式中使用程式集的兩個或更多的版本時。通過使用外部程式集別名,來自每個程式集的命名空間可以在由別名命名的根層級命名空間內封裝,從而可在同一檔案中使用。
- 若要引用兩個具有相同完全限定類型名的程式集,必須在命令列上指定別名,如下所示:
/r:N1=a1.dll
/r:N2=a2.dll
- 這將建立外部別名
N1
和 N2
。若要從程式中使用這些別名,則使用 extern 關鍵字引用它們。例如:
extern alias N1;
extern alias N2;
每一個外部別名聲明都引入一個額外的根層級命名空間,它與全域命名空間平行,而不是在全域命名空間內。因此,來自每個程式集的類型就可以通過各自的、根源於適當的名空間別名的完全限定名來引用,而不會產生多義性。
樣本:
比如有程式集a1.dll:
// Assembly a1.dll:
namespace N
{
public class A {}
public class B {}
}
再引用程式集a2.dll:
Assembly a2.dll:
namespace N
{
public class B {}
public class C {}
}
那麼以下的程式就會出錯:
class Test
{
N.A a; // Ok
N.B b; // Error
N.C c; // Ok
}
然後使用匯入外部別名的方法就可以解決這個問題:
// 先在命令列執行csc /r:X=a1.dll /r:Y=a2.dll test.cs
// 匯入外部別名
extern alias X;
extern alias Y;
class Test
{
// 使用::從別名中使用真實的命名空間
X::N.A a;
X::N.B b1;
Y::N.B b2;
Y::N.C c;
}
本篇內容參考MSDN文檔。 |
本Blog中所有內容皆以“現狀”提供且沒有任何擔保,同時也沒有授予任何權利。 This posting is provided "AS IS" with no warranties, and confers no rights. |