全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:19324
推到 Plurk!
推到 Facebook!

C# 如何宣告讓多個 Form 都能看到的 GLOBAL 變數

答題得分者是:shunchia63
digitraveler
初階會員


發表:89
回覆:91
積分:46
註冊:2005-06-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-06-05 17:27:46 IP:211.21.xxx.xxx 訂閱
在 bcb 中
同一 Project 裏
Form1 中宣告 int g ,
而在 Form2 中宣告 extern int g; ,
Form3 中也宣告 extern int g;

則 Form1-Form3 都可讀到這個相同的 int g;

但是在 c# 中呢 ?? 如何在一個 Project 裏宣告讓多個 Form 都能看到的 GLOBAL 變數 ? 謝謝大家
shunchia63
高階會員


發表:26
回覆:141
積分:198
註冊:2007-05-22

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-06-05 23:22:23 IP:61.64.xxx.xxx 訂閱


static
digitraveler
初階會員


發表:89
回覆:91
積分:46
註冊:2005-06-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-06-06 22:49:27 IP:122.123.xxx.xxx 訂閱

===================引 用 shunchia63 文 章===================


static?


大郭是說
Form1 中宣告 static int g ,
而在 Form2 中宣告 static int g; ,
Form3 中也宣告 static int g;

大家就可以讀到同一郭 g 變數 ?
shunchia63
高階會員


發表:26
回覆:141
積分:198
註冊:2007-05-22

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-06-06 23:09:34 IP:61.64.xxx.xxx 訂閱
<textarea class="c#" rows="10" cols="60" name="code"> test1.cs testStatic.i = 10; testStatic.i = 20; test2.cs My.MyFunction.ShowMessage(testStatic.i.ToString()); <--i =20 testStatic.cs using System; using System.Collections.Generic; using System.Text; namespace WindowsApplication1 { class testStatic { public static int i=0; } } </textarea> 覺得你應該先買本物件導項的書,不然會很困惑
fPhoenix
一般會員


發表:0
回覆:20
積分:19
註冊:2005-08-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-06-07 14:45:44 IP:220.229.xxx.xxx 訂閱
.NET沒有全域變數這種東西,所以替代的方法可以使用static成員,不過這樣的共用變數方式不是很好,應該考慮其他的替代方法。
digitraveler
初階會員


發表:89
回覆:91
積分:46
註冊:2005-06-01

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-06-10 16:39:55 IP:122.123.xxx.xxx 訂閱

===================引 用 fPhoenix 文 章===================
.NET沒有全域變數這種東西,所以替代的方法可以使用static成員,不過這樣的共用變數方式不是很好,應該考慮其他的替代方法。


小弟公司開發的軟體業別需要在隨時隨地知道一組狀態,然後決定當下的程式流程,這一組狀態就把它放在global 變數中,在程式的任何地方任何Form 都要隨時能調出這組 global 狀態值,所以才有 global 變數的需求 , 至於這樣的使用法到底好不好,由於小弟剛接觸 C#,實在想不出別種調用 GLOBAL 的方法 , 還望前輩指導 , 3Q
fPhoenix
一般會員


發表:0
回覆:20
積分:19
註冊:2005-08-11

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-06-11 20:22:55 IP:219.69.xxx.xxx 訂閱
這種需求使用singleton模式吧,用簡單的就行了,
以下的做法需要使用C# 2.0

1. 建立一個靜態類別。
2. 建立靜態建構子,初始化所需要的靜態成員。
3. 提供存取方法。
4. 在各執行個體以類別名稱叫用。

如果有資源搶奪的問題再繼續複雜化模型。
digitraveler
初階會員


發表:89
回覆:91
積分:46
註冊:2005-06-01

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-06-17 02:24:09 IP:122.123.xxx.xxx 訂閱

===================引 用 fPhoenix 文 章===================
這種需求使用singleton模式吧,用簡單的就行了,
以下的做法需要使用C# 2.0

1. 建立一個靜態類別。
2. 建立靜態建構子,初始化所需要的靜態成員。
3. 提供存取方法。
4. 在各執行個體以類別名稱叫用。

如果有資源搶奪的問題再繼續複雜化模型。



