2014-04-19 203 views
0

我讀過這篇文章Global Variables Are Bad和我有一些問題:全局變量問題

認爲我有幾個變量,例如:

int loops 

這個變量應便於從代碼的任何地方,所以我有2種選擇:

  1. 定義我的主要形式,這裏面變量作爲全球
  2. 定義類:
public static class Loops 
{ 
    public static int loops {get; set;} 
} 

怎樣做正確的方式,什麼是兩者之間的區別是什麼?

回答

1

靜態類中的公共靜態變量就像您的舊全局變量。唯一的區別是你總是需要指定類名來訪問它的值。它在你的代碼的每個部分都有一個對包含該靜態類的程序集和名稱空間的引用。而這個變量只有一個值。

一個表單內的公共實例變量只有當你建立你的窗體的實例存在一個變量,它是從在同一形式的其他情況下的任何其他變量不同的變量

例如

public static class GlobalAppVariables 
{ 
    public static int loops {get; set;} 
    ...... 
} 
在你的項目或其他組件具有正確的參考定義裝配

for(int x = 0; x < GlobalAppVariables.loops; x++) 

,而不是與格洛的行吟詩人一部分

窗體類

public class MyForm : Form 
{ 
    public int loops {get; set;} 
} 

內BAL公共變量使用這個變量你需要的MyForm的類的實例,如果你有兩個實例,你有兩個不同的變量。

MyForm f = new MyForm(); 
f.loops = 15; 
for(int x = 0; x < f.loops; x++) 
    ...... 

MyForm f1 = new MyForm(); 
f1.loops = 100; 
..... 

從OOP的角度來看,對於每一個非平凡的程序,你應該儘量避免使用全局變量。但這是理論,在現實世界中有真正的約束(性能,開發時間,程序員的專業知識,任務性質和其他考慮因素),並不總是可以完全避免它們。

我的建議是將它們限制在一個很好理解的類中,並帶有明確的屬性支持字段,以便在未來發生變化時能夠保持最大的靈活性。當然,文檔在這裏起着關鍵的作用

+0

那麼你的建議?在新課堂還是在我的形式?問題是我有幾個變量(大約15),因此我認爲在我的表單中使用所有這些變量作爲全局變得很醜陋 – user3328870

+0

正如我在更新的答案中所說的那樣,這取決於。如果你不需要他們在表格外,那麼在表格內使他們全球化,但不公開。如果它們與你的表格代碼沒有嚴格關聯,那麼全球課程更可取。還取決於你如何設計你的代碼。通常用戶界面和底層邏輯之間的關注點是必須的。有一種形式應該從我所站的地方分享一些可變的氣味,但我不知道你的生意。 – Steve

+0

爲什麼不添加應用程序配置文件? – Andrew

0

這取決於我的朋友,似乎你的第一個選擇它不是全球性的,如果你想要在表單中的每一處使用,在這種情況下,表單將成爲你的上下文。在類中使用靜態變量(public和NOT嵌套類)是一個真正的全局變量,應該謹慎使用,並且有一個很好的目的。

0

您引用的文章適用於C++。在C++中,全局變量是在類之外聲明的變量。然而,在C#中,全局變量是在類中公開的變量(因爲變量不能存在於類或結構之外)。避免這些全局變量的等價物將是將它們聲明爲適用於getset訪問器的適當範圍的屬性。

0

聲明一個全局變量並不尊重任何OOP的基本原理;整個程序可以讀取它,也可以修改它(除非這是你想要的)。解決的辦法是做一個類與private static int loops {get; set;}

1

假設你有一個業務邏輯的項目,UI層會消耗它並有一個引用它。如果您的業務邏輯依賴於您的表單類中的loops,那麼您不僅不能添加循環引用,而且如果我們在此討論OOP,BL不直接依賴於UI。

如果您保留所有配置,例如Configuration類,但是更改它意味着重新編譯解決方案,第二個選項就夠用了。

Application Configuration File是去應用程序配置的正確方法:

  • 添加應用程序配置文件項項目(右鍵單擊項目>添加項目)。這將在您的項目中創建一個名爲app.config的文件。

  • 通過在<appSettings>標記內添加條目(如<add key="loops" value="10" />)來編輯該文件。

  • 添加到System.Configuration DLL的引用在您的項目,並使用ConfigurationManager 喜歡引用在配置中loops設置:

    ConfigurationManager.AppSettings["loops"]