假設沒有static關鍵字,那意味著需要用生成乙個例項後才可以呼叫這個main方法,而main方法是程式入口點,你沒有進入main方法,自然無法生成乙個例項,既然沒有例項,那就無法呼叫main函式,豈不矛盾?所以main函式被設定為static.
main()函式在c#裡非常特殊,它是編譯器規定的所有可執行程式的入口點。由於其特殊性,對main()函式我們有以下幾條準則:
main()函式必須封裝在類或結構裡來提供可執行程式的入口點。c#採用了完全的物件導向的程式設計方式,c#中不可以有像c++那樣的全域性函式。
main()函式必須為靜態函式(static)。這允許c#不必建立例項物件即可執行程式。
main()函式保護級別沒有特殊要求, public,protected,private等都可,但一般我們都指定其為public。
main()函式名的第乙個字母要大寫,否則將不具有入口點的語義。c#是大小寫敏感的語言。
main()函式的引數只有兩種引數形式:無引數和string 陣列表示的命令列引數,即static
void main()或static void main(stringargs) ,後者接受命令行引數。乙個c#程式中只能有乙個main()函式入口點。其他形式的引數不具有入口點語義,c#不推薦通過其他引數形式過載main()函式,這會引起編譯警告。
main()函式返回值只能為void(無型別)或int(整數型別)。其他形式的返回值不具有入口點語義。
在c#中,static變數表示該變數屬於類,而不是類的例項。"static"修飾符宣告乙個靜態元素,而該元素屬於型別本身而不是指定的物件,可以說是該類的所有例項共享乙個static變數。
看看什麼是 static class 吧,剛開始我就為不能宣告乙個 abstract sealed class
而苦惱不已,abstract 和 sealed一起用?定義abstract的目的就是抽象基類,seal表示不能繼承的實體類,完全是兩回事,怎麼可能一起用呢?abstract表明必須要被繼承,sealed表明不可以被繼承,這兩個是矛盾的,怎麼可以一起用呢。
通過檢視 il **,我們會發現 static class 實際上就是 abstract sealed class,
只不過編譯器在編譯時順便對 static class 的成員修飾符進行檢查而已。讓我們再來猜測一下 ms 開發人員的想法:他們的目的是想獲得 abstract sealed class 的效果,但卻為語義上的矛盾而苦惱不已,大家想獲得乙個優美的解決方式,於是就為 c 2.0 新增了乙個 static 關鍵字,完美的解決了這個問題。
也許有人會問:為什麼不是 static class = abstract class + static member limit
而要加上 sealed 的限制呢?理由是繼承乙個只有 static 成員的類和重新寫乙個類完
全沒有區別。為什麼這麼說呢?因為 static 必然是not virtual,繼承它又能有什麼
用呢?static class 還有乙個限制,那就是只能從 system.object 繼承,為什麼會有這個限
制,理由和上面差不多。
每每提到 static 關鍵字,我就想起了 static constructor,感謝 ms 的開發人員提
const與 readonly的區別 const==static readonly
const 的概念就是乙個包含不能修改的值的變數。
常數表示式是在編譯時可被完全計算的表示式。因此不能從乙個變數中提取的值來初始化常量。如果 const int a = b+1;b是乙個變數,顯然不能再編譯時就計算出結果,所以常量是不可以用變數來初始化的。
readonly 允許把乙個字段設定成常量,但可以執行一些運算,可以確定它的初始值。
因為 readonly 是在計算時執行的,當然它可以用某些變數初始化。
readonly 是例項成員,所以不同的例項可以有不同的常量值,這使readonly更靈活。
readonly 關鍵字與 const 關鍵字不同。
1. const 字段只能在該字段的宣告中初始化。
readonly 字段可以在宣告或建構函式中初始化。因此,根據所使用的建構函式,readonly 字段可能具有不同的值。
2. const 欄位是編譯時常數,而 readonly 欄位可用於執行時常數。
3. const 預設就是靜態的,而 readonly 如果設定成靜態的就必須顯示宣告。
4.const 對於引用型別的常數,可能的值只能是 string 和 null。
readonly可以是任何型別
非靜態成員又稱例項成員,必須作用於例項。在程式剛開始執行的時候,未建立任何例項,因此無法呼叫例項成員,包括非靜態的main方法。為了能夠在程式的開始執行main方法,必須將其宣告為靜態。
順便說明,在main方法中呼叫的成員也必須是靜態的,除非建立過相應的例項。
例如:namespace lover_p.test // 例項成員(非靜態)
public static void staticmethod {} // 型別成員(靜態)
public static void main() {
instancemethod(); // 錯誤!呼叫了例項成員,而此時並沒有建立例項
staticmethod(); // 正確!可以呼叫靜態成員
test sometest = new test(); // 建立本型別的乙個例項
sometest.instancemethod(); // 再在這個例項上呼叫例項成員就對了
sometest.staticmethod(); // 附加一句,在例項上呼叫靜態成員也是錯誤的!
C 中 ain函式為什麼要static
假設沒有static關鍵字,那意味著需要用生成乙個例項後才可以呼叫這個 ain方法,而 ain方法是程式入口點,你沒有進入 ain方法,自然無法生成乙個例項,既然沒有例項,那就無法呼叫 ain函式,豈不矛盾?所以 ain函式被設定為static.main 函式在c 裡非常特殊,它是編譯器規定的所有可...
C 類的執行緒函式為什麼要加static修飾
首先看下面這個類 class cmytest void main threadfun lpvoid 為什麼要加static修飾呢!原來非靜態成員函式都會在引數列表中加上乙個this指標為為引數,這樣的話你寫的執行緒函式就不符合呼叫規定了.比如 dword winapi threadfun lpvoi...
為什麼要設定損失函式
以數字識別任務為例,我們想獲得的是能提高識別精度的引數,特意再匯入乙個損失函式不是有些重複勞動嗎?也就是說,既然我們的目標是獲得使識別精度盡可能高的神經網路,那不是應該把識別精度作為指標嗎?在神經網路的學習中,尋找最優引數 權重和偏置 時,要尋找使損失函式的值盡可能小的引數。為了找到使損失函式的值盡...