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;
}
http://www.49028c.com/hunts/archive/2007/01/12/619008.html
新聞熱點
疑難解答