C#基礎(chǔ)C#的聲明詳細介紹

字號:

一、什么是聲明
    在我們編程的時候,經(jīng)常要使用一些常量和變量,告訴編譯器那些是常量,那些是變量,都是些什么常量或變量的一個過程,就是我們常說的聲明,其中也就包括我們?yōu)槌A亢妥兞俊叭∶帧薄?BR>    考試大示列:
    int i;
    表示說,我們告訴編譯器說,我這里要用一個“數(shù)字”的變量,它的名字叫“i”。
    另外,編程里還有個名詞叫“定義”,就是指為“聲明”出來的變量/常量的“名字”,如上面的“i”分配一個內(nèi)存空間。
    -------思多雅[天行健]版權(quán)所有,首發(fā)太平洋論論壇,轉(zhuǎn)載請注明-------
    二、C#的聲明
    C#程序中的聲明定義了程序的重要聲明。C#程序用名稱空間來組織,它可以包含類型聲明和嵌套聲明。類型聲明用來定義類、結(jié)構(gòu)、接口、聯(lián)合和代表。在類型定義中被允許的的成員種類要根據(jù)類型聲明的形式?jīng)Q定。例如,類的聲明可以包含實例構(gòu)造函數(shù)、析構(gòu)函數(shù)、靜態(tài)構(gòu)造函數(shù)、常數(shù)、域、方法、屬性、事件、索引、操作符和嵌套類型。
    一個聲明在聲明所屬的聲明域定義了一個名稱。除了重載構(gòu)造函數(shù)、方法、索引和操作符名稱,在一個聲明域中有兩個或更多介紹有相同名稱成員的聲明時,是錯誤的。對一個聲明域中,包含有相同名稱的不同種類成員是永遠不可能的。例如,一個聲明域中不能包括有相同名稱的域和方法。
    這里有許多種不同類型的聲明域,如下所示。
    * 在所有程序的源文件中,不包括嵌套名稱空間聲明的名稱空間成員聲明都是一個單獨的組合聲明域,稱為全局聲明域。
    * 在所有程序的源文件中,名稱空間成員聲明和有相同完整正確的名稱空間名稱的名稱空間聲明都是一個單獨的組合聲明域。
    * 每個類,結(jié)構(gòu)或接口聲明都會創(chuàng)建一個新的聲明域。名稱通過類成員聲明、結(jié)構(gòu)成員什么或接口成員聲明介紹到這個聲明域中。除了重載構(gòu)造函數(shù)聲明和靜態(tài)構(gòu)造函數(shù)聲明,一個類或結(jié)構(gòu)成員聲明不能引入與類或結(jié)構(gòu)名稱相同的成員。一個類,結(jié)構(gòu)或接口允許方法和索引的重載。此外,一個類或結(jié)構(gòu)允許構(gòu)造函數(shù)和操作符的重載聲明。例如,一個類、結(jié)構(gòu)或接口可能會包含多個用相同名稱聲明的方法,而在他們各自簽名中提供了不同的方法聲明。注意基類不影響類的聲明域。而基本接口不影響一個接口的聲明域。這樣,一個派生的類或接口可以用和繼承的成員相同的名稱聲明一個成員。這樣的一個成員被稱為隱藏了繼承的成員。
    * 每個枚舉聲明創(chuàng)建一個新的聲明域。名稱通過枚舉成員聲明介紹到聲明域中。
    * 每個塊或者轉(zhuǎn)換塊為局部變量創(chuàng)建一個分立聲明域。名稱通過局部變量聲明被引入到這個聲明域。
    如果一個塊是構(gòu)造函數(shù)或方法聲明的主體,在形參列表中聲明的參數(shù)是這個塊的局部變量聲明域的成員。塊的局部變量聲明域包括任何嵌套塊。因而,在一個嵌套塊中不太可能用與嵌套塊中的局部變量有相同名稱聲明一個局部變量。
    * 每個塊或轉(zhuǎn)換塊為標(biāo)簽創(chuàng)建一個分立的聲明域。名稱通過標(biāo)簽聲明被引入到這個聲明域,而名稱通過goto 聲明引入到這個聲明域。塊的局部變量聲明域包括任何嵌套塊。因而,在一個嵌套塊中不太可能用與嵌套塊中的標(biāo)簽相同名稱聲明一個標(biāo)簽。 在名稱被聲明的文本順序通常并不重要。特別是,文本順序?qū)τ诼暶骱褪褂妹Q空間、類型、常數(shù)、方法、屬性、事件、索引、操作符、構(gòu)造函數(shù)、析構(gòu)函數(shù)和靜態(tài)構(gòu)造函數(shù)來說并不重要。聲明順序在下面的途徑中才是重要的:
    * 域聲明和局部變量的聲明順序決定了他們的初始化是按什么順序執(zhí)行。
    * 局部變量必須在他們被使用前定義。
    * 當(dāng)常數(shù)表達式數(shù)值被忽略,枚舉成員聲明的聲明順序是重要的。
    Examda提示:名稱空間的聲明域是“開放的”,而兩個有相同的完全名稱的名稱空間聲明將放到相同的名稱空間空間中。例如
    namespace Megacorp.Data
    {
    class Customer
    {
    ...
    }
    }
    namespace Megacorp.Data
    {
    class Order
    {
    ...
    }
    }
    上面聲明的兩個名稱空間聲明捐獻到相同的聲明域,這里聲明了兩個有完全合格名稱的類Megacorp.Data.Customer 和Megacorp.Data.Order 。因為兩個聲明屬于相同的聲明域,如果每個都包含一個對相同名稱的類的聲明,就會產(chǎn)生錯誤。
    塊的聲明域包括任何嵌套塊。這樣,在下面的例子中,方法F 和G 有錯誤,因為名稱I 已經(jīng)在outer 塊中聲明了,就不能再在inner 塊中聲明。然而,由于兩個i 是在分立的非嵌套塊中聲明的,方法H 和I是有效的。
    class A
    {
    void F() {
    int i = 0;
    if (true) {
    int i = 1;
    }
    }
    void G() {
    if (true) {
    int i = 0;
    }
    int i = 1;
    }
    void H() {
    if (true) {
    int i = 0;
    }
    if (true) {
    int i = 1;
    }
    }
    void I() {
    for (int i = 0; i < 10; i++)
    H();
    for (int i = 0; i < 10; i++)
    H();
    }
    }
    三、小知識:
    1、C語言及C++的聲明
    相信熟悉C語言的人都知道,在C中如果要將一組不同類型的變量組合在一起使用就會用到struct關(guān)鍵字。與其想配合的還有一組函數(shù)供其調(diào)用,以實現(xiàn)該struct的不同功能。但是有一點,那就是所有這些函數(shù)對于該struct以外的變量也都是可見的,一樣可以調(diào)用這個函數(shù)。這樣是很不安全的,對于程序設(shè)計的模塊化也沒有什么好處。
    C++的聲明是在C語言的改進,C++的第一步就是將函數(shù)放到struct里面,作為“成員函數(shù)”。這樣就帶來了新的問題:各個struct中的函數(shù)可以重名,在定義這個函數(shù)時,需要完全指定它是哪一個。為了完成這個指定任務(wù), C + +有一個新的運算符: :,即范圍分解運算符(用來指定該函數(shù)的執(zhí)行范圍,即是哪個struct中的)。
    在C++中,將函數(shù)放進結(jié)構(gòu)中是對C的一種根本改變。在C 中,結(jié)構(gòu)是數(shù)據(jù)的凝聚,它將數(shù)據(jù)捆綁在一起,使得我們可以將它們看作一個包。但這除了能使程序設(shè)計方便之外,別無其他好處。這些結(jié)構(gòu)上的運算可以用在別處。然而將函數(shù)也放在這個包內(nèi),結(jié)構(gòu)就變成了新的創(chuàng)造物,它既能描述屬性(就像C中的struct 能做的一樣),又能描述行為,這就形成了對象的概念。對象是一個獨立的有約束的實體,有自己的記憶和活動。在C++ 中,對象只是一個變量,最純的定義是“存儲的一個區(qū)域”。它是能存放數(shù)據(jù)的空間,并隱含著還有在這些數(shù)據(jù)上的運算。將數(shù)據(jù)連同函數(shù)捆綁在一起,這一點就允許創(chuàng)建新的類型。這常常被稱為封裝。
    然而,我們會看到在對象上完成運算的方法有所不同。
    object.member_function(arglist)是對一個對象“調(diào)用一個成員函數(shù)”。而在面向?qū)ο蟮挠梅ㄖ校卜Q之為“向一個對象發(fā)送消息”。這樣,對于stash K,語句K.add(&i)“發(fā)送消息給K”,也就是說,“對自己add( )”。事實上,面向?qū)ο蟪绦蛟O(shè)計可以總結(jié)為一句話,“向?qū)ο蟀l(fā)送消息”。需要做的所有事情就是創(chuàng)建一束對象并且給它們發(fā)送消息。當(dāng)然,問題是勾畫出我們的對象和消息是什么,但如果完成了這些,C++ 的實現(xiàn)就直截了當(dāng)了。
    一個結(jié)構(gòu)的大小是它的所有成員大小的和。有時,當(dāng)一個struct 被編譯器處理時,會增加額外的字節(jié)以使得捆綁更整齊,這主要是為了提高執(zhí)行效率。
    另外,用sizeof可以計算出struct的內(nèi)存大小。
    下面我們來看看相應(yīng)的例子:
    //計算struct內(nèi)存
    #include
    struct A1
    {
    int i[100];
    };
    struct A2
    {
    void x();
    };
    void main(void)
    {
    printf(“size of struct A is %d\n”, sizeof(A1);
    printf(“size of struct B is %d\n”, sizeof(A2);
    }
    第一句printf會打印出200,而第二句則會打印出一個不確定的非零值。
    因為這個聲明這個在C中不合法,但是在C++中是合法的。
    你可以拿這個對比一下C#的聲明??纯从行┦裁床煌兀?