假設(shè)沒(méi)有static關(guān)鍵字,那意味著需要用生成一個(gè)實(shí)例后才可以調(diào)用這個(gè)main方法,而main方法是程序入口點(diǎn),你沒(méi)有進(jìn)入main方法,自然無(wú)法生成一個(gè)實(shí)例,既然沒(méi)有實(shí)例,那就無(wú)法調(diào)用main函數(shù),豈不矛盾?所以main函數(shù)被設(shè)置為static.
成都創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括永寧網(wǎng)站建設(shè)、永寧網(wǎng)站制作、永寧網(wǎng)頁(yè)制作以及永寧網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,永寧網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到永寧省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!Main()函數(shù)在C#里非常特殊,它是編譯器規(guī)定的所有可執(zhí)行程序的入口點(diǎn)。由于其特殊性,對(duì)Main()函數(shù)我們有以下幾條準(zhǔn)則:
Main()函數(shù)必須封裝在類或結(jié)構(gòu)里來(lái)提供可執(zhí)行程序的入口點(diǎn)。C#采用了完全的面向?qū)ο蟮木幊谭绞剑珻#中不可以有像C++那樣的全局函數(shù)。
Main()函數(shù)必須為靜態(tài)函數(shù)(static)。這允許C#不必創(chuàng)建實(shí)例對(duì)象即可運(yùn)行程序。
Main()函數(shù)保護(hù)級(jí)別沒(méi)有特殊要求, public,protected,private等都可,但一般我們都指定其為public。
Main()函數(shù)名的第一個(gè)字母要大寫,否則將不具有入口點(diǎn)的語(yǔ)義。C#是大小寫敏感的語(yǔ)言。
Main()函數(shù)的參數(shù)只有兩種參數(shù)形式:無(wú)參數(shù)和string 數(shù)組表示的命令行參數(shù),即static
void Main()或static void Main(string[]args) ,后者接受命令行參數(shù)。一個(gè)C#程序中只能有一個(gè)Main()函數(shù)入口點(diǎn)。其他形式的參數(shù)不具有入口點(diǎn)語(yǔ)義,C#不推薦通過(guò)其他參數(shù)形式重載Main()函數(shù),這會(huì)引起編譯警告。
Main()函數(shù)返回值只能為void(無(wú)類型)或int(整數(shù)類型)。其他形式的返回值不具有入口點(diǎn)語(yǔ)義。
在C#中,static變量表示該變量屬于類,而不是類的實(shí)例。"static"修飾符聲明一個(gè)靜態(tài)元素,而該元素屬于類型本身而不是指定的對(duì)象,可以說(shuō)是該類的所有實(shí)例共享一個(gè)static變量。
看看什么是 static class 吧,剛開始我就為不能聲明一個(gè) abstract sealed class
而苦惱不已,abstract 和 sealed一起用?定義abstract的目的就是抽象基類,seal表示不能繼承的實(shí)體類,完全是兩回事,怎么可能一起用呢?abstract表明必須要被繼承,sealed表明不可以被繼承,這兩個(gè)是矛盾的,怎么可以一起用呢。
通過(guò)查看 IL 代碼,我們會(huì)發(fā)現(xiàn) static class 實(shí)際上就是 abstract sealed class,
只不過(guò)編譯器在編譯時(shí)順便對(duì) static class 的成員修飾符進(jìn)行檢查而已。讓我們?cè)賮?lái)猜測(cè)一下 MS 開發(fā)人員的想法:他們的目的是想獲得 abstract sealed class 的效果,但卻為語(yǔ)義上的矛盾而苦惱不已,大家想獲得一個(gè)優(yōu)美的解決方式,于是就為 C 2.0 新增了一個(gè) static 關(guān)鍵字,完美的解決了這個(gè)問(wèn)題。
也許有人會(huì)問(wèn):為什么不是 static class = abstract class + static member limit
而要加上 sealed 的限制呢?理由是繼承一個(gè)只有 static 成員的類和重新寫一個(gè)類完
全沒(méi)有區(qū)別。為什么這么說(shuō)呢?因?yàn)?static 必然是not virtual,繼承它又能有什么
用呢?
static class 還有一個(gè)限制,那就是只能從 System.Object 繼承,為什么會(huì)有這個(gè)限
制,理由和上面差不多。
每每提到 static 關(guān)鍵字,我就想起了 static constructor,感謝 MS 的開發(fā)人員提
供了這么好的一個(gè)特性。但是 C 提供了 static constructor 卻沒(méi)有提供static destructor,不過(guò)在 Applied Microsoft .NET Framework Programming 一書中
Jeffery Richter 給我們提供了一個(gè)辦法就是通過(guò) System.AppDomain.DomainUnload
事件去達(dá)到同樣的效果。使用 static constructor 要注意的就是這里拋出任何異常都會(huì)導(dǎo)致該類型在重新加載AppDoamin 之前不再可用,所以要加倍小心,另外 static contructor 中很容易有兩個(gè)類型死鎖的情況發(fā)生,在編寫代碼的時(shí)候一定要想清楚。
const與 readonly的區(qū)別 const==static readonly
const 的概念就是一個(gè)包含不能修改的值的變量。
常數(shù)表達(dá)式是在編譯時(shí)可被完全計(jì)算的表達(dá)式。因此不能從一個(gè)變量中提取的值來(lái)初始化常量。如果 const int a = b+1;b是一個(gè)變量,顯然不能再編譯時(shí)就計(jì)算出結(jié)果,所以常量是不可以用變量來(lái)初始化的。
readonly 允許把一個(gè)字段設(shè)置成常量,但可以執(zhí)行一些運(yùn)算,可以確定它的初始值。
因?yàn)?readonly 是在計(jì)算時(shí)執(zhí)行的,當(dāng)然它可以用某些變量初始化。
readonly 是實(shí)例成員,所以不同的實(shí)例可以有不同的常量值,這使readonly更靈活。
readonly 關(guān)鍵字與 const 關(guān)鍵字不同。
1. const 字段只能在該字段的聲明中初始化。
readonly 字段可以在聲明或構(gòu)造函數(shù)中初始化。因此,根據(jù)所使用的構(gòu)造函數(shù),readonly 字段可能具有不同的值。
2. const 字段是編譯時(shí)常數(shù),而 readonly 字段可用于運(yùn)行時(shí)常數(shù)。
3. const 默認(rèn)就是靜態(tài)的,而 readonly 如果設(shè)置成靜態(tài)的就必須顯示聲明。
4.const 對(duì)于引用類型的常數(shù),可能的值只能是 string 和 null。
readonly可以是任何類型
----------------------------
非靜態(tài)成員又稱實(shí)例成員,必須作用于實(shí)例。在程序剛開始運(yùn)行的時(shí)候,未建立任何實(shí)例,因此無(wú)法調(diào)用實(shí)例成員,包括非靜態(tài)的Main方法。為了能夠在程序的開始執(zhí)行Main方法,必須將其聲明為靜態(tài)。
順便說(shuō)明,在Main方法中調(diào)用的成員也必須是靜態(tài)的,除非建立過(guò)相應(yīng)的實(shí)例。
例如:
namespace lover_P.Test {
public class Test {
public void InstanceMethod() {} // 實(shí)例成員(非靜態(tài))
public static void StaticMethod {} // 類型成員(靜態(tài))
public static void Main() {
InstanceMethod(); // 錯(cuò)誤!調(diào)用了實(shí)例成員,而此時(shí)并沒(méi)有建立實(shí)例
StaticMethod(); // 正確!可以調(diào)用靜態(tài)成員
Test SomeTest = new Test(); // 建立本類型的一個(gè)實(shí)例
SomeTest.InstanceMethod(); // 再在這個(gè)實(shí)例上調(diào)用實(shí)例成員就對(duì)了
SomeTest.StaticMethod(); // 附加一句,在實(shí)例上調(diào)用靜態(tài)成員也是錯(cuò)誤的!
}
}
}
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。