none
static與副程式的關係 RRS feed

  • 問題

  • static void Mysub(ref int x,.....}

    {....}

    各位大大好:我是C#新手,我找很多書,以及翻遍 MSDN 都沒有談及副程式與static 的關係,因此想請大大告知,副程式加 static 的用途是什麼。

    謝謝各位,也許問題很無知,但請見諒。


    • 已編輯 170 2013年1月24日 下午 03:14
    2013年1月24日 下午 03:12

解答

  • static要比較的,通常應該是跟this做比較。

    也就是static跟instance做比較。

    簡單的說,static宣告的東西,是掛在class type底下。非static宣告的東西,則是掛在instance底下,也就是要透過建構式來建立該class的instance後,掛在那個instance上的。

    所以static在程序一起來的時候,就會存在,因為它基本上是跟著type走的,而type是一開始就都要建立的東西。也要等到process結束,它才會消失。

    而因為跟著type的memory走,type在系統中只有一份,所以static也只有一份。因此可以當做整個process的全域變數來用,只是要透過 「型別」.「方法/參數/屬性」。

    例如Convert上面的方法,很多就都是static的方法。

    至於void,應該是拿來跟有回傳值的function做比對。void就只是沒回傳值的function。

    簡單的說,這兩個東西八竿子打不著。唯一打的著的,就是他們可以放在一起。


    授人以魚,三餐之需;授人以漁,終生之用。
    希望各位發問的朋友,得到的是如何釣魚的知識。之後也可以分享給別人,釣魚的知識。而不是肚子餓了,就上來討魚吃。

    若您的程式碼有SQL injection的問題,在修改完畢之前,我不願意給您任何解答。因為解決了您的程式問題,造成更大的系統漏洞問題,還不如讓程式壞掉。

    請參考:SQL injection簡介與解決方式

    常用資源參考:


    小弟的blog: In 91,wiki: my wiki

    2013年1月25日 上午 09:09

