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

字號(hào):

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