none
vb.net Shared vs static , 兩者有何不同? RRS feed

  • 一般討論

  • 查過了一些討論, 仍然搞不清 vb.net 的 shared vs static 的分別

    http://read.newbooks.com.cn/info/195804.html

    上文指的 variable Number, 都不會有自己 instance 的 value, 而是跟隨不同的狀況下而改變, 即使其實體(instance)已是 null, Number 仍會維持其最新狀態。而 2 者亦可不 create instance 下, 直接用 className.Number 的方式存取..

     

    還有, C#只有 static, 沒有 shared 的, 這個 c# 的 static 和 vb.net 的

    1) static 是一樣的嗎?

    2) shared 是一樣的嗎?

     

    真是很混亂, 請指教



    2011年4月4日 下午 04:23

所有回覆

  • 1.

    在 VB 中一直有 Static ,這表示靜態變數,也就是說只要執行檔沒關,這個變數記憶體位置不變,適用在模組或靜態方法中,需要保留的變數內容,而不為全域變數。

    例如呼叫該函數的次數。

    早期在 VC 中的變數都是靜態變數,所以使用前須要先設定初值為 0 。

     

    2.

    靜態方法,使用靜態方法的類別無須宣告即可使用,但與動態方法的記憶體空間並不共享。適合用在函數的設計上。我印象中 VBNET 的 Module 就會編譯成這樣的類別,要再去反組譯看一次。

     

    註:

    1. http://msdn.microsoft.com/zh-tw/library/z2cty7t8.aspx

    2. http://msdn.microsoft.com/zh-tw/library/zc2b427x.aspx


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年4月4日 下午 05:08
  • 用來宣告變數或方法, VB.NET的shared等於C#的static
    2011年4月5日 上午 11:49
  • 1.

    在 VB 中一直有 Static ,這表示靜態變數,也就是說只要執行檔沒關,這個變數記憶體位置不變,適用在模組或靜態方法中,需要保留的變數內容,而不為全域變數。

    例如呼叫該函數的次數。

    早期在 VC 中的變數都是靜態變數,所以使用前須要先設定初值為 0 。

     

    2.

    靜態方法,使用靜態方法的類別無須宣告即可使用,但與動態方法的記憶體空間並不共享。適合用在函數的設計上。我印象中 VBNET 的 Module 就會編譯成這樣的類別,要再去反組譯看一次。

     

    註:

    1. http://msdn.microsoft.com/zh-tw/library/z2cty7t8.aspx

    2. http://msdn.microsoft.com/zh-tw/library/zc2b427x.aspx


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    你在 2) 中所講的 "與動態方法的記憶體空間並不共享" , 其實是怎樣? 即是用 ClassName.Number來改變 variable "Number" 後, 如果再用 dim a as ClassName = new ClassName; a.Number 不會有改變?

     

    如果以 java 來講,  2 者的改變都會反映在 Number 上。

    我始終領悟不到 shared 及 static 之間的分別, 可不可以寫一段小小的程式碼解釋一下呢?

    2011年4月5日 下午 04:59
  • VB 的 shared 就是 C# 和 Java 的 static...

    所謂的記憶體空間不共享的意思,是 static 有自己的記憶體位置 (在程式被啟動時就已存在),動態方法則是在物件被 new 出來時才會被配置到記憶體中,因此 static 方法不會知道目前物件中的各種資料,也就是說就算 Page 中有 static 方法,在 static 方法中的程式也無法存取在 Page 中的非 static 成員(方法,屬性,變數),因為它們根本不知道 Page 的非 static 成員在呼叫時是否真的存在,所以 compiler 會在編譯時期就檢查這個限制。

    而你的例子是變數存取,和心冷所提的 static 和非 static 成員的記憶體空間使用不同。


    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/pages/StudyAzurecom-yun-duan-xue-tang/155855707799579
    2011年4月6日 上午 12:50
    版主
  • VB 的 shared 就是 C# 和 Java 的 static...

    所謂的記憶體空間不共享的意思,是 static 有自己的記憶體位置 (在程式被啟動時就已存在),動態方法則是在物件被 new 出來時才會被配置到記憶體中,因此 static 方法不會知道目前物件中的各種資料,也就是說就算 Page 中有 static 方法,在 static 方法中的程式也無法存取在 Page 中的非 static 成員(方法,屬性,變數),因為它們根本不知道 Page 的非 static 成員在呼叫時是否真的存在,所以 compiler 會在編譯時期就檢查這個限制。

    而你的例子是變數存取,和心冷所提的 static 和非 static 成員的記憶體空間使用不同。


    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/pages/StudyAzurecom-yun-duan-xue-tang/155855707799579

    你說的和 Java 中的 static 是一致的!

    但我的問題是 vb.net 有 static 及  shared 2 種訪問權, 兩者有何不同?

    2011年4月14日 下午 04:13
  • C#的 static嚴格來說和VB.Net的 Shared算是一樣的.

    VB.Net中的Static是有點特別的, 因為在C#恐怕沒有可對應的對象.

    其實我覺得MSDN的說明很清楚[Static (Visual Basic)], 主要就是 <您只能在區域變數上使用 Static>

    然後這個關鍵詞會使得變數有一個很奇妙的行為, 它並不會像一般的區域變數在每次進入程式區塊都會初始化, 也就是它在值的保持這一點是靜態的.



    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年4月14日 下午 05:11
    版主
  • 想一個 file 寫作所有 class, 及所有共用的 variables

    然後在各 winForm 都可訪問


    2011年4月16日 上午 04:11
  • C#的 static嚴格來說和VB.Net的 Shared算是一樣的.

    VB.Net中的Static是有點特別的, 因為在C#恐怕沒有可對應的對象.

    其實我覺得MSDN的說明很清楚[Static (Visual Basic)], 主要就是 <您只能在區域變數上使用 Static>

    然後這個關鍵詞會使得變數有一個很奇妙的行為, 它並不會像一般的區域變數在每次進入程式區塊都會初始化, 也就是它在值的保持這一點是靜態的.



    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
     
    據小弟再翻閱資料, static 在 vb.net 內的角色和其他語有少許分別, 它可用在方法內, 這點有點特別, 而 shared 卻只可用在 module 內, 不可用在其他項目內
    2011年4月16日 上午 04:17
  • 用靜態類別、靜態屬性
    2011年4月16日 上午 06:18
    2011年4月17日 上午 11:13
  • ... Shared 我就有用在 Class 內...

    VBNET 的 Module 是偷雞,編譯時做成全域的 Class Shared 。 

     

    前面有講:在 VB 中一直有 Static ,這表示靜態變數,

    這個宣告是從 QB 一路繼承下來的。

    你沒用過傳統編譯器,所以你不知道這要幹嘛。

    以前除了 QB/VB6 相容版本 是採用動態記憶體,其他編譯器多半是編譯時,記憶體位置就定了, .Net framework 基本上依據 VB 的動態記憶體來處理,所以連整個固定長度字串都沒有了。

     


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年4月18日 下午 01:16
  • 您可以參考這個範例:What would be considered a VB.NET module in C#?

    始終有多少不同

     

    vb.net module, 任何在程序中的 win forms 也可訪問

    如果在 c#, 要怎樣才可實現同樣功能?

    再者, static 內的 member 會隨著程序的訪問而改變, 例如

    private static i;

    有可能 i 會變成 5, 8, 15 ... 除非每次用它時也 reset 成原始值

    相反, vb 的 module 內的 class 是不會的



    2011年5月13日 下午 05:24
  • 自訂一個全域的類別,在裡面裝入 static 函數,功能就和 VB Module 相同了。

    依你說的 case,你可以用 static function 來控制變數,而不是直接用 static 變數,不當使用 static 變數會讓程式很難維護。

    VB Module 沒事還是少用為妙,因為它不是 OO 的標準功能,而是由 VB6 直接拉上來的 ... 


    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/pages/StudyAzurecom-yun-duan-xue-tang/155855707799579
    2011年5月14日 上午 12:00
    版主
  • 自訂一個全域的類別,在裡面裝入 static 函數,功能就和 VB Module 相同了。

    依你說的 case,你可以用 static function 來控制變數,而不是直接用 static 變數,不當使用 static 變數會讓程式很難維護。

    VB Module 沒事還是少用為妙,因為它不是 OO 的標準功能,而是由 VB6 直接拉上來的 ... 


    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/pages/StudyAzurecom-yun-duan-xue-tang/155855707799579

    vb.net 的 module 可置放 Class, 亦即我可寫很多 Class 在 module 內供所有 win form 使用

    但 C# 如何做到呢? 是否在任一 win form 內, 將想供給全個程序使用的 class 都加上 public 便可?  可否寫一個簡單的例子給我呢?

     



    2011年5月14日 下午 04:59
  • C# 沒有 module 這種東西,前面都已經說過了。
    C# 只有類別,將類別成員設為 static 就可以供專案內所有的程式使用,這我也講過了。

    VB module 內放 Class,和 C# 的 Class 是完全相同,如果你沒用 static 宣告,就一定要建立該類別的執行個體才可以用。

    你前面說 shared 只能用在 module 內,根本是錯的,VB 的 class 也可以使用 shared,這篇文章不知你有沒有細讀過:http://msdn.microsoft.com/zh-tw/library/zc2b427x(v=VS.80).aspx

    C# 的 static:http://msdn.microsoft.com/zh-tw/library/98f28cdx(v=vs.80).aspx

    而且你說 "不行",你寫出來所謂 "不行" 的程式碼呢? 


    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/pages/StudyAzurecom-yun-duan-xue-tang/155855707799579
    2011年5月15日 上午 01:00
    版主