C#系列 --6 namespace 名稱空間
表示式
- if switch
- 三元操作符 ?:
- while do…while for foreach
switch:
static void ShowCard (int cardNumber) { switch (cardNumber) { case 13: Console.WriteLine ("King"); break; case 12: Console.WriteLine ("Queen"); break; case 11: Console.WriteLine ("Jack"); break; case -1: // Joker is -1 goto case 12; // In this game joker counts as queen default: // Executes for any other cardNumber Console.WriteLine (cardNumber); break; } }
在每個case語句的末尾,需要明確給出程式下一步的執行情況,否則將順序的執行下去,此時需要使用一些跳轉語句。以下是一些常見的選擇:
break
跳出switch語句goto case x
跳到另一個case語句goto default
調到default語句- 另外一些跳轉語句宣告:
return, throw, continue, goto label
當多個case執行同一條語句時,可以順序的將各種case羅列出來,這個和c++相同:
switch (cardNumber) { case 13: case 12: case 11: Console.WriteLine ("Face card"); break; default: Console.WriteLine ("Plain card"); break; }
for,while, do-while
和 C++相同,主要講以下foreach
foreach
從頭到尾迭代迴圈可列舉型別中的每一個元素。在C#和.NET框架中,表示元素集合或列表的大多數型別都是可列舉的,比如陣列和字串。
foreach (char c in "beer")
Console.WriteLine(c);
Jump statements 跳轉語句
- break
- continue
- goto
- return
- throw
goto
goto 語句會將程式執行轉移到語句塊的另一個標籤中。
形式:goto statement-label;
或者與switch
語句一起使用,
goto case case-constant; // (Only works with constants, not patterns)
int i = 1;
startLoop:
if (i <= 5)
{
Console.Write (i + " ");
i++;
goto startLoop;
}
throw
丟擲異常時使用
Namespaces 名稱空間
這個地方需要知道,因為在大多數程式碼工程中,作者都會定義很多名稱空間
這個名稱空間和C++中的差不多,
名稱空間是型別(type)名稱的域。型別通常被組織成層次化的名稱空間,使它們更容易查詢和避免衝突。比如RSA ,存在於下列的名稱空間中:
System.Security.Cryptography
想用呼叫RSA型別,需要使用完整的名稱空間才能引用,
比如:呼叫RSA的create() 方法
System.Security.Cryptography.RSA rsa =
System.Security.Cryptography.RSA.Create();
注意:
- 名稱空間獨立於程式集(assemblies),程式集是部署單元,比如.exe 和 .dll檔案
- 名稱空間不會影響成員的可見性: public, private, protected, internal
namespace為程式塊中的型別定義了一個新的名稱空間,
比如:
namespace Outer.Middle.Inner
{
class Class1 {}
class Class2 {}
}
namespace中的點(dot .)表示巢狀名稱空間的層次結構,比如上述程式碼與下列程式碼等效:
namespace Outer
{
namespace Middle
{
namespace Inner
{
class Class1 {}
class Class2 {}
}
}
}
可以使用全限定名(fully qualified name)來引用一個型別, 即包含從外到內的namespace,
例如引用Class1需要使用:uter.Middle.Inner.Class1
那些沒有定義在任何名稱空間,據說存在於global
的名稱空間中。global namespace也包含頂級的名稱空間,比如在我們例子中的Outer
using 關鍵字
using指令會引入(import)一個名稱空間,能允許你不用通過全限定名使用型別。
如下列的程式碼:
using Outer.Middle.Inner;
class Test
{
static void Main()
{
Class1 c; // Don't need fully qualified name
}
}
注意:在不同的名稱空間裡定義相同的型別名稱是合法的,但不建議這樣做。
Rules Within a Namespace 名稱空間中的一些規則
Name scoping
在外部名稱空間中定義的型別,可以在內部名稱空間中使用,而不需要使用限定名。
比如在Inner名稱空間中引用Outer中的Class1型別,不需要使用限定名。
namespace Outer
{
class Class1 {}
namespace Inner
{
// Class2 繼承於 Class1
class Class2 : Class1 {}
}
}
引用同一名稱空間內不同分支名稱空間內的型別,可以使用部分限定名。
比如MyTradingCompany下有ManagementReporting和Common兩個名稱空間,
在ManagementReporting中引用Common中的ReportBase,可以使用部分限定名:Common.ReportBase
namespace MyTradingCompany
{
namespace Common
{
class ReportBase {}
}
namespace ManagementReporting
{
class SalesReport : Common.ReportBase {}
}
}
Name hiding 名稱遮蔽
如果在內部和外部命名空間出現相同的型別名字,內部的型別名會遮蔽掉外部的型別名。如果想引用外部的型別名,需要使用限定名來指定。
namespace Outer
{
class Foo { }
namespace Inner
{
class Foo { }
class Test
{
//遮蔽掉了Outer.Foo
Foo f1; // = Outer.Inner.Foo
// 使用 Outer.Foo來指定使用外部的型別名
Outer.Foo f2; // = Outer.Foo
}
}
}
注意:在編譯時所有的型別名都會被編譯為全限定名
Repeated namespaces 重複的名稱空間
只要名稱空間中的型別名稱不同,完全可以定義相同的名稱空間
namespace Outer.Middle.Inner
{
class Class1 {}
}
namespace Outer.Middle.Inner
{
class Class2 {}
}
Nested using directive
在名稱空間中使用usig關鍵字後,可以在此名稱空間中使用using引入的所有的型別名,而不需要使用限定名。但是在其他的名稱空間,即使名稱空間相同,也不能直接使用。
比如下面的例子:
namespace N1
{
class Class1 {}
}
namespace N2
{
using N1;
class Class2 : Class1 {}
}
namespace N2
{
class Class3 : Class1 {} // Compile-time error
}
Aliasing Types and Namespaces 別名型別和名稱空間
有時,引入名稱空間會導致型別名衝突,比如在兩個名稱空間中有相同的型別名。這時,可以不用引進全部的名稱空間,而只是引入特定的型別名,並賦予一個簡單的別名(alias),之後可以通過別名引用引入的型別名。
例如:
using PropertyInfo2 = System.Reflection.PropertyInfo;
class Program { PropertyInfo2 p; }