1. 程式人生 > >C#系列 --6 namespace 名稱空間

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; }