想請問大哥,這類的方法我常看到
不過我的 global 有兩百個左右
放在類別中, 一個初始化程序再加上兩個存取方法程序
200個 global , 大約需要 600 個程序
我真的不知道這種作法好在哪裡 , 又安全在哪裡 ?
只覺得畫蛇添足

class g
{

//var1 變數用這種方法建立 (我覺得是畫蛇添足法)
private static string tmpvar = "";
public static string var1
{
get
{
return tmpvar;
}
set
{
tmpvar = value;
}
}

//var2 變數用這種方法建立
public static string var2;

}


//使用時沒覺得兩種方法建立的變數用起來有啥差別
private void button1_Click(object sender, System.EventArgs e)
{
var_init(); //我習慣在 FormLoad 時用一個 var_init() 函式來 init 所有 global 後再使用

g.var1="123";
g.var2="456";
.......
.......
}

//我習慣用一個 var_init() 函式來 init 所有變數
private void var_init();
{
g.var1="";
g.var2="";
.......
.......
.......

}

fPhoenix
一般會員


發表:0
回覆:20
積分:19
註冊:2005-08-11

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-06-17 17:37:00 IP:219.69.xxx.xxx 訂閱
使用前先呼叫var_init()?那不就變成每次使用前都會先重置變數,這樣的話,是不是考慮將其變為區域變數會比較好。
全域變數兩百個的話,建立的靜態成員也可以是兩百個,只要你使用公開的欄位即可。
digitraveler
初階會員


發表:89
回覆:91
積分:46
註冊:2005-06-01

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-06-17 21:06:24 IP:122.123.xxx.xxx 訂閱

===================引 用 fPhoenix 文 章===================
使用前先呼叫var_init()?那不就變成每次使用前都會先重置變數,這樣的話,是不是考慮將其變為區域變數會比較好。
全域變數兩百個的話,建立的靜態成員也可以是兩百個,只要你使用公開的欄位即可。


可是我不想多寫那 200 個 get {} set {} ..... 還有 , 我還要幫這 200 個全域變數 建立 200 個內部變數 (給 get{}... set{} 使用)
想到就好累 , 前提是前述的 var2 的建立方法既然可用 , 那為何要用那畫蛇添足的 var1 建立方法 ?? (真的不懂)

init_var() 只放在 Form_Load 用一次 , 是我例子舉的不好
另外我沒詳述的是有些變數的初始值並不是 null 或 0
有可能是從 INI 檔中取出 (這如何寫在類別中??)
所以根據我的經驗法則 , 我把所有 GLOBAL 初始方法放在一個類似 var_init() 的自寫函式中
我可以完全掌控 GLOBAL 的初始值 , 有些變數 init 後是 null 或 0 , 有些則是從 INI 檔重抓 (像是交易序號 , 掛號號碼等等)

fPhoenix
一般會員


發表:0
回覆:20
積分:19
註冊:2005-08-11

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-06-17 21:33:46 IP:219.69.xxx.xxx 訂閱
<textarea class="c#" rows="10" cols="60" name="code"> public static Global { public static 成員型別 Member; public static 成員型別 Member2; static Global() { // 初始化的程式碼 } } </textarea> 使用的時候,直接var = Global.Member;或者是Global.Member = var; 這樣0.0
digitraveler
初階會員


發表:89
回覆:91
積分:46
註冊:2005-06-01

發送簡訊給我
#12 引用回覆 回覆 發表時間:2007-06-20 20:38:26 IP:122.123.xxx.xxx 訂閱

===================引 用 fPhoenix 文 章===================
<textarea class="c#" rows="10" cols="60" name="code">public static Global { ????public static 成員型別 Member; ????public static 成員型別 Member2; ????static Global() ????{ ????????// 初始化的程式碼 ????} } </textarea> 使用的時候,直接var = Global.Member;或者是Global.Member = var; 這樣0.0




感謝大哥
可是....這樣不就是我原先說的 var2 的宣告方法 (不用一堆 get ..set) ??
另外,我還是習慣將初始化寫在外部 function 中
不喜歡寫在 class 內部
fPhoenix
一般會員


發表:0
回覆:20
積分:19
註冊:2005-08-11

發送簡訊給我
#13 引用回覆 回覆 發表時間:2007-06-20 21:08:05 IP:219.69.xxx.xxx 訂閱
選擇你喜歡的就好。
系統時間:2024-12-04 2:01:14
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!