所有回覆

  • http://msdn.microsoft.com/zh-tw/library/6tcf2h8w.aspx

    連結一路點進去看。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2013年1月24日 下午 03:29
  • 感謝大大的指導,這篇說明我看過多次了,但始終無法理解副程式為何要宣告成靜態成員,其目的是什麼?

    若以VB來看宣告靜態變數,可使變數只初始化一次,因此副程式結束執行之後變數可以保留變數值。 應用在C#的副程式上會產生什麼效果呢。

    謝謝

    • 已編輯 170 2013年1月25日 上午 12:40
    2013年1月25日 上午 12:39
  • 書有沒有很多,我是不知道,但「翻遍 MSDN」…不知道全世界有幾個人做的到?

    要不要先說說你翻了那些書與MSDN說起。


    理直氣和,切記。

    KingKong Bruce記事: http://blog.kkbruce.net

    2013年1月25日 上午 01:52
  • 您好,
    MSDN的說明:
    為了示範靜態成員,以代表公司員工的類別為例。假設此類別包含一方法來計算員工人數和一個欄位來儲存員工人數。
    此方法和欄位不屬於任何執行個體員工。相反的,他們屬於公司類別。因此,他們應該宣告成類別的靜態成員。
    網路上有些人的看法您也可以參考看看哦:
    Should I use static function in c# where many calls the same func? 

    另外,小弟在開發上,Helper的Method大都是用static的!

    希望對您有幫助,謝謝!



    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    • 已編輯 亂馬客 2013年1月25日 上午 01:56
    2013年1月25日 上午 01:54
  • 這問題不容易簡單解釋, 如果你真的有興趣,讀懂以下這本書, 會有你要的解答

    CLR via C#, 4th Edition

    補充一下:

    心冷大說 "連結一路點進去看"  , 我不曉得你有沒有做到.

    一路點進去你就會發現 "靜態類別和靜態類別成員 (C# 程式設計手冊) "


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2013年1月25日 上午 06:50
    版主
  • 感謝大大的指導,我為了弄清楚 static與副程式的關係,翻看了幾本書,也看了多次心冷大說 "連結一路點進去看" 的msdn說明,結果越看越迷糊。謝謝您的關心

    以我的認知,只要以void型別宣告副程式,如 void MySub(int X) 即可,而static void MySub(int X)將副程式宣告成靜態成員有何用途?是不是要將MySub當成類別供其它程序使用?

    謝謝關心問題的大大們

    2013年1月25日 上午 08:28
  • 以靜態方法來說, 通常與類別成員無關的公開方法, 比較傾向於使用靜態宣告.

    所以這扯到一件事是你可能得先弄熟物件導向的一些基本原理, 會比較容易體會是怎麼設計的.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2013年1月25日 上午 08:56
    版主
  • static要比較的,通常應該是跟this做比較。

    也就是static跟instance做比較。

    簡單的說,static宣告的東西,是掛在class type底下。非static宣告的東西,則是掛在instance底下,也就是要透過建構式來建立該class的instance後,掛在那個instance上的。

    所以static在程序一起來的時候,就會存在,因為它基本上是跟著type走的,而type是一開始就都要建立的東西。也要等到process結束,它才會消失。

    而因為跟著type的memory走,type在系統中只有一份,所以static也只有一份。因此可以當做整個process的全域變數來用,只是要透過 「型別」.「方法/參數/屬性」。

    例如Convert上面的方法,很多就都是static的方法。

    至於void,應該是拿來跟有回傳值的function做比對。void就只是沒回傳值的function。

    簡單的說,這兩個東西八竿子打不著。唯一打的著的,就是他們可以放在一起。


    授人以魚,三餐之需;授人以漁,終生之用。
    希望各位發問的朋友,得到的是如何釣魚的知識。之後也可以分享給別人,釣魚的知識。而不是肚子餓了,就上來討魚吃。

    若您的程式碼有SQL injection的問題,在修改完畢之前,我不願意給您任何解答。因為解決了您的程式問題,造成更大的系統漏洞問題,還不如讓程式壞掉。

    請參考:SQL injection簡介與解決方式

    常用資源參考:


    小弟的blog: In 91,wiki: my wiki

    2013年1月25日 上午 09:09
  • 即然你說翻遍 MSDN 也找不到答案,那我想你的問題應該是什麼時候用靜態方法,而不是靜態方法怎麼用。

    幫你找答案:One rule-of-thumb: ask yourself "does it make sense to call this method, even if no Obj has been constructed yet?" If so, it should definitely be static.

    Ref:Java: when to use static methods  

    當然還有其他情境、理由可能會用靜態方法,例如:方便使用(不用每個呼叫端都建立執行個體)、多執行緒程式、正確使用可以節省系統資源等等。

    事實上,整個系統都不使用靜態方法也做的出來,但是靜態方法若用的好,程式看起來就簡潔、效能也會好。至於怎麼叫用的好、如何用的適切,那就需要練習和經驗了。


    獅子


    • 已編輯 Leo Shih 2013年1月25日 上午 09:16 改錯字
    2013年1月25日 上午 09:16
  • 以 .Net 的內建函數來說,Sin / cos / abs 都是 Math 的靜態方法。

    以人為例,驗證性別的方法不受個體變化而改變,則可宣告為靜態,性別因人而異,則為人這個物件的屬性或方法。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2013年1月25日 上午 11:45
  • 感謝諸位大大不吝指教,小弟感謝了。

    綜觀各位大大的說明,我約略知道static宣告的物件是掛在class type底下,因此是要建立可當型別使用的物件。所以, 如果跟程序放在一起使用,例如static void MySub(int X) {...},可讓在這個程序內宣告的變數,以型別方法使用,也因此如果程序無須以類別方式使用,就不用加static,而只要編寫void MySub(int X)即可。

    這樣的想法不知對否。

    目前91大大的說明最接近我想知道的,謝謝啦,大家都辛苦了。



    • 已編輯 170 2013年1月25日 下午 01:42
    2013年1月25日 下午 01:35